关于PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)简要说明

关于PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)简要说明

原创 key 中孚安全技术研究 2024-06-07 19:40

漏洞信息

2024年06月06日DEVCORE组织发布了漏洞通报,称其报送了
PHP CGI Windows平台远程代码执行
漏洞(CVE-2
024-4577

。并且PHP官方也在当天发布了修
复版本。

漏洞的本质就是基于
CVE-2012-182
3
的基础上结合Windows字符编码的Best Fit特性,对其已发布的补丁进行绕过,从而继续在PHP- CGI环境下进行参数拼接,达到远程代码执行的目的。

该漏洞要求Windows操作系统需为:繁体中文、简体中文、日文,这三个其中之一的语言版本。

漏洞影响版本如下(XAMPP默认安装的配置下可以直接利用):

PHP 8.3 < 8.3.8
                     PHP 8.2 < 8.2.20
                     PHP 8.1 < 8.1.29

简要说明

CVE-2012-1823

早在2017年
P
HITHON
师傅已经对
C
VE-2012-1
823
漏洞进行过分析和文章分享。

简要概括就是,当将PHP的环境设为CGI模式下运行时,请求参数部分就会带入作为
php-cgi.exe
的参数,因此可以通过
-d
来设定参数
allow_url_include

auto_prepend_file
(勾起N年前学文件包含的回忆),将完整的参数信息(需要URL编码)带入到请求参数中,发送请求达到代码执行的目的。    

CVE-2024-4577

补丁分析

根据PHP漏洞修复的Commit提交信息
来看,在
cgi_main.c
文件中,原有的逻辑新增了对Windows环境的单独逻辑判断,并且其中对请求参数使用了
WideCharToMultiByte
函数,即宽字节的转换。

因此结合已知的漏洞信息,确认此处是编码问题导致的。也就表示我们需要绕过的逻辑是
if(*p == ‘-‘)
,即请求参数第一个字符不能为

结合补丁信息我们知道在带入参数拼接前,宽字节会被转换。所以,以简体中文的Windows版本(
在Windows中使用Page 936表示GBK编码
)为例,对应的编码表信息,我们可以在该链接中找到:
https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit936.txt    

通过搜索我们得知
0x00ad
可以被解码为
0x002d
也就是上文中提到的

符号。

漏洞复现

下载安装XAMPP,配置好Apache的配置文件
httpd-xampp.conf
,使得其以CGI模式来运行
.php
文件。

基于CVE-2012-1823
将请求参数中的

替换为
%ad
,带入尝试发现漏洞成功复现,也就验证了我们之前的分析。    

总结

漏洞场景实际有两种,这点在DEVCORE的漏洞通报中也提到了。由于漏洞影响面积较大,因此本文仅做第一点场景的说明。

抛开漏洞场景,这个漏洞启发了我,要熟悉了解各类机制、特性,组合起来就可能导致某些已修复的漏洞被再次利用。

最后引用猪猪侠的话:知识面决定攻击面。

参考链接****

DEVCORE组织发布的漏洞通报:
https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability/

PHP漏洞修复的Commit提交信息:
https://github.com/php/php-src/commit/4dd9a36c16#diff-680b80075cd2f8c1bbeb33b6ef6c41fb1f17ab98f28e5f87d12d82264ca99729R1798

PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析:
https://www.leavesongs.com/PENETRATION/php-cgi-cve-2012-1823.html