本文旨在作為 React 技術(shù)棧的 XML 外部實體漏洞指南和示例,以及它可能對您的安全造成的潛在影響。我們將討論以下主題:?
需要強(qiáng)調(diào)的是,我們將在 React 開發(fā)堆棧的背景下探索 XML 外部實體攻擊。因此,要充分利用本文,您需要具備 JavaScript 和 React 平臺的經(jīng)驗。
讓我們首先解釋一下什么是 XML 外部實體。
XML,即可擴(kuò)展標(biāo)記語言,是一種用于存儲、傳輸和重建任意數(shù)據(jù)的標(biāo)記語言和文件格式。此外,這種語言還用于編程領(lǐng)域,定義以人機(jī)可讀格式對文檔進(jìn)行編碼的規(guī)則。?
好吧,但是文件結(jié)構(gòu)如何會對您的應(yīng)用程序構(gòu)成威脅呢?
默認(rèn)情況下,XML 處理工具允許在 XML 文件解析期間檢索和處理外部實體(URI)的規(guī)范。在文件解析過程中,XML 處理代碼可以檢索這些外部實體而無需驗證。攻擊者可以通過請求并將內(nèi)容嵌入 XML 文檔中指定的外部實體來繞過您的安全措施。這本質(zhì)上是一個開放的后門。攻擊者可以利用此屬性作為檢索任何資源的途徑。
簡而言之,XML 外部實體攻擊(或 XXE 注入)是一種利用 XML 解析漏洞的攻擊。它針對使用面向用戶的 XML 解析功能的系統(tǒng),并允許攻擊者訪問服務(wù)器上的文件和資源。XXE 注入攻擊可能包括使用系統(tǒng)標(biāo)識符中的文件:方案或相對路徑泄露包含敏感數(shù)據(jù)(例如密碼或私人用戶數(shù)據(jù))的本地文件。
本質(zhì)上,如果持續(xù)的時間足夠長,此漏洞可能會使您的服務(wù)器變得不安全。
以下示例是包含 item XML 元素的基本 XML 文檔。
<item id="1"><title>Toilet Paper</title></item>
很好,但是外部實體在哪里?
您可以使用 DOCTYPE 標(biāo)頭內(nèi)的系統(tǒng)標(biāo)識符來表示外部實體。
<!ENTITY xxe SYSTEM "https://www.google.com" >]>
此標(biāo)頭的目的是向 XML 數(shù)據(jù)結(jié)構(gòu)添加更多屬性。為了進(jìn)一步說明這一點,下面的代碼包含一個外部 XML 實體,該實體會嘗試破壞潛在的永久文件。
<!ENTITY xxe SYSTEM "file:///gkr/rand" >]><item id="1"><title>&xxe;</title></item>
此攻擊將導(dǎo)致拒絕服務(wù) (DoS) 攻擊并使您的服務(wù)器癱瘓。哎呀!
正如我們在其他文章中提到的,這些實體可以訪問本地或遠(yuǎn)程內(nèi)容,因此您需要保護(hù)服務(wù)器上的敏感文件。
如果不這樣做,您可能會給攻擊者提供控制您網(wǎng)站的方法。游戲結(jié)束。這絕不是對 XML 外部實體或 XXE 攻擊的詳盡解釋。探索此漏洞的所有復(fù)雜性超出了本文的范圍。
好了,現(xiàn)在進(jìn)入實際部分:如何解決這個爛攤子?
值得慶幸的是,大部分工作已經(jīng)為您完成了。
為了快速復(fù)習(xí),并簡潔起見,我將簡要參考之前關(guān)于推薦方法的文章。
一般來說,只要您不是故意嘗試為漏洞打開窗口,并且考慮到您需要加載用戶提供的 XML 文件的功能,那么您就不必太擔(dān)心這個問題。
讓我們舉例說明。
正如我們之前提到的,如果應(yīng)用程序有一個解析 XML 文件的端點,攻擊者就可以向服務(wù)器發(fā)送特制的有效負(fù)載并獲取敏感文件。攻擊者可以獲取的文件在很大程度上取決于您如何設(shè)置系統(tǒng)以及如何實施用戶權(quán)限。
因此,為了防止這種情況發(fā)生,首先,不要使用支持實體替換的庫。
幸運(yùn)的是,JavaScript 沒有存在此類問題的流行 XML 解析庫。
一般來說,只要您保持庫更新,您就完成了大部分工作。您的應(yīng)用程序可能正在實現(xiàn) react-xml-parser,它已經(jīng)帶有針對此漏洞的保護(hù)措施。此外,對于大多數(shù)庫,外部實體默認(rèn)處于禁用狀態(tài)。
React 上受保護(hù)實現(xiàn)的一個簡單示例如下:
var XMLParser = require('react-xml-parser');var xml = new XMLParser().parseFromString(xml_text);
console.log(xml);
此外,如果您的平臺確實需要使用外部實體,則可以將已知的外部實體列入安全名單,以最大限度地減少漏洞的可能性。
以下是可以采取的一些其他策略來減輕 XXE 注入攻擊:
最后,根據(jù)經(jīng)驗法則,除非應(yīng)用程序需要,否則不要實現(xiàn) XML 處理。有很多方法可以提供類似的功能,而不會讓您的應(yīng)用程序面臨威脅。
最實用的緩解漏洞的方法是首先不要對它們開放。
文章來源:React XML External Entities Guide: Examples and Prevention