thinkphp 5.1.37 存在多个高危 rce 漏洞,源于路由解析缺陷、参数过滤缺失及危险函数(如 eval、assert、call_user_func_array)直用,攻击者可构造恶意 url 或 post 参数执行系统命令、写入 webshell;修复需三管齐下:立即升级至 5.1.40+ 安全版本,配置加固(禁用 debug、启用强制路由、关闭错误显示),并在代码层拦截高危参数与危险调用。

ThinkPHP 5.1.37 存在多个高危 RCE 漏洞,核心问题集中在路由解析、参数过滤缺失及危险函数直用(如 call_user_func_array、eval、assert),攻击者可通过构造特定 URL 或 POST 参数直接执行系统命令、写入 WebShell。修复不能只靠单点补丁,需版本升级 + 配置加固 + 代码层拦截三管齐下。
立即升级到安全版本
官方已在 5.1.38 及后续版本中修复关键利用链(包括 hinkApp::invokeFunction、 hinkRequest::input 中的 filter 绕过、 hinkContainer::invokeFunction 调用缺陷等):
- 将框架升级至 5.1.40 或更高稳定版(非 beta),运行:
composer update topthink/framework --with-dependencies - 检查
composer.lock,确认topthink/framework版本 ≥ 5.1.40,且无降级依赖 - 升级后清空
runtime/cache/和runtime/log/目录,避免旧缓存干扰
禁用调试模式并开启强制路由
调试模式泄露类路径与调用栈,强制路由可阻断非法控制器名解析:
- 修改
app.php或环境配置文件,设:'app_debug' => false,和'url_route_must' => true, - 若使用 Apache,确保
.htaccess启用重写;Nginx 需配置try_files $uri $uri/ /index.php?$query_string; - 关闭
display_errors(php.ini 中设为Off),防止错误信息暴露路径
入口文件加参数白名单过滤
在 public/index.php 最顶部插入以下防护逻辑,拦截已知高危参数模式:
- 检测 URL 中是否含
s=、_method、function、vars等关键词,且值中包含hink、call_user_func、assert、system、file_put_contents等敏感字符串 - 示例代码片段(放在
require __DIR__ . '/../thinkphp/start.php';前):if (isset($_GET['s']) && preg_match('/\\think\\/i', $_GET['s'])) { die('Access Denied'); }<br>if (isset($_POST['_method']) && in_array(strtolower($_POST['_method']), ['__construct', '__destruct'])) { die('Access Denied'); } - 对所有
$_GET、$_POST、$_COOKIE中的键名做正则校验,仅允许字母、数字、下划线、短横线
移除或重写危险调用点
全局搜索项目代码,彻底清除以下高危模式:
-
unserialize(、eval(、assert(、create_function(、call_user_func_(array|) -
input('param', '', 'htmlspecialchars')类型中第三个参数为用户可控函数名的写法 -
$request->param()直接用于call_user_func或数据库查询前未过滤的场景 - 若必须动态调用,改用白名单数组映射,例如:
$allowed = ['getUser' => 'UserModel::getById']; if (isset($allowed[$func])) { call_user_func($allowed[$func], $id); }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











