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;
}

漏洞原理

  1. $origin 为 false 且 $this->method 为空时,会检查 $_POST[$this->config['var_method']] 是否存在
  2. $this->config['var_method'] 默认值为 _method
  3. 攻击者可以通过 POST 参数 _method 控制 $this->method 的值
  4. 然后通过 $method = strtolower($this->method)$this->{$method} = $_POST 实现变量覆盖

漏洞利用

变量覆盖

通过构造特殊的 _method 参数,可以覆盖 $filter 属性值:

c=exec&f=calc.exe&&_method=filter&

实际利用条件

  1. 默认情况下会爆出警告级别的异常,导致程序终止
  2. 如果项目配置中设置了忽略异常提示(这是生产环境的常见配置),则可以利用成功

Payload示例

POST请求内容:

_method=filter&c=exec&f=calc.exe

这个payload会尝试执行系统命令,弹出计算器程序。

防御措施

  1. 升级到官方修复版本
  2. _method 参数进行严格过滤
  3. 避免在生产环境中完全关闭错误提示
  4. 对输入参数进行严格过滤和验证

总结

该漏洞利用ThinkPHP框架中Request类的变量覆盖特性,通过精心构造的POST请求实现任意代码执行。由于生产环境通常会关闭错误提示,使得该漏洞在实际环境中更容易被利用。

ThinkPHP 5.1 ~ 5.2 全版本代码执行漏洞分析 漏洞概述 ThinkPHP 5.1 至 5.2 全版本在生产环境下存在代码执行漏洞,攻击者可以通过精心构造的请求实现任意代码执行。 漏洞位置 漏洞位于 thinkphp/library/think/Request.php 文件中的 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 属性值: 实际利用条件 默认情况下会爆出警告级别的异常,导致程序终止 如果项目配置中设置了忽略异常提示(这是生产环境的常见配置),则可以利用成功 Payload示例 POST请求内容: 这个payload会尝试执行系统命令,弹出计算器程序。 防御措施 升级到官方修复版本 对 _method 参数进行严格过滤 避免在生产环境中完全关闭错误提示 对输入参数进行严格过滤和验证 总结 该漏洞利用ThinkPHP框架中Request类的变量覆盖特性,通过精心构造的POST请求实现任意代码执行。由于生产环境通常会关闭错误提示,使得该漏洞在实际环境中更容易被利用。