某团购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强制类型转换
  • 存在未过滤参数的函数:GetDbRowByIdGetQueryResultGetField

敏感函数回溯审计

1. GetField函数

全局搜索未发现被引用,无利用价值。

2. GetQueryResult函数

多处调用,主要审计结果:

文件:/ajax/manage.php

  • 可通过$id变量注入
  • $id被强制类型转换,无法利用
  • 同文件中另一处调用也因id参数过滤而无法利用

文件:/manage/user/index.php

  • 同样存在intval参数过滤

文件:/manage/vote/feedback.php

  • $question['id']参数来自前一个查询结果
  • 理论上可二次注入,但id为系统生成,无法利用

3. GetDbRowById函数

未对参数过滤,存在注入风险。

调用链:
GetDbRowByIdinclude/library/Table.class.php中的_FetchFetchForce函数 → Fetch方法

FetchForce函数审计

可利用点1:/ajax/chargecard.php

  • 无需登录可直接访问
  • $actionquery时可触发
  • $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 防御建议

  1. 输入验证

    • 不信任任何用户输入
    • 严格过滤所有参数
    • 对整数参数使用intval强制转换
  2. 查询方式改进

    • 使用预编译语句(Prepared Statements)
    • 使用参数化查询
  3. 多层防御

    • 应用层过滤
    • 使用Web应用防火墙(WAF)
    • 数据库权限最小化
  4. 注意事项

    • 单一过滤策略可能被绕过,应采用多层防御
    • 参数过滤存在遗漏风险,需全面审计

0x04 代码审计方法论

  1. 敏感函数定位:全局搜索潜在危险函数
  2. 调用链分析:追踪函数调用关系
  3. 参数溯源:检查参数来源和过滤情况
  4. 利用条件验证:确认触发条件和可利用性
  5. 漏洞验证:通过实际测试确认漏洞存在

审计技巧:

  • 关注未过滤或过滤不完整的参数
  • 注意二次注入可能性
  • 识别无需认证的入口点
  • 针对不同过滤机制设计绕过方案
团购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 代码审计方法论 敏感函数定位 :全局搜索潜在危险函数 调用链分析 :追踪函数调用关系 参数溯源 :检查参数来源和过滤情况 利用条件验证 :确认触发条件和可利用性 漏洞验证 :通过实际测试确认漏洞存在 审计技巧: 关注未过滤或过滤不完整的参数 注意二次注入可能性 识别无需认证的入口点 针对不同过滤机制设计绕过方案