周末补漏洞:PHP CGI Windows平台远程代码执行漏洞 CVE-2024-4577

周末补漏洞:PHP CGI Windows平台远程代码执行漏洞 CVE-2024-4577

原创 SenderSu wavecn 2024-06-08 17:59

总有些事情让你周末忙个不停……昨天爆出的PHP 漏洞:CVE-2024-4577,漏洞评分高达 9.8 分(CVSSv3),虽然实际影响范围可能不大,但由于漏洞实在太容易利用而不可掉以轻心。

笔者:

国际认证信息系统审计师(CISA)

软考系统分析师

软件工程硕士

话说我仿佛听到有同学说,让安全运维
服务外包方搞定就行。

但甲方自己是否也应该核实一下,安服那边是否真搞定了?

一、防御方法

1、如果在用的是 PHP 8.1~8.3,升级 PHP 版本到最新版 8.3.8、8.2.20 或 8.1.29。

2、如果在用的是 PHP 8.0 及更低版本,迁移到 LINUX 平台 或升级信息系统代码兼容 PHP 8.1 及以上版本。

3、设置 WAF 设备规则,拦截包含有如下字符串的URL,但不排除会有拦截过头的负面作用或后续被再次绕过:

%ad
allow_url_include
auto_prepend_file

4、设置 Apache 通过 Rewrite 规则拦截,仅对简中、繁中及日文环境有效,其他语言环境尚不确定,且同样有可能是拦截过头和被再次绕过:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]

5、对于 XAMPP 使用者,修改 Apache 配置文件,把php-cgi的设置即例如

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

注释掉。 

注意:
由于该漏洞属于 PHP 本身,因此 HTMLPurifier 之类的基于 PHP 本身运行的过滤拦截手段无效。

6、重构信息系统,从PHP CGI架构迁移到 Mod-PHP 之类的新执行方式。

二、漏洞细节

漏洞类型

代码注入

漏洞评价

容易利用,严重威胁。

漏洞具体影响范围

PHP 8.3 < 8.3.8,
PHP 8.2 < 8.2.20,

PHP 8.1 < 8.1.29 以及 
PHP 8.0、PHP 7.X和PHP 5.X等更
低版本的
PH
P全部受影响。

利用条件

1、Windows 环境,
启用了 PHP CGI 模式,即 Apache 的配置包含了:

AddHandler cgi-script .php
Action cgi-script "/cgi-bin/php-cgi.exe"

或者:

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php-cgi
</FilesMatch>
Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"

2、Windows 环境,未启用 PHP CGI 模式,但 PHP 执行程序暴露在 
WEB 可访问的目录内,
典型如 XAMPP 开发环境的默认设定。具体包括:

把 php.exe 或者 php-cgi.exe 复制到了 Apache 的 cgi-bin 目录中;或者在 Apache 的配置中用 ScriptAlias 暴露了 PHP 的安装目录,比如:

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

(PHP-CGI 模式早应该淘汰和禁用)

三、漏洞原理

由于 WINDOWS 环境下对字符集编码的处理存在“最佳适合”机制而导致在字符集编码转换过程出现歧义,传入的参数因为错误转换后转为可执行的代码。

所谓最佳适合机制,是指在 Unicode(UTF-16)字符和 SBCS/DBCS 单/双字节字符集之间进行字符转换时的一种匹配机制。

现在的 Windows 系统内默认使用 Unicode 字符集,具体为 UTF-16 即固定用两字节(16位)表示一个字符的方式。但中日韩CJK环境下,Windows 需要保留对过往基于单字节 ASCII 字符集(或称为SBCS)扩充得到的双字节 DBCS 字符集的兼容性,并支持在 Unicode 和 SBCS/DBCS 之间进行转换。

关键在于,在进行字符集转换时,Windows 会根据预设的转换关系,把

认为是
双字节的 UTF-
16 字符按匹配表直接转换为
单字节
也即 A
SCII 字符集的字符。

于是,它就会把 %ad 被URL转义为UTF-16 字符后,再转换为“-”(减号)。
从而导致传入的参数被错误地转
义,PHP 解析器就不再对参数的后续内容进行解析。

经过进一步利用(比如 allow_url_include、auto_prepend_file 等,参见各种 POC 代码),就可以实现
直接
执行从参数传入的任意PHP程序
代码。

(大约就是这样)

注意对于
运行简体

文(
代码页9
36)
、繁体
中文(
代码页950


日文(代码页932)的 WINDOWS 环境已经验证漏洞可被有效利用,其他语言环境也同样可能被利用。

CVE-2024-4577 实际是十多年前的 CVE-2012-1823 的绕过补丁,当时影响的版本是 PHP 5.13.12 和  PHP 5.4.2,是在 2012 年的一次 CTF(夺旗)比赛事件中发现的。
实际上该漏洞被认为是已经不为人知地存在了至少8年。

四、漏洞利用现状

由于漏洞实在太容易被理解,从昨天即6月7日开始,Shadowserver Foundation 等安全组织已经发现和拦截到基于 CVE-2024-4577 的攻击试探,其他安全研究员也陆续在社交媒体和 GITHUB 上发布各种 POC 概念验证代码,我这里就不搬运了。

点赞和转发都是免费的
↓ 

还可以看看这些内容:

有什么蛛丝马迹可以判断系统存在SQL注入漏洞,且如何临时应对?

Windows “主题出血” 高分漏洞的预防和分析

沉渣泛起之Windows10年历史老漏洞重出江湖