日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

WEB常見(jiàn)漏洞之XXE(基礎(chǔ)原理篇)

 zZ華 2023-02-13 發(fā)布于廣東

免責(zé)聲明由于傳播、利用本公眾號(hào)狐貍說(shuō)安全所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負(fù)責(zé),公眾號(hào)狐貍說(shuō)安全及作者不為此承擔(dān)任何責(zé)任,一旦造成后果請(qǐng)自行承擔(dān)!如有侵權(quán)煩請(qǐng)告知,我們會(huì)立即刪除并致歉,謝謝!

0x01 XML基礎(chǔ)知識(shí)

一個(gè)XML文檔實(shí)例:

```GeorgeJohnReminderDon't forget the meeting!```

第一行是 XML 聲明。它定義 XML 的版本 (1.0) 和所使用的編碼 (ISO-8859-1 = Latin-1/西歐字符集)。接下來(lái)加上DTD進(jìn)行聲明 內(nèi)部的 DOCTYPE 聲明

//定義 note 元素有四個(gè)元素:'to、from、heading,、body'    //定義 to 元素為 '#PCDATA' 類型     //定義 from 元素為 '#PCDATA' 類型    // heading 元素為 '#PCDATA' 類型    //定義 body 元素為 '#PCDATA' 類型]>  George  John  Reminder  Don't forget the meeting!

DTD元素 在一個(gè) DTD 中,元素通過(guò)元素聲明來(lái)進(jìn)行聲明。聲明一個(gè)元素 在 DTD 中,XML 元素通過(guò)元素聲明來(lái)進(jìn)行聲明。元素聲明使用下面的語(yǔ)法:只有 PCDATA 的元素 只有 PCDATA 的元素通過(guò)圓括號(hào)中的 #PCDATA 進(jìn)行聲明: 例子:

````

帶有任何內(nèi)容的元素 通過(guò)類別關(guān)鍵詞 ANY 聲明的元素,可包含任何可解析數(shù)據(jù)的組合: 例子:

````

帶有子元素(序列)的元素 帶有一個(gè)或多個(gè)子元素的元素通過(guò)圓括號(hào)中的子元素名進(jìn)行聲明: 或者 例子:```` 聲明只出現(xiàn)一次的元素 例子:

````

上面的例子聲明了:message子元素必須出現(xiàn)一次,并且必須只在 'note'元素中出現(xiàn)一次。

**外部文檔聲明**GeorgeJohnReminderDon't forget the meeting!```

這個(gè) XML 文檔和上面的 XML 文檔相同,但是擁有一個(gè)外部的 DTD 這是包含 DTD 的 'note.dtd' 文件:

DTD實(shí)體聲明

重點(diǎn)介紹實(shí)體聲明

**內(nèi)部實(shí)體聲明**````DTD 例子:將writer 聲明為”Bill Gates”,copyright 聲明為 “Copyright W3School.com.cn”XML 例子:``&writer;?right;``注釋: 一個(gè)實(shí)體由三部分構(gòu)成: 一個(gè)和號(hào) (&), 一個(gè)實(shí)體名稱, 以及一個(gè)分號(hào) (;)。]>    &xxe;

**外部實(shí)體聲明**外部實(shí)體引用支持通過(guò)協(xié)議,來(lái)動(dòng)態(tài)的獲取值````例子:DTD 例子:``````XML 例子:``&writer;?right;``可以通過(guò)``file://``協(xié)議來(lái)讀取文件內(nèi)容```]>&xxe;```

不同語(yǔ)言支持的協(xié)議不同

圖片

參數(shù)實(shí)體:

or參數(shù)實(shí)體只能在DTD中申明,DTD中引用,它們使用百分號(hào)(%)而不是與字符(&),可以是命名實(shí)體或外部實(shí)體。,能夠解析實(shí)體或者uri,進(jìn)行xml解析,進(jìn)而獲得其中的變量注:一般用于Bline XXE

``````**公共實(shí)體聲明**

0x02 漏洞原理

XXE Injection (XML External Entity Injection,XML 外部實(shí)體注入攻擊)攻擊者可以通過(guò) XML 的外部實(shí)體來(lái)獲取服務(wù)器中本應(yīng)被保護(hù)的數(shù)據(jù)。對(duì)于XXE漏洞最為關(guān)鍵的部分是DTD文檔類型,DTD 的作用是定義 XML 文檔的合法構(gòu)建模塊。當(dāng)允許引用外部實(shí)體時(shí),通過(guò)惡意構(gòu)造,可以導(dǎo)致任意文件讀取、執(zhí)行系統(tǒng)命令、探測(cè)內(nèi)網(wǎng)端口、攻擊內(nèi)網(wǎng)網(wǎng)站等危害。DTD 可以在 XML 文檔內(nèi)聲明,也可以外部引用;libxml2.9.1及以后,默認(rèn)不再解析外部實(shí)體。

內(nèi)部聲明 DTD             引用外部 DTD                 /或者

在解析 XML 時(shí),實(shí)體將會(huì)被替換成相應(yīng)的引用內(nèi)容,xml文檔如下所示:

(1) 包含內(nèi)部實(shí)體的 XML 文檔

]>?right;

1. 包含外部實(shí)體的 XML 文檔

]> ?right;

0x03 漏洞利用

1.XML 解析器解析外部實(shí)體時(shí)支持多種協(xié)議

libxml2:file、http、ftpPHP:file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、pharJava:file、http、ftp、https、jar、netdoc、mailto、gopher.NET:file、http、ftp、https

2.不同解析器可能默認(rèn)對(duì)于外部實(shí)體會(huì)有不同的處理規(guī)則,有些可能不會(huì)對(duì)外部實(shí)體進(jìn)行解析:

PHP:DOM、SimpleXML;.NET:System.Xml.XmlDocument、System.Xml.XmlReader。

對(duì)于XXE通常有兩種利用方式:

1.有回顯XXE

有回顯的情況可以直接在頁(yè)面中看到Payload的執(zhí)行結(jié)果或現(xiàn)象。

帶內(nèi)XML外部實(shí)體(XXE),即攻擊者可以發(fā)送帶有XXE有效負(fù)載的請(qǐng)求,并從包含某些數(shù)據(jù)的Web應(yīng)用程序獲取響應(yīng)。

攻擊者通過(guò)正常的回顯或報(bào)錯(cuò)將外部實(shí)體中的內(nèi)容讀取出來(lái)。file 協(xié)議讀取文件:

]>

2.BlindXXE

服務(wù)器沒(méi)有回顯,只能使用 Blind XXE 來(lái)構(gòu)建一條帶外數(shù)據(jù)通道提取數(shù)據(jù); Blind XXE 主要使用了 DTD 約束中的參數(shù)實(shí)體和內(nèi)部定義實(shí)體。參數(shù)實(shí)體:一個(gè)只能在 DTD 中定義和使用的實(shí)體,一般引用時(shí)用 % 作為前綴; 內(nèi)部定義實(shí)體:在一個(gè)實(shí)體中定義的一個(gè)實(shí)體,即嵌套定義:

'        %a;     ]> &b;

Blind XXE 采用嵌套形式建立帶外數(shù)據(jù)通道,利用參數(shù)實(shí)體將本地內(nèi)容讀出來(lái)后,作為外部實(shí)體中的 URL 中的參數(shù)向其指定服務(wù)器發(fā)起請(qǐng)求,然后在其指定服務(wù)器的日志(Apache 日志)中讀出文件的內(nèi)容(指定服務(wù)器即攻擊者的服務(wù)器);DTD 中使用 % 來(lái)定義的參數(shù)實(shí)體只能在外部子集中使用,或由外部文件定義參數(shù)實(shí)體,引用到 XML 文件的 DTD 來(lái)使用; 有些解釋器不允許在內(nèi)層實(shí)體中使用外部連接,無(wú)論內(nèi)層是一般實(shí)體還是參數(shù)實(shí)體,所以需要將嵌套的實(shí)體聲明放在外部文件中。存在xxe的情況下:玩法-讀文件

]>&xxe; &xxe;//xxe為變量,讀取test.txt//打印出來(lái)

用file協(xié)議讀指定路徑的文件

顯示結(jié)果

玩法-內(nèi)網(wǎng)探針或攻擊內(nèi)網(wǎng)應(yīng)用(觸發(fā)漏洞地址)內(nèi)網(wǎng)探針

]>&rabbit;

引入外部實(shí)體dtd,dtd就是xml的后綴,識(shí)別為xml格式

如果設(shè)置了禁止外部實(shí)體引用,將會(huì)失效

%file;]>&send;

可以在遠(yuǎn)程服務(wù)器evil2.dtd寫(xiě)上:

無(wú)回顯-讀取文件

%dtd;%send;]>

Base64加密是反正傳輸中亂碼,傳輸失敗。

本地192.168.上構(gòu)造:

test.dtd:

'>%payload;

開(kāi)啟日志,看日志就可以看到test.txt數(shù)據(jù)了。

協(xié)議-讀文件(繞過(guò))

]>&f;

如何檢測(cè):

數(shù)據(jù)格式類型:如果發(fā)現(xiàn)有testMikasa  類型抓包發(fā)現(xiàn)  content-type中是  text/xml  或者 application/xml盲猜:更改content-type值application/xml看返回

burp上抓包 右鍵

do an active scan:掃描漏洞

Send to spider:爬行

利用爬行,找到有xml,把xml代碼拷貝到post上既可以利用

0x04 繞過(guò)姿勢(shì)

圖片

這里的文本$attack;指的是前面注冊(cè)的實(shí)體的鏈接。鏈接中指定的文件內(nèi)容將其替換為文檔正文中的內(nèi)容。上述文檔分為三個(gè)重要部分:

1.可選標(biāo)頭,用于定義基本文檔特征,例如版本和編碼。2.XML文檔模式的可選聲明——。此聲明可用于設(shè)置外部鏈接。3.文檔正文。它有一個(gè)層次結(jié)構(gòu),其根部是指定的標(biāo)簽

正確配置的XML解釋器要么不接受包含XML鏈接的文檔進(jìn)行處理,要么將驗(yàn)證鏈接及其來(lái)源,如果缺少驗(yàn)證,則可以通過(guò)鏈接加載任意文件并將其集成到文檔體中,如上面的示例所示。

我們將根據(jù)WAF處理XML驗(yàn)證的方式來(lái)研究?jī)煞N類型的WAF:

成熟的waf——使用自己的解析器預(yù)處理XML文檔的WAFs。基于正則表達(dá)式。僅搜索數(shù)據(jù)中的特定子字符串或正則表達(dá)式的WAFS。

這兩種類型的WAF都可以繞過(guò)。

下面我們展示了攻擊者可以用來(lái)騙過(guò)WAF并獲得XXE的幾種方法。

方法1:文檔中的額外空格

由于XXE通常在XML文檔的開(kāi)頭,所以比較省事兒的WAF可以避免處理整個(gè)文檔,而只解析它的開(kāi)頭。但是,XML格式允許在格式化標(biāo)記屬性時(shí)使用任意數(shù)量的空格,因此攻擊者可以在或中插入額外的空格,從而繞過(guò)此類WAF。

圖片

方法2:格式無(wú)效

為了繞過(guò)WAF,攻擊者可能會(huì)發(fā)送特殊格式的XML文檔,以便WAF認(rèn)為它們無(wú)效。

鏈接到未知實(shí)體

比較成熟的WAF設(shè)置通常不會(huì)讀取鏈接文件的內(nèi)容。這種策略通常是有意義的,否則,WAF本身也可能成為攻擊的目標(biāo)。問(wèn)題是,外部資源的鏈接不僅可以存在于文檔的第三部分(正文),還可以存在于聲明中?。

這意味著未讀取文件內(nèi)容的WAF將不會(huì)讀取文檔中實(shí)體的聲明。而指向未知實(shí)體的鏈接又會(huì)阻止XML解析器導(dǎo)致錯(cuò)誤。

圖片

幸運(yùn)的是,防止這樣的繞過(guò)非常簡(jiǎn)單——命令WAF中的XML解析器在遇到未知實(shí)體后不要關(guān)閉。

方法三:外來(lái)編碼(Exotic encodings)

除了前面提到的xml文檔的三個(gè)部分之外,還有位于它們之上的第四個(gè)部分,它們控制文檔的編碼(例如)——文檔的第一個(gè)字節(jié)帶有可選的BOM(字節(jié)順序標(biāo)記)。

更多信息:https://www./TR/xml/#sec-guessing

一個(gè)xml文檔不僅可以用UTF-8編碼,也可以用UTF-16(兩個(gè)變體?-?BE和LE)、UTF-32(四個(gè)變體?-?BE、LE、2143、3412)和EBCDIC編碼。

在這種編碼的幫助下,使用正則表達(dá)式可以很容易地繞過(guò)WAF,因?yàn)樵谶@種類型的WAF中,正則表達(dá)式通常僅配置為單字符集。

外來(lái)編碼也可用于繞過(guò)成熟的WAF,因?yàn)樗鼈儾⒉豢偸悄軌蛱幚砩厦媪谐龅乃芯幋a。例如,libxml2解析器只支持一種類型的utf-32?-?utf-32BE,特別是不支持BOM。

方法4:在一個(gè)文檔中使用兩種類型的編碼

在上一節(jié)中,我們演示了文檔的編碼通常由其第一個(gè)字節(jié)指定。但是當(dāng)包含編碼屬性的標(biāo)記引用文檔開(kāi)頭的不同字符集時(shí)會(huì)發(fā)生什么?在這種情況下,一些解析器更改編碼,使文件的開(kāi)頭有一組字符,其余的是另一組編碼。。也就是說(shuō),不同的解析器可能在不同的時(shí)間轉(zhuǎn)換編碼。Java解析器(javax.xml.parsers)在結(jié)束后嚴(yán)格地更改字符集,而libxml2解析器可以在執(zhí)行“編碼”屬性的值之后或在處理之前或之后切換編碼。

只有在根本不處理這些文件時(shí),比較成熟的WAF才能可靠地防止這些文件中的攻擊。我們還必須記住,有許多同義詞編碼,例如UTF-32BE和UCS-4BE。此外,有些編碼可能不同,但從編碼文檔初始部分?的角度來(lái)看,它們是兼容的。例如,看似UTF-8的文檔可能包含字符串。

這里有一些例子。為了簡(jiǎn)明扼要,我們不把XXE放在文檔里。

libxml2解析器將文檔視為有效,但是,javax.xml.parsers set中的Java引擎認(rèn)為它無(wú)效:

圖片

反之亦然,文檔對(duì)于javax.xml.parser是有效的,但對(duì)于libxml2解析器是無(wú)效的:

圖片

libxml2的文檔,在標(biāo)記中間將編碼從utf-16le更改為utf-16be:

圖片

libxml2的文檔,編碼從utf-8改為ebcdic-us:

圖片

正如你所看到的,有許多繞過(guò)方法。防止XXE的最好方法是配置應(yīng)用程序本身,以安全的方式初始化XML解析器。為此,應(yīng)該禁用兩個(gè)選項(xiàng):

外部實(shí)體外部DTD架構(gòu)

0x05 知識(shí)星球

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多