CVE-2024-4577 PHP CGI参数注入漏洞-复现

_hd_resize.jpg

漏洞描述

因为Windows操作系统中编码转换的Best-Fit特性,使得未经身份验证的攻击者可以通过特定的字符序列绕过此前CVE-2012-1823的防护,通过参数注入攻击在远程PHP服务器上执行任意代码。

影响范围

该漏洞影响Windows操作系统上安装的所有PHP版本,具体影响情况见下:

  • PHP 8.3 < 8.3.8
  • PHP 8.2 < 8.2.20
  • PHP 8.1 < 8.1.29

漏洞复现

漏洞复现环境: win11 Pro + XAMPP v3.3.0 + PHP 8.1.25

场景一:在CGI的模式下运行PHP

在配置Action指令将相应的 HTTP 请求映射到 Apache HTTP Server 中的 PHP-CGI 可执行二进制文件时,可直接利用此漏洞。受影响的常见配置如下:

AddHandler cgi-script .php
Action cgi-script "/cgi-bin/php-cgi.exe"

或者

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php-cgi
</FilesMatch>
Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"

在Aache配置文件httpd.conf 中做如下配置

配置

详细解释如下:
1.<FilesMatch ".php$">
<FilesMatch>:用于匹配文件名。"\.php$" 是一个正则表达式,匹配所有以 .php 结尾的文件。这个部分表示所有以 .php 结尾的文件都将应用内部的配置。

2.SetHandler application/x-httpd-php-cgi
SetHandler:设置了处理匹配文件的处理程序。在这个例子中,application/x-httpd-php-cgi 被设置为处理程序。这意味着所有匹配 <FilesMatch "\.php$">的文件都将由 application/x-httpd-php-cgi 处理。

3.Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"
Action :定义了 application/x-httpd-php-cgi 处理程序应该执行的操作。在这个例子中,它指定了一个 CGI 脚本 /php-cgi/php-cgi.exe。这意味着当 Apache 遇到一个需要由 application/x-httpd-php-cgi 处理的文件时,它将调用这个 CGI 脚本。

工作原理

当 Apache 服务器收到一个请求,并且请求的文件是以 .php 结尾的

Apache 会使用 FilesMatch 匹配到这个文件。
然后 SetHandler 指定的处理程序 application/x-httpd-php-cgi 会被调用。
最后,Action 指令会告诉 Apache 调用 /php-cgi/php-cgi.exe 来处理这个请求。

典型用途

这种配置方法通常用于设置 PHP 文件的 CGI 处理方式。这在某些情况下可能需要,比如当你希望使用 CGI 方式处理 PHP 请求而不是模块化方式(如 mod_php)。

示例

假设服务器上有一个名为index.php 的文件:
当用户请求 test.php 时,Apache 会根据上述配置:
匹配到 test.php 文件,因为它符合正则表达式 \.php$。
使用 application/x-httpd-php-cgi 处理程序。
调用 /php-cgi/php-cgi.exe 来处理这个 PHP 文件。
最终,PHP 文件的输出 "Hello, world!" 将被返回给客户端。

通过POC 进行验证,成功导致系统命令执行,POC来自于watchTowr
命令执行

场景二:公开PHP二进制文件,(这也是XAMPP的默认配置)

即使 PHP 没有配置为 CGI 模式,仅仅将 PHP 可执行文件暴露在 CGI 目录中也会受到此漏洞的影响。常见场景包括但不限于:

1、将php.exe或复制php-cgi.exe到/cgi-bin/目录。
2、通过指令公开 PHP 目录ScriptAlias,例如:

ScriptAlias /php-cgi/ "XAMPP_PATH/php/"

利用

通过Burp Suite进行抓包,构造参数进行代码注入;%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input
参数详细说明如下:
经过解码后得到

­d allow_url_include=1 ­d auto_prepend_file=php://input
其中,`%AD `是一个非打印字符(在 ISO-8859-1 编码中,它是一个软连字符),可能用于尝试混淆或绕过某些安全检测机制。

解码后的字符串包含两个部分:
-d allow_url_include=1
-d auto_prepend_file=php://input

1、-d allow_url_include=1
这部分使用了 -d 参数来修改 PHP 配置选项 allow_url_include,将其设置为 1。此配置选项允许 PHP 的 includerequire 函数包含通过 URL 提供的文件,这通常是禁用的,因为它会带来重大的安全风险。例如,开启此选项可能允许攻击者通过 URL 远程包含恶意的 PHP 文件。

2、-d auto_prepend_file=php://input
这部分同样使用了 -d 参数来设置 PHP 配置选项 auto_prepend_file,其值为 php://input。auto_prepend_file 选项允许在每个请求之前自动包含一个文件,而 php://input 是一个 PHP 输入流,通常包含原始 POST 数据。通过设置 auto_prepend_file=php://input,攻击者可能试图在每次请求之前包含来自 POST 请求的原始数据,从而执行任意代码。

这种注入字符串的意图通常是利用 PHP 配置的漏洞,通过将特定的配置选项(如 allow_url_includeauto_prepend_file)修改为有利于攻击者的值,从而达到远程代码执行(RCE)的目的。

执行结果如下:

phpinfo

系统命令执行

calc

缓解措施

1、升级到最新的 PHP 版本8.3.8、8.2.20、8.1.29
2、修改以下 Apache HTTP Server 配置来避免受到该漏洞的影响:打开XAMPP_PATH/apache/conf/extra/httpd-xampp.conf 找到相应的行并注释掉:ScriptAlias /php-cgi/ "XAMPP_PATH/php/"
3、重写规则,但是仅对繁体中文、简体中文和日语语言环境起到临时缓解作用。

RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]

One thought on “CVE-2024-4577 PHP CGI参数注入漏洞-复现

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注