TP5.1.31是ThinkPHP 5.1系列首个全面修复RCE高危漏洞的安全版本,重点拦截控制器绕过、Method伪造、路由缓存绕过三类攻击链,并需通过composer更新、清空缓存、配置校验及实测验证确保修复生效。

TP5.1.31 是 ThinkPHP 5.1 系列中首个全面修复远程代码执行(RCE)高危漏洞的正式安全版本,发布于2022年,至今仍被广泛推荐为5.1分支的“基线安全版本”。它不是小修小补,而是针对多个已武器化的攻击链做了底层拦截,尤其解决了长期存在的控制器绕过、Method伪造、路由调度失控等核心问题。
关键修复覆盖哪些漏洞
该版本集中修复了三类已被大规模利用的RCE路径:
-
控制器名任意实例化漏洞:此前攻击者可通过
?s=index/\think\app/invokefunction绕过命名空间限制,直接调用敏感方法;5.1.31在路由解析后强制校验控制器名格式,非法字符(如/、%00、双反斜杠)直接抛出404 -
HTTP Method伪造导致的WebShell写入:旧版Request类对
_method参数和X-HTTP-Method-Override头不做白名单限制,攻击者可伪装成PUT/DELETE触发未授权POST处理逻辑;5.1.31仅允许GET、POST、DELETE、PUT、PATCH五种标准方法,其余一律降级为POST且清除危险参数 -
路由缓存绕过导致的invokeFunction调用:当开启路由缓存时,部分恶意请求可跳过中间件校验直达调度层;5.1.31强化了
Url.php中parseUrl方法的路径分割逻辑,禁止在s=参数中出现连续反斜杠或嵌套命名空间路径
升级操作要点
升级不是简单执行一条命令,需兼顾兼容性与实效性:
- 运行
composer update topthink/framework:~5.1.31,避免使用^5.1.0这类宽泛约束,防止意外拉取非安全小版本 - 升级后必须清空全部缓存:
php think clear+ 手动删除runtime/cache/、runtime/route/、runtime/log/三个目录内容 - 检查
config/app.php中'default_return_type' => 'html'是否仍为html,若项目依赖JSON返回,需确认接口层未因模板引擎变更产生异常响应 - 若使用自定义中间件处理路由,需验证其
beforeAction钩子是否仍能捕获到think\App::invokeFunction类请求——5.1.31已将该调用提前拦截,中间件可能收不到原始payload
验证修复是否生效
别只看版本号,要实测攻击链是否真正断开:
- 访问
/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=1,应返回404或空白页,而非输出PHP配置信息 - 用curl发送POST请求:
curl -X POST "http://your.site/?s=captcha" --data "_method=__construct&filter[]=system&method=get&get[]=id",响应体中不应包含uid=或gid= - 检查Web服务器错误日志,确认无
controller not exists以外的HttpException大量报错——若有,说明正则校验过严,需回退到^[A-Za-z][\w.]*$宽松模式
无法升级时的临时加固措施
若因历史代码强耦合无法立即升级,可分两步应急:
-
入口层拦截:在
public/index.php顶部添加规则,对$_GET['s']和$_POST['_method']做关键词过滤,屏蔽\think\、invokefunction、call_user_func、system等字符串 -
配置层收紧:将
config/route.php中'url_route_must' => false改为true,并确保所有URL都通过Route::get/post()显式定义,关闭pathinfo自动解析能力

















