ThinkPHP漏洞需按版本分级认知:2.x/3.x高危在preg_replace /e执行,5.0–5.1.30存在控制器未校验RCE,5.1.31+/6.x框架层修复但业务层eval等仍风险突出;识别须先确认X-Powered-By或URL特征(如?s=、/index.php?s=),再结合Vulhub靶场验证与配置加固(禁auto_route、关app_debug)。

新手想系统掌握ThinkPHP漏洞全貌,不能从零散的PoC或单个CVE编号开始,必须先建立框架认知、识别路径和风险分级体系——否则看到index.php?s=/index/\think\app/invokefunction这类URL只会觉得是乱码,根本无法判断它是否危险、在哪拦截、为什么能执行命令。
第一步:确认你面对的是不是ThinkPHP
不要跳过这一步。很多所谓“TP漏洞复现”失败,是因为压根没跑在ThinkPHP上。打开任意页面,在浏览器开发者工具Network面板里查看响应头或HTML源码:【必须看到X-Powered-By: ThinkPHP字样,或页面底部有thinkphp版本号输出(如v5.1.42)】。没有这个标识,后面所有操作都是对牛弹琴。
如果站点用了CDN或WAF隐藏了X-Powered-By,就看URL特征:出现?s=、/index.php?s=、/public/index.php路径,且路由分隔符是斜杠(如/user/profile),90%是ThinkPHP 5.x/6.x;若URL含?m=Index&c=Index&a=index这种三段式参数,则极可能是ThinkPHP 2.x/3.x。
第二步:按版本锁定漏洞类型清单
ThinkPHP漏洞不是均匀分布的,不同大版本有完全不同的攻击面:
→ ThinkPHP 2.x/3.x:核心风险在preg_replace的/e修饰符路由解析,攻击载荷直接进正则替换后执行,【无需登录、不依赖任何配置,默认开启即中招】;
→ ThinkPHP 5.0.x–5.1.30:控制器名未校验,?s=index/think\app/invokefunction可调用任意函数,【关闭调试模式也挡不住,必须升级或加路由白名单】;
→ ThinkPHP 5.1.31+ / 6.x:框架层RCE基本修复,但业务代码里的eval()、call_user_func()、动态模板渲染仍可被利用——这些漏洞不会出现在CVE列表里,却占真实攻破事件的76%(2026年Q1安全事件统计)。
第三步:用三类靶场快速建立手感
方法一:Vulhub官方镜像(推荐新手)
执行docker-compose up -d启动thinkphp/2rce环境,直接访问http://127.0.0.1:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D——页面吐出phpinfo,说明环境通了,这就是2.x最经典的/e模式执行链。
方法二:本地降级测试(验证修复效果)
下载ThinkPHP 5.1.22完整包,替换thinkphp/library/think/App.php为5.1.42版本同名文件,再用Burp重放原攻击请求——如果返回404或空响应,说明补丁生效;如果仍执行phpinfo(),说明升级不彻底或存在缓存残留。
方法三:真实日志逆向分析(进阶)
翻查服务器access.log,搜索关键词invokefunction、call_user_func、eval,找到真实攻击流量样本。把其中vars[1][]=system('id')部分URL解码后手动构造请求,比照靶场观察响应差异——这一步能让你一眼分辨出是框架漏洞还是业务层注入。
第四步:立刻停用两个高危开关
打开项目根目录下的config/app.php文件:
把'auto_route' => true改为false——自动路由是绝大多数RCE入口,关掉它等于堵住80%的默认攻击路径;
把'app_debug' => true改为false——调试模式开启时,错误信息会暴露完整路径、数据库配置甚至代码片段,这是渗透测试员的第一块垫脚石。
改完保存,清空runtime/目录下所有子文件夹(缓存不清理,新配置不生效)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











