PHP 8.2.19 的 CVE-2024-4577 漏洞仅在 Windows 下通过 Apache+mod_cgi 调用 php-cgi.exe 时可复现,依赖代码页回退、CGI 参数解析及未防护的 Web 配置,CLI 模式下无法触发。

php-cgi 在 Windows 下本身不是标准运行模式,PHP 官方不提供 Windows 版 php-cgi.exe 的独立二进制分发包,也不支持 CGI 模式作为 Windows 主流部署方式。因此,“PHP 8.2.19 php-cgi 漏洞在 Windows 下复现”这个前提存在根本性偏差——你大概率遇到的是以下三种情况之一:
- 把 Linux 上的 CVE(如 CVE-2023-3823、CVE-2024-4577)误认为在 Windows 下可直接复现
- 使用了非官方第三方编译的
php-cgi.exe(例如某些集成环境如 WampServer、XAMPP 的旧版打包) - 实际想验证的是 PHP-CGI 参数注入类漏洞(典型如 CVE-2024-4577),但误用了 Windows 命令行解析逻辑
CVE-2024-4577:Windows 下 PHP-CGI 参数注入的真实触发条件
这个漏洞本质是 Windows 系统层的 代码页回退(CP1252 → GBK)+ php-cgi.exe 对 -d 参数未校验 导致的命令注入,仅影响以 CGI 模式启动、且通过 Web 服务器(如 Apache + mod_cgi)暴露 php-cgi.exe 的场景,和 CLI 或 FPM 完全无关。
-
漏洞触发必须满足:
- PHP 运行在 Windows(Linux/macOS 不受影响)
- 使用
php-cgi.exe且被 Web 服务器以 CGI 方式调用(如 Apache 的AddHandler cgi-script .php) - 请求 URL 中包含未编码的
%AD(即 ISO-8859-1 字符 0xAD,在 CP1252 下被 Windows 解析为 0x81,再被 PHP-CGI 错误识别为-d开头) - Web 服务器未禁用 CGI 脚本执行或未设置
ScriptInterpreterSource registry等防护
-
复现步骤(需真实 Apache + php-cgi.exe 组合):
windows-shell下载Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
立即学习“PHP免费学习笔记(深入)”;
- 下载 PHP 8.2.19 Windows VC17 x64 Thread Safe ZIP 包(含
php-cgi.exe) - 配置 Apache httpd.conf:
AddHandler cgi-script .php+Options +ExecCGI - 确保
php.ini中未设置cgi.force_redirect = 1(否则会拦截) - 发起请求:
http://localhost/test.php/%ADd+allow_url_include%3don+-d+auto_prepend_file%3dphp://input - 请求体发送:
<?php system('whoami'); ?>
- 下载 PHP 8.2.19 Windows VC17 x64 Thread Safe ZIP 包(含
注意:PowerShell/cmd 直接运行
php-cgi.exe -d allow_url_include=on -d auto_prepend_file=php://input不会触发漏洞,因为无 Windows 代码页转换环节。
为什么你在本地 cmd 或 PHPStorm 里 run php-cgi 永远复现不了?
- Windows 命令行启动
php-cgi.exe是纯 CLI 行为,不经过 Web 服务器的环境变量注入、不触发 CGI 参数解析路径、不涉及 HTTP 请求头/URL 解码链路 -
php-cgi.exe在 CLI 模式下忽略所有 CGI 特有参数(如QUERY_STRING,SCRIPT_NAME),也不会读取argv[1]作为 PHP 脚本路径(它只响应标准输入) - 所有“在 cmd 里跑
php-cgi -v就算复现”的说法,都是混淆了 CGI 模式与 CLI 模式的本质区别
容易被忽略的关键点
漏洞利用链依赖三个不可拆分的环节:Windows 系统代码页转换 → Apache/mod_cgi 的 CGI 调用方式 → php-cgi.exe 对 -d 参数的宽松解析。少一个,就只是个普通警告或直接报错。现在主流 Windows PHP 部署早已弃用 CGI,改用 php-fpm(WSL2)或 php.dll(IIS),所以这个漏洞在真实生产环境中已极难出现——但审计老系统时,仍要检查 Apache 是否还开着 Options +ExecCGI 和 php-cgi.exe 的可执行映射。


















