ThinkPHP 5.0.19 存在控制器名未校验导致的RCE漏洞,本质是未开启强制路由时对s参数缺乏白名单校验,攻击者可构造index/\think\app/invokefunction等路径调用内置函数执行任意命令;修复需升级至5.0.23+或启用强制路由、Web服务器关键词拦截、禁用危险函数。

ThinkPHP 5.0.19 存在控制器名未校验导致的远程代码执行漏洞(RCE),本质是框架在未开启强制路由时,对 s 参数(或 URL 中的控制器路径)缺乏白名单限制和合法性校验,攻击者可构造如 index/\think\app/invokefunction 这类恶意控制器路径,结合 function 和 vars 参数调用 PHP 内置函数,最终实现任意命令执行。
确认是否受影响
满足以下全部条件即存在风险:
- 使用 ThinkPHP 5.0.x 版本,且版本 ≤ 5.0.22(5.0.19 明确在影响范围内)
- 未启用强制路由(
'url_route_must' => true) - Web 服务器允许 PATH_INFO 或兼容的 URL 模式(如 Apache + mod_rewrite、Nginx 的正确 fastcgi_split_path_info 配置)
- 能通过类似
http://target/index.php?s=index/&id=1正常访问,说明路由机制生效
最直接有效的修复方式
升级到官方已修复版本:
- 5.0 系列用户 → 升级至 5.0.23 或更高版本
- 5.1 系列用户 → 升级至 5.1.30 或更高版本
升级后,框架默认对控制器类名执行严格命名空间白名单校验,非法路径(如含 \think\ 的控制器)将直接抛出 404 或 400 错误,无法进入执行流程。
临时缓解措施(无法立即升级时)
在不改代码的前提下,通过配置和规则层阻断利用链:
-
启用强制路由:在
config/route.php或应用配置中设置'url_route_must' => true,并确保所有入口都定义在路由规则中 -
Web 服务器拦截:在 Nginx/Apache 配置中,拒绝包含
/think\、invokefunction、call_user_func、file_put_contents等关键词的s参数或 PATH_INFO -
禁用危险函数:在
php.ini中设置disable_functions = call_user_func,call_user_func_array,eval,system,passthru,exec,shell_exec,proc_open(注意评估业务兼容性)
开发侧加固建议
长期规避同类风险需从编码习惯入手:
- 避免在控制器方法中直接接收并拼接用户输入调用函数(如
call_user_func($func, ...)) - 对所有外部输入参数做类型校验、长度限制、白名单过滤,尤其涉及类名、方法名、文件路径的字段
- 生产环境关闭调试模式(
app_debug = false),防止错误信息泄露路径与框架细节 - 定期扫描依赖组件,关注 ThinkPHP 官方安全公告(https://github.com/top-think/thinkphp/releases)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











