TheCarProject CMS SQl注入
字数 1283 2025-08-29 08:32:09
TheCarProject CMS SQL注入漏洞分析与防御指南
漏洞概述
TheCarProject CMS存在一个严重的SQL注入漏洞,攻击者可以通过构造恶意请求获取数据库敏感信息。该漏洞位于cp/info.php文件中,由于未对用户输入的car_id参数进行过滤和验证,导致攻击者可以执行任意SQL语句。
漏洞细节分析
漏洞位置
- 文件路径:
/TheCarProject/cp/info.php - 受影响参数:
man_id和car_id(GET方式传递)
漏洞成因
- 代码直接接收用户输入的
car_id参数并赋值给$motor_id变量 - 将未经过滤的
$motor_id直接拼接到SQL查询语句中 - 未使用单引号、双引号或反引号对参数进行包裹
- 未对参数进行任何消毒处理
漏洞验证POC
http://localhost/TheCarProject/cp/info.php?man_id=3&car_id=-1 or 1=1 and (SELECT 1 and ROW(1,1)>(SELECT COUNT(*),CONCAT(CHAR(95),CHAR(33),CHAR(64),CHAR(52),CHAR(100),CHAR(105),CHAR(108),CHAR(101),CHAR(109),CHAR(109),CHAR(97),0x3a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.COLLATIONS GROUP BY x)a)
POC解析
- 这是一个基于报错的SQL注入攻击
- 使用
FLOOR(RAND(0)*2)生成011011...序列 - 通过
GROUP BY操作触发临时表主键重复错误 - 错误信息中包含数据库版本等敏感信息
技术原理
- ROW函数:MySQL中的ROW函数用于构造行比较,
ROW(1,1)表示比较两列值 - 报错注入机制:利用临时表中主键值重复的错误来泄露信息
- CONCAT函数:将多个字符串连接成一个字符串,其中包含ASCII编码的字符
漏洞利用流程
- 识别注入点:
car_id参数未过滤 - 判断注入类型:数字型注入(无需引号闭合)
- 构造恶意SQL语句
- 通过错误信息获取数据库信息
- 利用回显点获取数据(
smtp_info.php接收数据)
代码审计要点
- 检查
info.php文件中$motor_id变量的使用 - 查找所有将
$motor_id拼接到SQL语句的位置(共3处) - 确认数据回显点:通过
mysqli_fetch_array获取结果并输出到隐藏表单 - 跟踪数据流向:
$cpr_image_single变量最终提交到smtp_info.php
修复方案
代码修复建议
if(isset($_GET['car_id'])) {
// 使用mysqli_real_escape_string过滤
$motor_id = mysqli_real_escape_string($_GET['car_id']);
// 或者使用PDO预处理
// $motor_id = PDO::quote($_GET['car_id']);
......
}
全面防护措施
-
输入验证:
- 对
car_id进行类型检查(应为数字) - 设置参数取值范围限制
- 对
-
输出编码:
- 从数据库读取数据时也应进行过滤处理
- 防止二次注入攻击
-
编码设置:
- 避免使用GBK等可能导致宽字节注入的编码
-
其他建议:
- 使用预处理语句(PDO或MySQLi)
- 实施最小权限原则
- 启用Web应用防火墙(WAF)
总结与经验
- 该漏洞是典型的数字型SQL注入案例
- 漏洞触发链较短,但危害严重
- 修复时应从输入验证和输出编码两方面入手
- 代码审计时需关注所有用户输入点的处理
- 安全开发应遵循"不信任任何用户输入"的原则
扩展学习
- MySQL行构造函数:深入理解ROW()函数的比较机制
- 报错注入技术:研究不同类型的报错注入方法
- 防御技术:学习参数化查询、ORM等安全编码实践
- 自动化检测:了解sqlmap等工具如何检测和利用此类漏洞
通过分析这个漏洞,我们可以更深入地理解SQL注入的原理、利用方式和防御方法,为今后的安全审计和开发工作提供参考。