一次对基于thinkphp开发程序的审计
字数 1365 2025-08-26 22:11:45
ThinkPHP 5.1 代码审计实战教学文档
一、审计前准备
-
了解目标系统架构
- 基于ThinkPHP 5.1开发的多应用系统
- 主要关注目录:
application(主程序)public(公开文件夹)
-
熟悉ThinkPHP开发文档
- 理解框架的MVC结构和常见函数
-
安装并运行目标系统
- 按照教程安装源码
- 通过功能点测试了解系统业务逻辑
二、文件上传漏洞审计
1. 图片上传接口审计
- 文件路径:
/index/controller/upload.php - 安全机制:
- 使用白名单过滤上传文件类型
- 无中间件解析漏洞配合
- 结论:无有效文件上传漏洞
2. 音频上传接口审计
- 安全机制:
- 直接重命名上传文件
- 无中间件解析漏洞配合
- 结论:无有效文件上传漏洞
三、SQL注入漏洞审计
1. 审计方法
- 全局搜索关键词:
query$sqlselect(where(
- 寻找直接拼接SQL或使用原始SQL查询的代码
2. 第一处潜在注入点
- 位置:私有函数
census() - 问题:
- 直接拼接参数到SQL语句
- 使用
db->query()执行
- 审计结果:
- 传入参数不受用户控制
- 无法形成有效注入
3. 第二处有效注入点
- 相关文件:
/seller/model/chat.php/seller/controller/log.php
- 漏洞特征:
- SQL语句直接拼接
- 语句构造复杂
- 验证方法:
- 查看数据库查询日志
- 请求路由:
/seller/log/getChatLogDetail
- 注入点位置:
content字段存在like型注入
- 验证Payload:
%' or 1=1#
- 漏洞确认:
- Payload被直接拼接到SQL语句
- 未被任何过滤处理
四、任意文件读取漏洞审计
1. 审计方法
- 全局搜索关键词:
file_put_contentsfile_get_content
2. 漏洞发现
- 文件路径:
/seller/controller/words.php - 漏洞特征:
- 从项目根目录读取文件
- 文件路径由
words参数控制
- 利用方法:
- 构造请求读取任意文件
- 文件内容会被存入数据库
- 后续利用:
- 可通过注入或页面查看读取的文件内容
五、插件与框架历史漏洞审计
1. UEditor插件审计
- 路径:
/public/static/common/js/ueditor - 版本:1.4.3
- 已知漏洞:
- 仅ASP版本存在漏洞
- PHP版本有严格后缀过滤
- 结论:无法利用
2. ThinkPHP 5.1反序列化漏洞
- 审计方法:
- 全局搜索
unserialize()函数
- 全局搜索
- 结果:
- 未发现相关函数调用
- 结论:无法利用
六、完整审计流程总结
-
文件上传功能审计
- 检查所有上传接口
- 验证过滤机制有效性
-
SQL注入审计
- 查找原始SQL查询
- 验证参数过滤情况
- 通过日志确认注入
-
文件操作审计
- 查找文件读写函数
- 验证参数可控性
-
插件与框架漏洞检查
- 确认第三方组件版本
- 检查已知漏洞利用条件
-
其他常见漏洞检查
- 命令执行函数(未发现)
- 文件包含(未发现)
七、修复建议
-
SQL注入修复
- 使用预处理语句
- 对输入参数进行严格过滤
-
任意文件读取修复
- 限制文件读取目录
- 对输入参数进行白名单过滤
-
整体安全建议
- 更新框架到最新版本
- 定期进行安全审计
- 实施严格的输入验证机制