记录一次tp框架下的代码审计
字数 1221 2025-08-23 18:31:34
ThinkPHP框架代码审计实战教学文档
一、环境准备与踩坑记录
1.1 PHP环境配置
- SG11扩展:必须安装SG11扩展,否则系统无法正常运行
- PHP版本:确保使用兼容的PHP版本(文档未明确版本,建议5.6-7.4之间)
1.2 数据库配置
-
控制器域名设置:
- 本地开发时若不允许数字域名,需在
web_domain表中添加记录
- 本地开发时若不允许数字域名,需在
-
数据库监控配置:
- 修改数据库权限允许远程连接
- 确保端口放行(通常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);
- 漏洞位置:网站升级功能的压缩包解压处理
- 利用方式:
- 创建
public目录 - 放入Webshell(建议使用冰蝎马绕过检测)
- 打包为升级包上传
- 创建
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难以直接上传
四、审计技巧总结
-
全局搜索关键函数:
raw、file_put_contents、post/get等
-
日志分析:
- 开启SQL日志观察实际执行的SQL语句
- 对比代码与日志中的SQL差异
-
参数追踪:
- 从输入点(
post/get)到最终使用点的完整路径
- 从输入点(
-
框架特性理解:
- 掌握ThinkPHP的数据库操作方式
- 了解路由解析规则
-
加密解密分析:
- 定位加密函数调用点
- 获取加密密钥(硬编码或配置)
五、防御建议
-
SQL注入防御:
- 避免使用
raw直接拼接SQL - 使用参数绑定或预处理语句
- 避免使用
-
文件上传防御:
- 解压操作前校验压缩包内容
- 限制解压路径不能跳出指定目录
- 对写入内容进行安全检查
-
加密安全:
- 避免使用硬编码密钥
- 采用强加密算法(如AES-256)
- 实现密钥轮换机制
-
输入验证:
- 所有用户输入都应视为不可信
- 实施严格的白名单验证
-
日志监控:
- 记录所有敏感操作
- 设置异常操作告警