漏洞描述
因为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 的 include
和 require
函数包含通过 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_include
和 auto_prepend_file
)修改为有利于攻击者的值,从而达到远程代码执行(RCE)的目的。
执行结果如下:
系统命令执行
缓解措施
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]
英文版受影响吗