ThinkPHP 5.0.23 的 CVE-2018-20062 漏洞源于 Request::method() 未校验 _method 参数合法性,导致通过 _method=__construct 覆盖 filter/server 属性并经 __call 触发 RCE;修复需升级至 5.0.24+ 或 5.1.31+,或手动限制 method 仅允许 GET/POST/PUT/DELETE/PATCH 并禁用 var_method。

ThinkPHP 5.0.23 的 _method 过滤器 RCE 漏洞(CVE-2018-20062)本质是 Request 类中 method() 方法未校验方法名合法性,导致 _method=__construct 可覆盖关键属性(如 filter 和 server),再经 __call 魔术方法触发 call_user_func_array 执行任意函数。修复核心在于切断“参数覆盖→危险调用”链路。
升级到安全版本是最直接有效的方案
官方已在后续版本中修复该逻辑缺陷:
- ThinkPHP 5.0.x 系列:升级至 5.0.24 或更高版本
- ThinkPHP 5.1.x 系列:升级至 5.1.31 或更高版本
升级操作需替换完整框架核心文件(thinkphp/ 目录),避免仅覆盖单个文件导致兼容性问题。生产环境升级前建议在测试环境验证业务功能。
手动修补 Request::method() 方法
若因兼容性等原因无法升级,可定位到 thinkphp/library/think/Request.php 中的 method() 方法,修改其对 _method 参数的处理逻辑:
- 检查传入的
$method是否属于合法 HTTP 方法(GET、POST、PUT、DELETE、PATCH) - 非法值一律拒绝,不执行后续赋值和方法调用
- 显式
unset掉恶意参数,防止残留利用
补丁示例(关键修改部分):
$method = strtoupper($_POST[Config::get('var_method')]);
if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {
$this->method = $method;
$this->{$this->method}($_POST);
} else {
$this->method = 'POST';
}
unset($_POST[Config::get('var_method')]);
}
禁用危险的请求方法覆盖机制
框架默认允许通过 _method 参数伪造请求方法,这是漏洞利用的前提。可在应用配置中关闭该功能:
- 在
config/app.php中设置:'var_method' => false - 或设为空字符串:
'var_method' => ''
此举将使 _method 参数完全失效,从源头阻断利用路径,且不影响正常 GET/POST 请求处理。
补充防护:Web 层拦截高危参数组合
作为纵深防御手段,可在 Web 服务器(如 Nginx/Apache)或 WAF 规则中识别并拦截典型攻击特征:
- URL 或 POST 请求体中同时出现
_method=__construct和filter[]= - 参数含
server[REQUEST_METHOD]=且后接系统命令关键词(如system、exec、shell_exec、cat、ls)
注意:此方式属临时缓解,不能替代代码层修复,且需持续更新规则以防绕过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











