ThinkPHP 5.1.30 存在路由检测RCE漏洞,需升级至≥5.1.40、关闭调试并启用强制路由、入口文件加参数过滤、代码层禁用高危函数调用。

ThinkPHP 5.1.30 存在路由检测环节的 RCE 漏洞,核心在于未开启强制路由、调试模式启用、以及 URL 中 s 参数可传入任意命名空间路径(如 hinkpp),导致框架直接实例化系统类并调用危险方法(如 invokeFunction)。修复不能只打补丁,需从版本、配置、入口层三方面同步加固。
升级到安全版本
官方已在 5.1.38 起修复关键利用链(包括 invokeFunction 调用校验、input 的 filter 绕过等),5.1.30 必须升级:
- 执行
composer update topthink/framework:^5.1.40 --with-dependencies - 检查
composer.lock中topthink/framework版本是否 ≥ 5.1.40,且无降级依赖 - 升级后清空
runtime/cache/和runtime/log/目录,避免旧缓存干扰运行逻辑
关闭调试并启用强制路由
调试模式会暴露类路径和调用栈,强制路由可阻断非法控制器名解析:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 修改
app.php或对应环境配置文件,设'app_debug' => false和'url_route_must' => true - 确保 Web 服务器重写生效:Apache 启用
.htaccess;Nginx 配置try_files $uri $uri/ /index.php?$query_string; - 在
php.ini中设display_errors = Off,防止错误信息泄露服务器路径
入口文件加参数过滤
在 public/index.php 最顶部(require __DIR__ . '/../thinkphp/start.php'; 前)插入白名单拦截逻辑:
立即学习“PHP免费学习笔记(深入)”;
- 检测 URL 中
s=、_method、function、vars等参数是否含敏感关键词,如hink、call_user_func、assert、system、file_put_contents - 对 POST 数据同样校验,尤其拦截
filter[]=后接危险函数的组合 - 示例判断逻辑(可直接使用):
if (isset($_GET['s']) && preg_match('/[\\\x00-\x08\x0b\x0c\x0e-\x1f]/', $_GET['s'])) {
die('Invalid request');
}
if (isset($_POST['_method']) && in_array(strtolower($_POST['_method']), ['__construct', '__call'])) {
die('Method not allowed');
}
?>
代码层禁用高危调用
全局搜索项目中是否直接使用 call_user_func_array、eval、assert 等函数处理用户输入,尤其是控制器或中间件里:
- 将动态函数调用改为硬编码分支,例如用
switch替代call_user_func_array($func, $args) - 若必须保留动态调用,需严格校验
$func是否在预设白名单内(如['date', 'json_encode']) - 检查所有
input()调用,禁用未声明filter的用法,避免被绕过


















