thinkphp 5.0.23 rce漏洞本质是路由解析时未过滤反斜杠和命名空间,导致攻击者可构造/index.php?s=/index/\think\app/invokefunction等url,绕过校验调用call_user_func_array执行system('id')等任意系统命令,无需登录、无需特殊配置,一行请求即可getshell。

ThinkPHP命令注入漏洞主要指其远程代码执行(RCE)类漏洞,尤其是5.0.23版本中因控制器名解析失控导致的任意函数调用问题。它不是传统意义上的系统命令拼接注入,而是通过框架路由机制绕过校验,最终调用system、exec等函数执行系统命令。核心风险在于“无需登录、无需特殊配置、一行请求即可打穿服务器”。
漏洞触发的关键路径
攻击者构造类似这样的URL:
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
该请求能成功,依赖三个关键环节未设防:
- 路由解析时未过滤反斜杠(
\)和命名空间路径,使\think\app被当作合法控制器名加载 -
invokefunction方法未限制可调用类与函数范围,允许传入call_user_func_array -
vars参数直接作为call_user_func_array的第二个参数,导致system('id')被原样执行
影响最广的几个版本及对应漏洞类型
不同ThinkPHP大版本存在差异明显的命令执行入口:
-
ThinkPHP 2.x / 3.x:依赖
preg_replace的/e修饰符,如$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', ...),用户输入进双引号后被eval执行 -
ThinkPHP 5.0.0–5.0.23:控制器名未过滤命名空间,配合
invokefunction实现RCE(CVE-2018-20062) -
ThinkPHP 5.1.0–5.1.23:虽修复了5.0的路由问题,但
order by参数对数组key过滤不严,仍可触发SQL注入并间接执行命令(需配合报错/union等场景)
有效修复方式(非临时补丁)
官方已在后续版本中从设计层面收敛风险,实际修复应结合升级与配置加固:
- 升级到ThinkPHP 5.0.24+ 或 5.1.30+,这些版本禁用了
invokefunction的任意类调用能力,并对路由解析增加白名单机制 - 禁用
__call动态方法调用,或重写App::invokeFunction方法,强制校验$function必须为预定义安全函数(如phpinfo、get_cfg_var) - 在Web服务器层(如Nginx)拦截含
\think\、invokefunction、call_user_func等关键词的请求,作为应急缓解 - 关闭调试模式(
app_debug = false),避免错误信息泄露路径与类结构,降低利用成功率
验证是否已修复的简单方法
部署修复后,手动尝试以下两个典型payload,预期均应返回404或500错误,而非命令执行结果:
/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=1/index.php?s=index/think\container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
若任一请求返回PHP信息或系统命令输出,说明修复未生效或存在绕过路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











