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”特性,導致簡體中文、繁體中文、日文或其他受影響語言環境將某些字符錯誤的識別成了'-'。攻擊者可通過引入惡意參數實現任意代碼執行。
二、漏洞復現
如下圖所示:

三、漏洞分析
CVE-2012-1823補丁的修復措施是,PHP處理傳遞進來的字符串時,在跳過前面空白符后,判斷第一位是否是'-';如果是'-',就不對后面的字符進行參數解析,比如-d,-s,-c等參數。
PHP官方的commit如下圖所示:
可以看到,當運行系統環境為Windows時,PHP調用WideCharToMultiByte函數來加強對寬字符的判斷。如果轉換后的字符為'-',則將skip_getopt置為1,使得后續就不會對傳入的字符串進行參數解析。
那么,什么樣的寬字符能夠轉換后變成'-',從而繞過之前的修復呢?
以受影響的簡體中文、繁體中文、日文舉例,他們對應的Windows 代碼頁分別是936、950、932。其中都有將0x00ad映射為0x002d的操作,如下圖所示:
因此通過引入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/