駭客協助破解 HACKGO.NET
本文分析了由DEVCORE團隊研究發現的PHP CGI在Windows平臺的遠程代碼執行漏洞(CVE-2024-4577),探討了漏洞的技術細節、背景、利用條件以及修復建議。PHP官方團隊已於2024年6月6日PO了新版本修復CVE-2024-4577,該漏洞利用前置條件較低且危害較大,建議盡快升級到安全版本。
0x00 漏洞概述
CVE-2024-4577是一個影響在Windows平臺上運行的PHP CGI的遠程代碼執行漏洞。
漏洞的存在是因為PHP在設計時未能預見到Windows的Best-Fit字符編碼轉換特性,這使得攻擊者可以通過構造特定的請求來繞過安全限制。受影響的環境包括使用特定語繫設定的Windows繫統,如簡體中文(936)、正體中文(950)和日文(932)。
0x01 影響範圍
PHP 8.3 < 8.3.8
PHP 8.2 < 8.2.20
PHP 8.1 < 8.1.29
其他版本的PHP官方已不在維護,建議根據實際情況升級到安全版本或者關閉php-cgi的使用。
0x02 復現
使用php://input流接收POST請求傳入的參數實現RCE
{host}/php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1
+%ADd+auto_prepend_file%3dphp://input

0x03 漏洞背景
PHP的SAPI(Server Application Programming Interface)是PHP為了在不同服務器環境中運行而提供的一套應用程式編程接口。SAPI定義了PHP如何與其所在環境的Web服務器或其它類型的服務器進行交互。簡而言之,SAPI是PHP與服務器軟體通信的橋梁。
在PHP中,通常有三種主流的SAPI實現方式:
PHP-FPM:這是一種FastCGI協議的解析器,它的主要任務是接收來自Web服務器,按照FastCGI協議格式封裝的請求數據,併將其傳遞給PHP解釋器進行處理。
mod_php:這是Apache服務器的一個模塊,專門用於處理PHP和Apache之間的數據交換工作。
PHP-CGI:它具備兩種模式的交互能力,既可以作為CGI程式運行,也可以作為FastCGI服務運行。PHP-CGI在以CGI模式運行時爆出了安全漏洞CVE-2012-1823 。
發現漏洞的團隊也用了這個趣圖來比喻這三種SAPI。

回顧CVE-2012-1823這一PHP CGI環境下的安全缺陷,Web服務器將HTTP請求解析後轉發給PHP腳本。以http://host/cgi.php?a=b為例,該請求可能在命令行中以php.exe cgi.php a=b的形式被處理。
根據RFC3875的規範,如果查詢字符串內缺少未解碼的等號,那麽整個查詢字符串應當被視為CGI的參數進行傳遞。這便意味著,如果URL中的查詢字符串部分省略了等號,它將未經適當處理就被傳遞給php-cgi,為攻擊者提供了註入非法命令行參數的機會。要有效利用這一漏洞,需了解php-cgi支援哪些命令行參數。

使用-d參數來指定配置項的值實現RCE:allow_url_include選項如果被設定為On,PHP將允許包含(include)通過URL指定的文件,auto_prepend_file%3dphp%3a//input:這個參數設定auto_prepend_file配置項,使其指嚮php://input流。php://input是一個可以讀取通過POST方法發送到腳本的原始數據的流。通過設定這個配置,攻擊者可以控制PHP腳本執行前自動包含的文件,這裏實際上是包含了通過POST發送的數據。

0x04 漏洞原理
CVE-2024-4577是依托於Windows繫統中字符編碼轉換的Best-Fit特性對CVE-2012-1823的繞過。Windows繫統中字符編碼轉換的Best-Fit特性是指Windows操作繫統在處理不同字符編碼集之間的轉換時使用的一種匹配機制。當繫統中存在無法直接映射到目標編碼集的字符時,Best-Fit特性會嘗試尋找一個在語義或外觀上最接近的字符來進行替代顯示或處理。
這種特性在多語言支援和國際化軟體的開發中非常重要,因為它可以提高不同語言環境下用戶界面的可讀性和一致性。然而,在某些情況下,Best-Fit特性也可能帶來安全隱患,尤其是在處理來自不可信來源的輸入時。例如,在Web應用中,如果攻擊者能夠利用Best-Fit特性將特殊字符轉換為具有不同語義的字符,就可能繞過安全檢查,導致安全漏洞,如這次的CVE-2024-4577就是利用了%ad這個特殊字符,通過Best-Fit匹配到的是連字符("-")。
檢視這次補丁的commit來分析為什麽是連字符("-"):
https://github.com/php/php-src/commit/4dd9a36c16#diff-680b80075cd2f8c1bbeb33b6ef6c41fb1f17ab98f28e5f87d12d82264ca99729R1798

PHP的源代碼中原先已經實現了對特定字符(如連字符-)的過濾邏輯,這是對CVE-2012-1823的修復代碼,如下是CVE-2012-1823的poc,對比CVE-2024-4577的poc可以看到,主要差別在於(連字符-)變成了%AD。

通過使用%ad代替常規的連字符-,繞過了原本應該阻止參數傳遞的安全機制,導致攻擊者能夠成功註入併執行非法的參數,為了修復CVE-2024-4577,在最新的代碼更新中,考慮到了Windows繫統中Best-Fit特性的影響,將所有高於0x80的字符也納入了限制範圍。代碼註釋中對此也進行了詳細說明,闡述了採取這一措施的背景。
在CVE-2024-4577的poc中可以看到多了一個參數選項cgi.force_redirect。因為PHP增加了一個預設開啟的配置cgi.force_redirect=1,僅允許通過重定嚮規則的請求來執行PHP CGI,不允許直接訪問執行,要繞過這一特性,可以採取以下方法:
既然已經通過-d參數成功修改了其他配置,那麽同樣可以直接使用-d參數將cgi.force_redirect的值改為0,從而關閉這一重定嚮規則限制。

預設配置的XAMPP受影響的原因:
在 confextrahttpd-xampp.conf 中存在如下的配置項
ScriptAlias /php-cgi/ "/xampp/php/"
<Directory "/xampp/php">
AllowOverride None
Options None
Require all denied
<Files "php-cgi.exe">
Require all granted
</Files>
</Directory>
ScriptAlias指令的意義是當用戶訪問網站的`/php-cgi/`路徑時,將請求映射到了在地的`/xampp/php/`目錄。這個目錄包含了PHP環境的所有文件和組件,而該目錄下就包含有php-cgi.exe程式。
當我們使用最早公開的poc,發現併不能復現
/cgi-bin/php-cgi.exe?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input
/php-cgi/php-cgi.exe?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input
原因就是為了驗證請求是通過Web服務器的Action指令發起的,而不是用戶直接對php-cgi進行的請求,php-cgi設定了“cgi.force_redirect”這一安全特性。該特性預設開啟,它確保只有遵循特定重定嚮流程的請求才會被php-cgi處理,這樣可以有效避免直接對php-cgi的潛在不當訪問,於是在POC中添加-d cgi.force_redirect=0關閉這個校驗規則,就可繞過限制。HACKGO駭客網站來自暗網菁英集群!尋求駭客服務請聯繫我們!
#爬蟲 #網站數據包提取 #客戶名單提取 #網站滲透 #駭入伺服器 #app破解
#成績單更改 #大學成績單更改 #數據更改 #服務器滲透 #植入木馬 #駭入電腦
#駭入公共攝像頭 #定位服務 #銀行數據更改 #執法部門數據更改 #更改數據
#ig私人號破解 #FB私人號破解 #LINE私人號破解 #各種賬號破解 #
#詐騙款項追回 #駭客追回 #eth追回服務 #btc追回服務 #usdt追回服務
#比特幣追回服務 #以太幣追回服務 #泰達幣追回服務 #USDC追回服務
#僱傭駭客 #駭客接單 #暗網駭客 #駭客服務 #駭客 #hacker #駭客委托
#駭入私人攝像頭 #駭入博弈網站 #網站維護 #暴力破解 #駭入數位貨幣交易所