PHP CGI參數注入漏洞(CVE-2024-4577) 分析

發布時間 2024-06-08

一、漏洞描述


2024年6月6日,PHP官方發布了多個新版本,其中都包含對編號為CVE-2024-4577的安全漏洞的修復更新。該漏洞是PHP CGI的參數注入漏洞,是對CVE-2012-1823漏洞的修復繞過。


該漏洞產生的原因是:在PHP CGI模式下,未正確處理Windows系統中的“Best-Fit Mapping”特性,導致簡體中文、繁體中文、日文或其他受影響語言環境將某些字符錯誤的識別成了'-'。攻擊者可通過引入惡意參數實現任意代碼執行。


二、漏洞復現


如下圖所示:


圖片1.png


三、漏洞分析


CVE-2012-1823補丁的修復措施是,PHP處理傳遞進來的字符串時,在跳過前面空白符后,判斷第一位是否是'-';如果是'-',就不對后面的字符進行參數解析,比如-d,-s,-c等參數。


PHP官方的commit如下圖所示:


圖片2.png


可以看到,當運行系統環境為Windows時,PHP調用WideCharToMultiByte函數來加強對寬字符的判斷。如果轉換后的字符為'-',則將skip_getopt置為1,使得后續就不會對傳入的字符串進行參數解析。

那么,什么樣的寬字符能夠轉換后變成'-',從而繞過之前的修復呢?


以受影響的簡體中文、繁體中文、日文舉例,他們對應的Windows 代碼頁分別是936、950、932。其中都有將0x00ad映射為0x002d的操作,如下圖所示:


圖片3.png


圖片4.png


圖片5.png


因此通過引入0x00ad即可替代0x002d,實現參數注入來執行任意代碼。


四、總結


CVE-2024-4577漏洞利用簡單,危害嚴重。特別在某些對Apache、PHP進行集成部署和管理的流行軟件中,如果未正確配置php cgi,即可造成嚴重危害。



參考鏈接:


PHP官方commit

https://github.com/php/php-src/commit/4dd9a36c165974c84c4217aa41849b70a9fc19c9

DEVCORE的漏洞通報

https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability/