高危 PHP 漏洞可繞過(guò)驗(yàn)證加載惡意內(nèi)容
PHP的libxml流組件中發(fā)現(xiàn)一個(gè)高危漏洞,可能影響依賴(lài)DOM或SimpleXML擴(kuò)展處理HTTP請(qǐng)求的Web應(yīng)用程序。該漏洞編號(hào)為CVE-2025-1219,源于處理重定向資源時(shí)對(duì)content-type標(biāo)頭的錯(cuò)誤處理,可能導(dǎo)致文檔解析錯(cuò)誤和驗(yàn)證繞過(guò)等安全風(fēng)險(xiǎn)。
受影響PHP版本包括:
- 8.1.32以下版本
- 8.2.28以下版本
- 8.3.18以下版本
- 8.4.5以下版本
漏洞技術(shù)細(xì)節(jié)
當(dāng)HTTP流包裝器跟隨重定向時(shí),該漏洞會(huì)觸發(fā)。系統(tǒng)未在執(zhí)行后續(xù)請(qǐng)求前清除先前捕獲的標(biāo)頭,而是將多個(gè)請(qǐng)求的標(biāo)頭追加到同一數(shù)組中,導(dǎo)致最終數(shù)組包含所有請(qǐng)求的標(biāo)頭(最后請(qǐng)求的標(biāo)頭位于末尾)。
函數(shù)php_libxml_input_buffer_create_filename()或php_libxml_sniff_charset_from_stream()會(huì)掃描該數(shù)組尋找content-type標(biāo)頭以確定響應(yīng)字符集。但系統(tǒng)會(huì)從上至下順序處理標(biāo)頭,并在遇到首個(gè)content-type標(biāo)頭時(shí)停止。根據(jù)PHP報(bào)告,該標(biāo)頭可能不對(duì)應(yīng)最終包含待解析HTML正文的響應(yīng),從而導(dǎo)致文檔可能以錯(cuò)誤字符集解析,引發(fā)安全隱患。
攻擊者可利用該漏洞通過(guò)操縱字符集檢測(cè)來(lái)改變文檔解析方式,具體表現(xiàn)為:
- 文檔可能被錯(cuò)誤解讀,改變其原意
- 若文檔解析錯(cuò)誤,驗(yàn)證流程可能被繞過(guò)
- 使用->saveHtml()等方法導(dǎo)出文檔時(shí),可能保留原始字符集導(dǎo)致意外輸出
- 使用PHP的DOM或SimpleXML擴(kuò)展處理HTTP請(qǐng)求的應(yīng)用程序尤其易受攻擊。
漏洞驗(yàn)證實(shí)例
概念驗(yàn)證(PoC)展示了漏洞利用方式:
- 重定向腳本(redirect.php)發(fā)送指定字符集(utf-16)的content-type標(biāo)頭并重定向到其他資源
- 通過(guò)PHP的DOMDocument或SimpleXML擴(kuò)展訪(fǎng)問(wèn)時(shí),系統(tǒng)錯(cuò)誤地使用初始content-type標(biāo)頭而非最終響應(yīng)的標(biāo)頭進(jìn)行解析
該行為可導(dǎo)致解析錯(cuò)誤和驗(yàn)證繞過(guò),例如導(dǎo)出的HTML內(nèi)容在篡改后仍保留原始字符集。
PHP開(kāi)發(fā)團(tuán)隊(duì)已在以下版本修復(fù)該問(wèn)題:
- PHP 8.1.32
- PHP 8.2.28
- PHP 8.3.19
- PHP 8.4.5
緩解措施
為防范CVE-2025-1219漏洞,強(qiáng)烈建議用戶(hù)將PHP升級(jí)至上述已修復(fù)版本:
- 使用php -v命令檢查當(dāng)前版本
- 通過(guò)包管理器更新系統(tǒng),或從php.net下載更新后的二進(jìn)制文件
- 更新后重啟所有依賴(lài)PHP的服務(wù)
CVE-2025-1219暴露了PHP使用libxml流處理HTTP重定向時(shí)的關(guān)鍵缺陷,對(duì)通過(guò)HTTP請(qǐng)求解析文檔的應(yīng)用程序構(gòu)成風(fēng)險(xiǎn)。該漏洞再次凸顯定期更新軟件以應(yīng)對(duì)新興安全威脅的重要性。