php 8.3.7 本身不自带 php-cgi 模式下的 rce 漏洞,真正风险源于配置不当、危险函数暴露及外部输入流入执行链路,如 query_string 手动解析绕过 waf、-d 参数绕过 disable_functions、path_info 解析差异导致代码执行等。

php-cgi 未限制 HTTP 方法导致的参数注入
当 Web 服务器(如 Nginx)错误地将非 GET/HEAD 请求转发给 php-cgi,并且后端脚本使用 $_SERVER['QUERY_STRING'] 或 parse_str($_SERVER['QUERY_STRING']) 手动解析参数时,攻击者可通过 POST/PUT 请求体注入任意键值对。
- 典型绕过:WAF 只检查 URL 中的
system(,但参数藏在 POST body 里,QUERY_STRING是空的,WAF 无感知 - 关键条件:Nginx 配置中
fastcgi_param QUERY_STRING $query_string;未做清理,且后端代码存在手动解析逻辑 - 示例请求:
curl -X POST http://target/php-cgi/php-cgi.exe -d 'cmd=cat%20/etc/passwd',若后端有eval("{$cmd}");就直接中招
php-cgi 的 -d 参数执行绕过 disable_functions
php-cgi 支持命令行参数 -d 动态覆盖 php.ini 设置,其中 auto_prepend_file 和 auto_append_file 可被用来加载恶意代码 —— 这类利用**完全绕过 disable_functions 限制**,因为函数禁用发生在脚本运行阶段,而 -d 是在 PHP 解释器初始化时生效。
- 前提:Web 服务器允许用户控制 php-cgi 启动参数(极少见,但某些老旧 CGI 封装脚本或自定义代理会拼接调用)
- 典型 payload:
http://target/php-cgi/php-cgi.exe?-d+auto_prepend_file=php://input,然后 POST 一段 PHP 代码 - 注意:PHP 8.3 默认已禁用
php://input在auto_prepend_file中的使用(受allow_url_include=Off控制),但若该选项被显式开启,就构成高危通道
CGI 模式下 PATH_INFO 截断与解析差异绕过
php-cgi 对 PATH_INFO 的处理与 mod_php/Apache 不同,尤其在 Nginx + php-fpm 混搭或回退到 CGI 模式时,SCRIPT_FILENAME 和 PATH_INFO 的拆分逻辑可能被诱导错位,导致本应作为路径的部分被当作 PHP 代码执行。
- 常见现象:访问
/index.php/xxx.png时,xxx.png被当成PATH_INFO,但如果后端用file_get_contents($_SERVER['PATH_INFO'])且未校验扩展名,就可能读取并eval()非 PHP 文件 - 绕过点:WAF 基于文件后缀过滤,但
PATH_INFO内容不经过静态规则匹配;同时disable_functions对file_get_contents无效,只拦system类 - PHP 8.3 并未修复这类逻辑缺陷 —— 它是部署模型问题,不是解释器 bug
eval($_GET['x']) 还在,或者一个 include($_GET['page']) 没加白名单,攻击面就始终敞开。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











