验证ThinkPHP漏洞是否彻底解决,必须用真实攻击载荷复现、绕过常规扫描器误报、确认业务功能未被破坏——不能只看补丁文件是否存在或版本号是否更新;需逐条重放原始POC、覆盖所有已知变种路径、核对核心文件MD5与白名单逻辑、运行tpscan回归扫描,并人工触发边界场景验证。

验证ThinkPHP漏洞是否彻底解决,必须用真实攻击载荷复现、绕过常规扫描器误报、确认业务功能未被破坏——不能只看补丁文件是否存在或版本号是否更新。
用原始POC逐条重放验证
打开你之前记录的漏洞复现环境或历史测试记录,把当初触发漏洞的原始Payload原样重放一次。例如TP5.0.23 RCE漏洞,必须重新发送:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id 这类构造参数,观察响应状态码、响应体是否仍返回执行结果。
如果返回404、500或空响应,且服务器日志中不再出现system、call_user_func_array等危险函数调用痕迹,说明该路径已被阻断。
【注意:仅检查HTTP状态码200/404不够,必须查看响应内容和后端日志】
立即学习“PHP免费学习笔记(深入)”;
覆盖所有已知变种攻击路径
ThinkPHP同一类漏洞往往存在多个利用入口,不能只测一个。按优先级顺序验证以下三类路径:
- 路由型RCE:
/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=1 - 参数注入型RCE:
/index.php?_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls - 日志/缓存文件包含:
/index.php?s=/runtime/log/202608/06.log(需先确认日志路径是否可被直接访问)
每一条都必须手工构造请求并抓包确认响应体无敏感信息、无命令回显、无PHP错误堆栈泄露。
检查框架核心文件是否被篡改
进入项目目录,运行命令:md5sum thinkphp/library/think/Request.php,比对输出值与官方发布版本对应文件的MD5值是否一致。
若使用手动补丁方式修复,重点核对method()方法中是否加入了HTTP方法白名单校验逻辑,且unset($_POST[Config::get('var_method')])已生效。
这一步操作起来很简单,直接把文件拖进去就行。
运行tpscan进行回归扫描
方法一:命令行扫描单点
执行:python3 tpscan.py -u http://your-domain.com --level 3,等待扫描完成,确认输出中不再出现[RCE]、[LFI]、[INFOLEAK]等标记项。
方法二:批量扫描关键URL列表
准备urls.txt,每行一个带参数的测试地址(如http://x.com/index.php?s=captcha),执行:python3 tpscan.py -f urls.txt -t 10。
tpscan的--level 3会主动尝试绕过常见WAF规则,比基础扫描更贴近真实攻击者行为。
人工触发边界场景
在表单提交、文件上传、搜索框输入等用户可控入口处,分别输入以下内容并观察响应:
${@phpinfo()} → 检查是否解析执行../runtime/cache/xxx.php → 检查是否发生路径遍历1' OR '1'='1 → 检查SQL报错是否消失
这些输入不依赖任何工具,直接在浏览器开发者工具Network面板里看XHR响应即可判断。



















