记录一次tp框架下的代码审计
字数 1221 2025-08-23 18:31:34

ThinkPHP框架代码审计实战教学文档

一、环境准备与踩坑记录

1.1 PHP环境配置

  • SG11扩展:必须安装SG11扩展,否则系统无法正常运行
  • PHP版本:确保使用兼容的PHP版本(文档未明确版本,建议5.6-7.4之间)

1.2 数据库配置

  1. 控制器域名设置

    • 本地开发时若不允许数字域名,需在web_domain表中添加记录
  2. 数据库监控配置

    • 修改数据库权限允许远程连接
    • 确保端口放行(通常3306)
    • 若监控工具无法连接,可启用MySQL通用查询日志:
      general_log = 1
      general_log_file = /tmp/fy.log
      

1.3 路由分析

  • 采用黑盒+白盒结合方式分析路由
  • 典型TP路由结构:app/目录/XXXController.php中的方法
  • 可通过抓包分析请求路径与控制器对应关系

二、SQL注入漏洞审计

2.1 漏洞原理

  • ThinkPHP中Db类的raw方法不会对SQL片段进行转义处理
  • 当开发者直接将用户输入拼接到raw语句中时,会导致SQL注入

2.2 漏洞点分析

2.2.1 OrderController.php漏洞

// app/user/OrderController.php
$orderData = post('orderData');
// ...
if ($orderData) {
    $where['raw'] = 'tb.order_id= "' . $orderData . '" or tb.order_value like "%';
}
  • 利用方式:通过orderData参数注入SQL
  • 修复建议:使用参数绑定或预处理语句

2.2.2 LayimController.php漏洞

// app/im/LayimController.php
public function getMessagePage() {
    // 需要type参数进入friend分支
}
  • 利用条件:需传入特定type参数触发漏洞路径

2.2.3 ChadanController.php漏洞

// app/index/chadan/ChadanController.php
public function queryOrderPage() {
    // 存在SQL注入
}

2.3 密码解密方法

$ssm4 = new SM4();
$keykey = "xiaoyewl";
$pass_sm4 = $_GET['pass'];
echo "明文密码是: ".$ssm4->decrypt($keykey,$pass_sm4);
  • 加密方式:SM4加密
  • 密钥xiaoyewl
  • 解密方法:直接调用SM4的decrypt方法

三、文件上传漏洞审计

3.1 VersionController.php漏洞

// 文件写入点
file_put_contents($path.$fileName, $content);
  • 漏洞位置:网站升级功能的压缩包解压处理
  • 利用方式
    1. 创建public目录
    2. 放入Webshell(建议使用冰蝎马绕过检测)
    3. 打包为升级包上传

3.2 常规上传防护分析

$fileExt = ['doc', 'docx', 'xls', 'xlsx', 'zip', ...];
$fileMime = ['application/msword', 'application/vnd.openxmlformats...', ...];
validate(['imgFile' => [
    'fileExt' => implode(",", $fileExt), 
    'fileMime' => $fileMime
]])->check(['imgFile' => $file]);
  • 防护措施
    • 白名单文件扩展名
    • MIME类型校验
  • 绕过难点:双重校验使常规Webshell难以直接上传

四、审计技巧总结

  1. 全局搜索关键函数

    • rawfile_put_contentspost/get
  2. 日志分析

    • 开启SQL日志观察实际执行的SQL语句
    • 对比代码与日志中的SQL差异
  3. 参数追踪

    • 从输入点(post/get)到最终使用点的完整路径
  4. 框架特性理解

    • 掌握ThinkPHP的数据库操作方式
    • 了解路由解析规则
  5. 加密解密分析

    • 定位加密函数调用点
    • 获取加密密钥(硬编码或配置)

五、防御建议

  1. SQL注入防御

    • 避免使用raw直接拼接SQL
    • 使用参数绑定或预处理语句
  2. 文件上传防御

    • 解压操作前校验压缩包内容
    • 限制解压路径不能跳出指定目录
    • 对写入内容进行安全检查
  3. 加密安全

    • 避免使用硬编码密钥
    • 采用强加密算法(如AES-256)
    • 实现密钥轮换机制
  4. 输入验证

    • 所有用户输入都应视为不可信
    • 实施严格的白名单验证
  5. 日志监控

    • 记录所有敏感操作
    • 设置异常操作告警
ThinkPHP框架代码审计实战教学文档 一、环境准备与踩坑记录 1.1 PHP环境配置 SG11扩展 :必须安装SG11扩展,否则系统无法正常运行 PHP版本 :确保使用兼容的PHP版本(文档未明确版本,建议5.6-7.4之间) 1.2 数据库配置 控制器域名设置 : 本地开发时若不允许数字域名,需在 web_domain 表中添加记录 数据库监控配置 : 修改数据库权限允许远程连接 确保端口放行(通常3306) 若监控工具无法连接,可启用MySQL通用查询日志: 1.3 路由分析 采用黑盒+白盒结合方式分析路由 典型TP路由结构: app/目录/XXXController.php 中的方法 可通过抓包分析请求路径与控制器对应关系 二、SQL注入漏洞审计 2.1 漏洞原理 ThinkPHP中 Db 类的 raw 方法不会对SQL片段进行转义处理 当开发者直接将用户输入拼接到 raw 语句中时,会导致SQL注入 2.2 漏洞点分析 2.2.1 OrderController.php漏洞 利用方式 :通过 orderData 参数注入SQL 修复建议 :使用参数绑定或预处理语句 2.2.2 LayimController.php漏洞 利用条件 :需传入特定 type 参数触发漏洞路径 2.2.3 ChadanController.php漏洞 2.3 密码解密方法 加密方式 :SM4加密 密钥 : xiaoyewl 解密方法 :直接调用SM4的decrypt方法 三、文件上传漏洞审计 3.1 VersionController.php漏洞 漏洞位置 :网站升级功能的压缩包解压处理 利用方式 : 创建 public 目录 放入Webshell(建议使用冰蝎马绕过检测) 打包为升级包上传 3.2 常规上传防护分析 防护措施 : 白名单文件扩展名 MIME类型校验 绕过难点 :双重校验使常规Webshell难以直接上传 四、审计技巧总结 全局搜索关键函数 : raw 、 file_put_contents 、 post/get 等 日志分析 : 开启SQL日志观察实际执行的SQL语句 对比代码与日志中的SQL差异 参数追踪 : 从输入点( post/get )到最终使用点的完整路径 框架特性理解 : 掌握ThinkPHP的数据库操作方式 了解路由解析规则 加密解密分析 : 定位加密函数调用点 获取加密密钥(硬编码或配置) 五、防御建议 SQL注入防御 : 避免使用 raw 直接拼接SQL 使用参数绑定或预处理语句 文件上传防御 : 解压操作前校验压缩包内容 限制解压路径不能跳出指定目录 对写入内容进行安全检查 加密安全 : 避免使用硬编码密钥 采用强加密算法(如AES-256) 实现密钥轮换机制 输入验证 : 所有用户输入都应视为不可信 实施严格的白名单验证 日志监控 : 记录所有敏感操作 设置异常操作告警