:XML 外部實體攻擊與 OOB 帶外)
XML 如今不像十年前那樣到處當(dāng)主數(shù)據(jù)格式可它從沒真正離開辦公文檔、SOAP、SAML、一大堆企業(yè)集成、支付回調(diào)、日志采集、老 RPC、安全產(chǎn)品自己的規(guī)則文件……只要服務(wù)端還在“把用戶可控的 XML 喂給解析器”XXEXML External EntityXML 外部實體就還可能從歷史書里坐起來。XXE 可怕的地方在于它常常一次性打開好幾扇門讀本地文件、打內(nèi)網(wǎng)SSRF 近親、在盲環(huán)境下靠OOBOut-of-Band帶外把數(shù)據(jù)帶回家。很多開發(fā)只聽說過“關(guān)掉外部實體”卻說不清 DTD、實體、參數(shù)實體、盲 XXE 和帶外各自在干什么——出了事只能干瞪眼。一、先補一塊 XML 基礎(chǔ)不然 XXE 永遠像黑話1. 實體是什么XML 允許定義“實體”有點像宏解析時展開成別的內(nèi)容。內(nèi)部實體在文檔里定義外部實體則可以指向外部資源URI——解析器去取這個資源再塞回文檔樹。XXE 的關(guān)鍵就在這里若解析器允許外部實體而 XML 文檔內(nèi)容又來自用戶攻擊者就能寫一個外部實體讓你的服務(wù)器去讀file:///...或請求http://內(nèi)部地址/...。2. DTD 與 DOCTYPE文檔類型定義DTD里可以聲明實體。很多 XXE 都出現(xiàn)在用戶可控的!DOCTYPE ...區(qū)域?,F(xiàn)代有人用 XSD但只要解析器仍處理 DOCTYPE/外部實體風(fēng)險就在。3. 解析器默認值是魔鬼安全問題很少出在“XML 不行”而出在“某語言某庫的默認解析器太好心”——自動加載外部 DTD、解析外部實體、跟隨網(wǎng)絡(luò)。換安全默認值往往比在業(yè)務(wù)里做字符串過濾靠譜一百倍。二、XXE 能造成什么危害1. 任意文件讀取外部實體指向本地文件 URI解析結(jié)果若回顯到響應(yīng)里攻擊者可讀到應(yīng)用能讀的文件配置、密鑰、云憑證路徑、源代碼等權(quán)限取決于進程身份。2. SSRF 式請求外部實體指向內(nèi)網(wǎng) HTTP 服務(wù)或云元數(shù)據(jù)地址效果類似 SSRF借服務(wù)器網(wǎng)絡(luò)位置去探內(nèi)網(wǎng)、碰元數(shù)據(jù)。與本系列 SSRF 文同一類后果入口換成了 XML 解析器。3. 拒絕服務(wù)經(jīng)典“億笑攻擊”Billion Laughs用嵌套實體把內(nèi)存撐爆——偏 DoS不是讀文件但同屬危險實體展開。生產(chǎn)要限實體展開深度與大小。4. 在特定生態(tài)里的升級歷史上與某些組件結(jié)合可導(dǎo)致更嚴(yán)重后果視平臺而定。評估時按“讀文件 SSRF DoS”打底再看組件版本。5. 盲 XXE解析出錯或結(jié)果不回顯時仍可能通過錯誤信息差異、時間、或OOB 帶外證實與利用。盲不代表無害。三、經(jīng)典“有回顯”XXE 的理解方式教學(xué)靶場常見路徑找接受 XML 的接口上傳 xml、SOAP、導(dǎo)入、回調(diào)提交帶 DOCTYPE 與外部實體的文檔觀察響應(yīng)是否出現(xiàn)文件內(nèi)容或內(nèi)網(wǎng)響應(yīng)片段。授權(quán)測試?yán)镉米x公開可預(yù)測文件或自有 echo 服務(wù)證明即可避免大肆讀取客戶敏感文件進報告附件。開發(fā)若看到報告請不要糾結(jié) payload 長什么樣而要問我們哪個解析器開了外部實體為什么用戶輸入能進 DOCTYPE四、盲 XXE 與 OOB 帶外深度實戰(zhàn)里最常被問的部分1. 什么叫盲服務(wù)器解析了惡意 XML但不把實體展開結(jié)果返回給你或只返回固定錯誤頁或異步解析響應(yīng)與內(nèi)容無關(guān)。這時“看頁面吃內(nèi)容”失效需要旁路信號。2. OOB 是什么意思帶外指數(shù)據(jù)或信號不走原 HTTP 響應(yīng)而走另一通道——通常是服務(wù)器向攻擊者控制的服務(wù)器發(fā)起 DNS/HTTP 請求。若解析器為了解析外部實體去解析某個域名、或請求某個 URL攻擊者就能在自己的 DNS/HTTP 日志里看到“被打到了”甚至在精心設(shè)計的場景下把數(shù)據(jù)帶出去。對防守方這意味著內(nèi)網(wǎng)主機突然對奇怪域名做 DNS可能是盲 XXE/SSRF只盯響應(yīng)內(nèi)容的 WAF可能漏掉盲利用出站流量與 DNS 日志是檢測盲 XXE 的重要傳感器。3. 參數(shù)實體與“更繞的 DTD 玩法”概念級深度資料里會談到參數(shù)實體%name、外部參數(shù)實體、多級 DTD 引用等用于在嚴(yán)格環(huán)境下仍觸發(fā)外部加載或數(shù)據(jù)外帶。細節(jié)因解析器而異且變化快。學(xué)習(xí)與授權(quán)測試的正確姿勢先確認解析器類型與版本在自建環(huán)境復(fù)現(xiàn)“是否會對外發(fā)起請求”客戶環(huán)境以證明風(fēng)險為主不把客戶數(shù)據(jù)經(jīng) OOB 拖到個人 VPS 長期存放修復(fù)驗證關(guān)閉外部實體后對外請求消失。4. OOB 的授權(quán)與合規(guī)即便有授權(quán)把客戶敏感文件內(nèi)容經(jīng)你的外帶服務(wù)器傳出也要極謹(jǐn)慎協(xié)議是否允許、數(shù)據(jù)是否加密、測完是否銷毀、報告是否脫敏。很多項目約定只允許 DNS 探測證明看是否查詢了某唯一子域不允許完整文件外帶。這是專業(yè)做法。5. 檢測盲 XXE 的防守視角應(yīng)用服務(wù)器異常 DNS隨機子域、罕見 TLD異常出站訪問攻擊者基礎(chǔ)設(shè)施XML 解析錯誤激增解析耗時異常大實體/網(wǎng)絡(luò)取實體。把這些進 SIEM比在原響應(yīng)里找文件內(nèi)容更貼近真實攻擊。五、XXE 與 SSRF、文件讀取的邊界能力常見實現(xiàn)載體讀本地文件XXEfile://、路徑穿越讀、LFI打內(nèi)網(wǎng) HTTPXXE 外部實體 HTTP、SSRF URL 拉取盲數(shù)據(jù)外帶XXE OOB、部分 SSRFDNS匯報時可寫XXE 導(dǎo)致任意文件讀取與/或 SSRF 類影響盲場景存在 OOB 風(fēng)險。修復(fù)統(tǒng)一落在解析器安全配置不要只做 URL 關(guān)鍵字過濾。六、哪里會接上用戶 XML審計清單很實用文件上傳.xml、.xsl、.svgSVG 也是 XML、Office底層大量 XML、PDF 里的某些路徑SOAP / XML-RPCSAML 斷言解析身份聯(lián)邦出事是大事故內(nèi)容類型application/xml/text/xml的 API配置導(dǎo)入、規(guī)則導(dǎo)入、報表導(dǎo)入老的 Java 系統(tǒng)、.NETXmlDocument 默認行為、PHPsimplexml等。SVG 上傳當(dāng)圖片卻服務(wù)端解析 XML是經(jīng)典坑。圖片處理管道也要問一句會不會走 XML 解析器七、防御深度關(guān)掉外部實體是第一義1. 原則禁止解析外部實體禁止外部 DTD 加載如需 DTD僅用本地可信 DTD且不可被用戶指定限制實體展開規(guī)模防 DoS業(yè)務(wù)能改 JSON 就少暴露 XML 入口。2. Java 生態(tài)高頻Java 歷史事故多因為常用解析器默認值不友好。按所用庫DocumentBuilder、SAX、XMLReader、Transformer 等查閱當(dāng)前官方安全編碼指南顯式設(shè)置禁止 DOCTYPE / 外部通用實體 / 外部參數(shù)實體等特性名稱隨 API 變化使用經(jīng)過安全封裝的庫或框架默認安全配置升級到仍維護的版本。不要抄十年前的 Stack Overflow 片段就上生產(chǎn)。以 OWASP XXE Prevention Cheat Sheet 與廠商文檔為準(zhǔn)做進統(tǒng)一XmlUtils禁止業(yè)務(wù)私自new DocumentBuilderFactory()。3. .NETXmlResolver相關(guān)默認值、XmlReaderSettings禁止 DTD 等——同樣按當(dāng)前文檔配置。老代碼XmlDocument.Load用戶輸入要逐個審。4. PHPlibxml_disable_entity_loader在老版本討論很多PHP 8 行為有變化需按版本查閱。simplexml_load_*、DOMDocument加載用戶 XML 前統(tǒng)一安全封裝。5. Pythonlxml、標(biāo)準(zhǔn)庫等要注意是否解析外部實體優(yōu)先安全默認的解析方式避免讓用戶控制 DOCTYPE。6. 網(wǎng)關(guān)與 WAF可攔明顯的!DOCTYPE、ENTITY、SYSTEM關(guān)鍵字輔防。編碼、截斷、換入口SVG能繞。主防永遠在解析器。7. 網(wǎng)絡(luò)層縱深即便 XXE 觸發(fā)若主機不能出網(wǎng)、不能碰元數(shù)據(jù)、文件權(quán)限極小危害下降。這與 SSRF 防御同一套出站策略。八、授權(quán)測試實戰(zhàn)流程1. 識別入口抓包找 XML改Content-Type試 XML上傳 SVG/XML看 SOAP。2. 判斷解析器是否處理 DOCTYPE在授權(quán)環(huán)境提交帶外部實體的測試文檔觀察是否報錯提及 DTD/實體是否引發(fā)對外 DNS用你控制的唯一域名僅證明用是否回顯文件內(nèi)容。3. 定級能讀敏感文件或打元數(shù)據(jù) → 高危/嚴(yán)重僅 DoS → 看環(huán)境僅證明解析外部 DTD → 至少中高危接近可利用。4. 修復(fù)驗證關(guān)外部實體后同樣請求應(yīng)失敗或忽略實體且不再出現(xiàn)對外 DNS/HTTP?;貧w測試留樣例進 CI安全測試包。5. 報告寫法寫入口、解析組件若可知、危害類型讀文件/SSRF/盲 OOB 風(fēng)險、修復(fù)為“統(tǒng)一安全解析配置”、附驗證步驟。不附帶客戶敏感文件全文。九、常見誤區(qū)“我們不用 XML?!遍g接用Office、SVG、SOAP、第三方庫。“WAF 攔了 DOCTYPE?!睋Q編碼或換文件格式入口可能繞過且盲 OOB 不一定靠響應(yīng)?!爸贿^濾 SYSTEM 關(guān)鍵字?!焙诿麊斡螒蚪馕銎魈匦蕴?。“內(nèi)網(wǎng)服務(wù)所以沒事?!盭XE 讀的是服務(wù)器本地文件內(nèi)網(wǎng)一樣 aggh?!懊?XXE 不能利用?!監(jiān)OB 與錯誤差異都可能讓風(fēng)險落地。十、收尾XXE 的本質(zhì)是XML 解析器太勤快用戶文檔太自由服務(wù)器既當(dāng)解析器又當(dāng)客戶端。有回顯時它像任意文件讀取無回顯時它靠 OOB 帶外證明自己還活著再往前走就和 SSRF、云憑證事故握手。防御不必神秘禁止外部實體與外部 DTD統(tǒng)一安全解析器限制出站少讓用戶直接喂 XML。今晚若只做一件事找出項目里所有解析 XML 的地方含 SVG、SOAP看是否統(tǒng)一關(guān)閉了外部實體同時在測試環(huán)境打一個應(yīng)觸發(fā)外部 DNS 的樣例確認加固后 DNS 不再出現(xiàn)。這兩步做完你對 XXE 與 OOB 的“深度實戰(zhàn)”就從名詞落到了可驗證的工程狀態(tài)。附入口檢查清單APIapplication/xml文件導(dǎo)入 XML/XSLSVG 上傳與渲染SOAP/SAMLOffice 文檔處理管道