总有些事情让你周末忙个不停......昨天爆出的PHP 漏洞:CVE-2024-4577,漏洞评分高达 9.8 分(CVSSv3),虽然实际影响范围可能不大,但由于漏洞实在太容易利用而不可掉以轻心。
笔者:国际认证信息系统审计师、软考系统分析师、软件工程硕士
话说我仿佛听到有同学说,让安全运维服务外包方搞定就行。
但甲方自己是否也应该核实一下,安服那边是否真搞定了?
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 模式早应该淘汰和禁用)
由于 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程序代码。
(大约就是这样)
注意对于运行简体中文(代码页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 概念验证代码,我这里就不搬运了。
本站微信订阅号:
本页网址二维码: