CVE-2024-4577仅影响Windows平台,因依赖其Best-Fit字符编码转换特性(如%AD映射为“-”),该机制在Linux/macOS等POSIX系统中不存在;漏洞触发还需系统区域设置为简体中文936、繁体中文950或日文932代码页,英文或其他locale下即使使用PHP 8.3.7亦不受影响。

PHP 8.3.7 的 php-cgi 漏洞(CVE-2024-4577)只影响 Windows
这个漏洞不是跨平台的——它**仅在 Windows 系统上触发**,Linux、macOS 或其他类 Unix 系统完全不受影响。根本原因在于漏洞依赖 Windows API 的字符编码“Best-Fit”转换行为(比如将 %AD 这类字节映射为 ASCII 字符),而该机制在 POSIX 系统中不存在。
为什么只有特定 Windows 区域设置才中招
漏洞实际生效需要同时满足两个条件:
- 运行环境是 Windows(任意版本:7/10/11/Server 2012+)
- 系统区域设置(Locale)启用了以下任一代码页:
936(简体中文)、950(繁体中文)、932(日文)
如果你的 Windows 是英文 locale(如 1252 或 65001 UTF-8),即使跑着 PHP 8.3.7 + php-cgi,攻击请求也会被正常拒绝,不会解析恶意参数。
Apache + php-cgi 在 Windows 上的典型暴露路径
漏洞利用不依赖 Web 服务器类型,但常见于以下 Apache 配置组合:
立即学习“PHP免费学习笔记(深入)”;
-
ScriptAlias /php-cgi/ "C:/xampp/php/"(XAMPP 默认开启) -
SetHandler application/x-httpd-php-cgi+Action指向php-cgi.exe - 手动把
php-cgi.exe放进/cgi-bin/目录并允许执行
只要 CGI 模式启用且系统 locale 符合上述三者之一,php-cgi.exe 就可能被绕过 CVE-2012-1823 补丁,接收形如 ?%ADd+allow_url_include=1 的畸形查询串。
别被“PHP 版本号”误导:漏洞本质是 Windows 子系统问题
很多人看到 PHP 8.3.7 在影响列表里,就以为升级到 8.3.8 就万事大吉——但要注意:
- 哪怕你用的是 PHP 8.1.28(已 EOL),只要系统 locale 是
936,且开了php-cgi,照样中招 - 反过来,如果你用的是 PHP 8.3.7,但系统设成了英文 locale,或部署在 Linux 容器里,那它就是安全的
- 临时缓解措施(如注释掉
ScriptAlias)比盲目升级更直接有效,尤其对无法立即更新 PHP 的生产环境
真正要检查的不是“PHP 装在哪儿”,而是“Windows 控制面板 → 区域 → 管理 → 更改系统区域设置”里选的是哪个代码页,以及 Apache 是否把 php-cgi.exe 暴露给了外部请求。



















