XML 外部實(shí)體的示例

現(xiàn)在您對(duì) XXE 注入有了基本的了解,讓我們來(lái)看一個(gè)例子。這是一個(gè)包含用戶名 XML 元素的示例 XML 文檔: 

<?xml version="1.0" encoding="ISO-8859-1"?>
<username>John</username>
</xml>

非常無(wú)害且簡(jiǎn)單,對(duì)吧?外部實(shí)體在哪里? 

首先,可以使用 DOCTYPE 標(biāo)頭內(nèi)的系統(tǒng)標(biāo)識(shí)符添加外部 XML 實(shí)體。此標(biāo)頭基本上為 XML 文件結(jié)構(gòu)添加了幾個(gè)屬性。  

例如,下面的代碼包含一個(gè)外部 XML 實(shí)體,它將獲取 /etc/passwrd 的內(nèi)容并將其顯示給按用戶名呈現(xiàn)的用戶: 

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwrd" >]>
<username>&xxe;</username>
</xml>

哎呀! 

這些實(shí)體可以訪問(wèn)您服務(wù)器中的本地或遠(yuǎn)程內(nèi)容,如果您在服務(wù)器上保存敏感文件,這將非常糟糕,因?yàn)樗鼈兛赡軙?huì)為攻擊者提供控制您網(wǎng)站的途徑。 

類似地,其他 XML 外部實(shí)體攻擊可以訪問(wèn)本地資源,并且可能不會(huì)止步于返回?cái)?shù)據(jù)。因此,這也是影響應(yīng)用程序可用性并導(dǎo)致拒絕服務(wù)的途徑。 

緩解 XML 外部實(shí)體漏洞

幸運(yùn)的是,緩解 XML 外部實(shí)體漏洞相對(duì)簡(jiǎn)單。只要您不是故意嘗試打開(kāi)漏洞窗口,并且認(rèn)為您需要用戶提供的 XML 文件的功能,您就不必太擔(dān)心。 

如前所述,如果應(yīng)用程序具有解析 XML 文件的端點(diǎn),攻擊者可以向服務(wù)器發(fā)送特制的有效負(fù)載并獲取敏感文件。攻擊者可以訪問(wèn)的文件在很大程度上取決于您如何設(shè)置系統(tǒng)以及如何實(shí)現(xiàn)用戶權(quán)限。因此,為了防止這種情況,首先,不要使用支持實(shí)體替換的庫(kù),如 LibXML。 

遺憾的是,NodeJS 沒(méi)有內(nèi)置 XML 解析引擎。您可能已經(jīng)在項(xiàng)目中使用此庫(kù)。但不要擔(dān)心 – 默認(rèn)情況下禁用實(shí)體替換。盡管如此,我們建議您明確禁用此功能。您可以通過(guò)簡(jiǎn)單地更改庫(kù)的所有初始化來(lái)做到這一點(diǎn),如下所示:

const lib = libxmljs.parseXml(xml, {noent: true});

還需要牢記的是,如果您決定采用這種方式,您仍然可能容易受到 DDoS 攻擊。 

現(xiàn)在,假設(shè)您的應(yīng)用程序?qū)嶋H上利用外部實(shí)體來(lái)實(shí)現(xiàn)某些關(guān)鍵功能。在這種情況下,您可以采取一種方法來(lái)最大限度地降低漏洞利用的可能性,那就是將已知的外部實(shí)體列入安全列表。您只需在使用庫(kù)解析 XML 文件文檔之前檢查其中是否有包含不在列表中的任何實(shí)體的字符串即可。

app.post('/load_xml', upload.single('xml'), async function (req, res) {
if (!req.file) {
res.sendStatus(500);
return;
}

try {
const xml = req.file.buffer;
const doc = libxmljs.parseXml(xml, {noent: true});

if (doc.text().includes("<!ENTITY")) {
throw new Error("INVALID XML FILE");
}

res.send(doc.text());
} catch (err) {
res.send(err.toString());
res.sendStatus(500);
}
});

最后

最后——我想強(qiáng)調(diào)這一點(diǎn)——如果應(yīng)用程序不需要解析 XML,請(qǐng)不要解析。我知道解析 XML 可能會(huì)很方便,并允許平臺(tái)為用戶提供便捷的功能。即便如此,仍有許多方法可以在不使用這些庫(kù)的情況下提供類似的功能。 

最后,最好的緩解策略是絕不要對(duì)漏洞敞開(kāi)大門(mén)。務(wù)必記住,為用戶提供強(qiáng)大而安全的平臺(tái)正變得越來(lái)越復(fù)雜。這樣的工作需要投入大量的時(shí)間和專業(yè)知識(shí),而您的組織可能無(wú)法承擔(dān)。  

結(jié)論

保護(hù)您的平臺(tái)免受網(wǎng)絡(luò)上最復(fù)雜的攻擊需要對(duì)技術(shù)有廣泛的了解,并牢牢掌握平臺(tái)的基礎(chǔ)架構(gòu)。值得慶幸的是,用于構(gòu)建基礎(chǔ)架構(gòu)的大多數(shù)工具和庫(kù)都非常強(qiáng)大和安全。無(wú)論如何,工程師無(wú)意中引入漏洞并危及團(tuán)隊(duì)工作的可能性始終存在。 

文章來(lái)源:NodeJS XML External Entities Guide: Examples and Prevention

上一篇:

Lua命令注入:示例與預(yù)防

下一篇:

Lua XSS:示例及預(yù)防
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)