彻底解决ThinkPHP 5.0/5.1远程代码执行漏洞需升级至5.0.24+或5.1.31+,或手动在App.php(5.0)和Url.php(5.1)中添加控制器正则校验,并配置url_route_must=true、app_debug=false及禁用危险函数。

彻底解决 ThinkPHP 5.0 和 5.1 版本的远程代码执行漏洞,核心在于堵住控制器名和方法调用两个关键入口点的任意解析路径。官方已在 5.0.23 和 5.1.31 版本中完成修复,但若因兼容性等原因无法升级,必须手动加固底层逻辑。
升级到安全版本(首选方案)
这是最可靠、最省力的方式。官方已明确修复所有已知利用链:
- ThinkPHP 5.0.x 升级至 v5.0.24 或更高版本(最低要求 v5.0.23)
- ThinkPHP 5.1.x 升级至 v5.1.31 或更高版本
- 确认 composer.json 中依赖项已更新,执行
composer update topthink/framework - 升级后务必验证
vendor/topthink/framework/下实际版本号,避免缓存导致假升级
手动补丁加固(适用于无法升级场景)
若业务强依赖旧版且暂不能升级,需在关键文件中添加控制器合法性校验:
-
5.0 版本:修改
thinkphp/library/think/App.php的module方法,在获取$controller后插入校验:if (!preg_match('/^[A-Za-z][\w.]*$/', $controller)) {<br> throw new HttpException(404, 'controller not exists:' . $controller);<br>} -
5.1 版本:修改
thinkphp/library/think/route/dispatch/Url.php的parseUrl方法,在解析出$controller后添加相同判断:if ($controller && !preg_match('/^[A-Za-z][\w.]*$/', $controller)) {<br> throw new HttpException(404, 'controller not exists:' . $controller);<br>} - 注意:正则中不允许反斜杠
\、空格、特殊符号,仅允许字母开头 + 字母数字下划线点号
配置层防御(辅助加固)
代码层修复之外,通过运行时配置降低攻击面:
立即学习“PHP免费学习笔记(深入)”;
- 强制开启路由:
'url_route_must' => true(在config/app.php中设置),关闭「兼容模式」下的任意控制器调用 - 关闭调试模式:
'app_debug' => false,避免攻击者利用_method=__construct等 POST 组合方式触发构造器覆盖 - 禁用危险函数:在 PHP 配置中移除
system、exec、shell_exec、passthru等函数(disable_functions) - Web 服务器层面限制:Nginx/Apache 对
index.php?s=类似路径做规则拦截,或统一重写为 404
验证修复是否生效
补丁或升级后必须主动验证,不能仅依赖版本号:
- 尝试访问:
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1→ 应返回 404 或 500,而非显示 phpinfo - 发送 POST 请求:
_method=__construct&filter[]=system&server[REQUEST_METHOD]=id→ 应被拒绝,不执行系统命令 - 检查日志中是否仍有含
\think\、invokefunction、call_user_func_array的异常请求记录



















