某团购CMS的SQL注入漏洞代码审计
字数 1655 2025-08-13 21:33:25
团购CMS SQL注入漏洞代码审计与分析
0x00 SQL注入漏洞概述
SQL注入漏洞是由于开发者盲目信任用户输入,未对用户提交的参数进行严格检查,导致恶意参数被拼接到SQL语句中,从而改变原有SQL逻辑的安全漏洞。
0x01 目标CMS简介
本次审计的CMS是一个基于PHP和MySQL的团购网站建设解决方案,版本为CV1.6,具有以下特点:
- B/S架构的Web应用
- 高效、快速、低成本的团购网站构建方案
- 采用PHP和MySQL技术开发
0x02 漏洞分析
数据库操作核心文件
CMS的SQL操作集中在include/library/DB.class.php文件中,该文件包含多个数据库操作函数。
过滤机制分析
- 部分函数使用
mysql_real_escape_string进行参数过滤 - 整数参数使用
intval强制类型转换 - 存在未过滤参数的函数:
GetDbRowById、GetQueryResult、GetField
敏感函数回溯审计
1. GetField函数
全局搜索未发现被引用,无利用价值。
2. GetQueryResult函数
多处调用,主要审计结果:
文件:/ajax/manage.php
- 可通过
$id变量注入 - 但
$id被强制类型转换,无法利用 - 同文件中另一处调用也因
id参数过滤而无法利用
文件:/manage/user/index.php
- 同样存在
intval参数过滤
文件:/manage/vote/feedback.php
$question['id']参数来自前一个查询结果- 理论上可二次注入,但id为系统生成,无法利用
3. GetDbRowById函数
未对参数过滤,存在注入风险。
调用链:
GetDbRowById → include/library/Table.class.php中的_Fetch和FetchForce函数 → Fetch方法
FetchForce函数审计
可利用点1:/ajax/chargecard.php
- 无需登录可直接访问
- 当
$action为query时可触发 $secret参数未过滤直接传入FetchForce- 注入特征:
- 存在空格等字符的正则匹配,可用
/**/代替空格 - 无回显,需使用时间盲注
- 示例payload:
secret=123' AND (SELECT * FROM (SELECT(SLEEP(5)))a)--
- 存在空格等字符的正则匹配,可用
可利用点2:同文件另一处注入
- 只需修改
$action参数即可触发
不可利用点示例:/ajax/manage.php
- 虽然调用
FetchForce,但id参数被强制转换
Fetch函数审计
可利用点1:/ajax/system.php
- 需要管理员权限
- 时间盲注示例payload:
参数名=1' AND (SELECT * FROM (SELECT(SLEEP(5)))a)--
可利用点2:/api/call.php
- 无需登录,前台可直接访问
- 多个参数存在注入漏洞
其他发现
- CMS密码使用固定字符串作为盐值进行MD5加密,解密存在困难
0x03 防御建议
-
输入验证:
- 不信任任何用户输入
- 严格过滤所有参数
- 对整数参数使用
intval强制转换
-
查询方式改进:
- 使用预编译语句(Prepared Statements)
- 使用参数化查询
-
多层防御:
- 应用层过滤
- 使用Web应用防火墙(WAF)
- 数据库权限最小化
-
注意事项:
- 单一过滤策略可能被绕过,应采用多层防御
- 参数过滤存在遗漏风险,需全面审计
0x04 代码审计方法论
- 敏感函数定位:全局搜索潜在危险函数
- 调用链分析:追踪函数调用关系
- 参数溯源:检查参数来源和过滤情况
- 利用条件验证:确认触发条件和可利用性
- 漏洞验证:通过实际测试确认漏洞存在
审计技巧:
- 关注未过滤或过滤不完整的参数
- 注意二次注入可能性
- 识别无需认证的入口点
- 针对不同过滤机制设计绕过方案