ThinkPHP任意代码执行(RCE)漏洞修复需双线推进:一要升级至安全版本(TP5≥5.1.41、TP6≥6.0.2),二要关闭非强制路由、禁用debug、修补Store.php校验逻辑,并通过POC验证响应为404或空内容。

ThinkPHP框架的任意代码执行(RCE)漏洞是高危安全问题,多因控制器调用、模板渲染或Session处理环节缺乏输入校验导致。修复核心在于堵住可控参数进入执行逻辑的路径,同时强化运行环境隔离。
常见RCE触发场景与成因
以下为TP5/TP6中高频出现的RCE入口点:
-
非强制路由下的控制器方法调用:如未开启
url_route_must = true,攻击者可通过?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1直接调用PHP函数 -
模板引擎危险方法滥用:
think\view\driver\Think类的__call方法配合display可加载恶意模板,例如?s=index/\think\view\driver\Think/__call&method=display¶ms[]=<?php +phpinfo();?> -
Session ID未校验引发文件操作:TP6.0.0–6.0.1中
Store.php未用ctype_alnum()校验SessionId,导致writeFile()写入任意路径,结合file_put_contents实现Webshell写入 -
反序列化链利用:如TP3.x中
Image::__destruct→destroy→delete,若Session数据可控,可触发任意文件删除或写入
关键修复措施
修复需从代码层和部署层双线推进,缺一不可:
-
升级框架版本:TP5用户升至
v5.1.41+或v5.0.24+;TP6用户必须升至v6.0.2+(修复Session任意文件操作);禁用已知存在RCE的旧版(如5.0.22、5.1.29、6.0.0) -
补丁式修复(无法升级时):下载官方补丁包(如“thinkphp5远程执行代码漏洞修复补丁.zip”),替换
think/app/invokefunction.php、think/route/Dispatch.php等关键文件;TP6需重点修补vendor/topthink/framework/src/think/session/Store.php中SessionId校验逻辑 -
关闭危险配置:在
config/app.php中设置'url_route_must' => true;禁用debug模式(app_debug => false);移除runtime目录下所有.php缓存文件 -
Web服务器权限加固:Nginx/Apache中明确禁止
runtime和upload目录执行PHP:
Nginx示例:location ~ ^/(runtime|upload)/.*\.php$ { deny all; }
上线前必做验证
修复后需主动验证是否仍可触发RCE:
- 用公开POC测试典型payload,如
?s=index/\think\app/invokefunction&function=phpinfo,响应应为404或空内容 - 检查
runtime/log中是否存在异常phpinfo、system、eval等关键词日志 - 扫描
upload目录是否残留.php、.phtml、.htaccess等可疑文件 - 确认
phpinfo()页面已关闭,且display_errors设为Off


















