ThinkPHP 5.x 远程代码执行漏洞本质是用户输入校验缺失导致危险函数被直接调用,常见利用方式包括路由参数污染、变量覆盖和缓存反序列化,修复需升级版本、强化路由与函数限制、禁用危险函数并加强目录权限与WebShell扫描。

ThinkPHP 5.x 远程代码执行(RCE)漏洞本质是框架对用户输入缺乏严格校验,导致攻击者可绕过正常调用链,直接触发危险函数(如 system、call_user_func_array),从而执行任意系统命令或写入 WebShell。该类漏洞影响广泛,修复需从代码层、配置层和运维层协同进行。
常见触发方式与利用特征
漏洞利用不依赖登录,且多数场景下无需特殊权限。典型路径包括:
-
路由参数污染型:通过
s=index/\think\app/invokefunction调用反射机制,配合function=call_user_func_array&vars[0]=system&vars[1][]=whoami执行命令 -
变量覆盖型:利用
_method=__construct触发构造方法,再通过filter[]=system覆盖过滤器属性,使后续参数经filterValue()时被call_user_func执行 - 缓存反序列化型(5.0.0–5.0.10):向缓存写入恶意序列化数据,如注入换行符绕过注释头,最终在缓存文件被包含或解析时触发代码执行
关键修复措施
官方已在多个版本中发布补丁,但仅升级未必彻底解决,需结合手动加固:
- 立即升级至安全版本:5.0.x ≥ 5.0.24 或 5.1.x ≥ 5.1.31;若无法升级,应应用对应 commit 补丁(如 5.0.x 的 b797d72)
- 强制开启路由模式:在
config/route.php中设置'url_route_must' => true,关闭兼容模式下的动态控制器解析 - 禁用危险函数调用:在
php.ini中移除system、exec、shell_exec、passthru、call_user_func_array等函数(生产环境强烈建议) - 限制控制器与方法名合法性:在路由或中间件中对
$_GET['s']和__construct类参数做白名单校验,拒绝含反斜杠\、双冒号::或非法字符的输入
服务器与目录级防护
即使代码层修复,仍需防止已上传木马或未清理的缓存被利用:
- 禁止
runtime/和upload/目录执行 PHP:
— Nginx 配置中添加location ~ ^/(runtime|upload)/.*\.php$ { deny all; }
— Apache 使用.htaccess禁止执行:php_flag engine off - 严格控制目录权限:除
runtime和upload外,所有目录设为755,PHP 文件设为644;确保runtime不可写入非必要子目录 - 清空并锁定缓存:删除全部
runtime/cache/和runtime/log/内容,重启 Web 服务后验证日志是否仍可写入 - 扫描残留 WebShell:重点检查
runtime/下以.php结尾的缓存文件(如md5(key).php)、upload/中异常命名的 PHP 文件(如shell.php、1.php)
验证与持续监控
修复后必须验证是否真正生效:
- 使用原始 POC 访问测试接口,确认返回 404、500 或参数被截断/过滤,而非命令回显
- 检查
access.log中是否存在大量含_method=__construct、invokefunction或filter[]=的请求记录 - 部署 WAF 规则(如 ModSecurity)拦截含
/think\app/、call_user_func、system(等特征的请求 - 定期审计
application/config.php中的var_pathinfo、var_method是否被篡改,确保未启用危险调试配置

















