戴夫寇爾研究團隊在進行前瞻攻擊研究期間,發現 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 目錄下也受此弱點影響,常見情況包含但不限於:
- 將
php.exe
或php-cgi.exe
複製到/cgi-bin/
目錄中 - 將 PHP 安裝目錄透過
ScriptAlias
暴露到外,如:ScriptAlias /php-cgi/ "C:/xampp/php/"
修補建議
強烈建議所有使用者升級至 PHP 官方最新版本 8.3.8、8.2.20與 8.1.29,對於無法升級的系統可透過下列方式暫時緩解弱點。
除此之外,由於 PHP CGI 已是一種過時且易於出現問題的架構,也建議評估遷移至較為安全的 Mod-PHP、FastCGI 或是 PHP-FPM 等架構可能性。
1. 對無法更新 PHP 的使用者
可透過下列 Rewrite 規則阻擋攻擊,請注意此份規則只作為繁體中文、簡體中文及日文語系中的暫時性緩解機制,實務上仍建議更新到已修復版本或更改架構。
RewriteEngineOnRewriteCond %{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.8、8.2.20與 8.1.29。