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

作者:Sender Su  来源:本站原创  发布日期:2024-06-08  最后修改日期:2024-06-08

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

article banner

笔者:国际认证信息系统审计师、软考系统分析师、软件工程硕士

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

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

一、防御方法

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等更低版本的PHP全部受影响。

利用条件

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

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

或者:


    SetHandler application/x-httpd-php-cgi

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

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

三、漏洞原理

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

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

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

关键在于,在进行字符集转换时,Windows 会根据预设的转换关系,把它认为是双字节的 UTF-16 字符按匹配表直接转换为单字节也即 ASCII 字符集的字符。

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

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

same picture

(大约就是这样)

注意对于运行简体中文(代码页936)、繁体中文(代码页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 概念验证代码,我这里就不搬运了。

本栏目相关
  •  2024-07-23 攻防演练与蓝屏:此时不推进软件供应链安全管理,更待何时
  •  2022-05-11 CIS-CAT 配置评估工具介绍及操作实践
  •  2022-03-16 Windows 系统安全基线及软件工具介绍
  •  2022-08-28 网络攻防中的色彩象征
  •  2022-03-11 安装RHEL/CentOS时如何选择配置安全策略?
  •  2022-03-25 从甲方角度介绍“CIS互联网安全中心”
  •  2022-03-17 详细了解微软安全合规工具包(SCT)
  •  2023-02-27 注意:TightVNC 2.8.75 释出,修补 zlib 漏洞 CVE-2022-37434
  •  2022-03-28 如何应用CIS互联网安全中心发布的《CIS关键安全控制措施集》之一:总览
  • 本站微信订阅号:

    微信订阅号二维码

    本页网址二维码: