一個合格程序猿應該知道的基礎知識(二)—XXE注入攻擊
(圖片源於網路,侵刪)
ps:在提醒大家一下,明天就是七夕了,沒買禮物的可要好好看看文末阿姨給你們的撩妹神器,你絕對值得擁有~
今天給大家介紹一下XML的xxe注入攻擊,想知道XML注入的可以翻看上周介紹的基礎知識篇。
1
xxe攻擊概述
XML外部實體(XXE)攻擊是許多基於注入的攻擊方式之一,當攻擊者將聲明XML消息中的外部實體發送到應用程序並使用XML解析器解析時,就會發生這種攻擊。
這個漏洞有許多不同的類型和行為,因為它可能會發生在不同類型的技術中,因為不同類型的XML解析器的原因。在這種情況下,令人高興的是,每個解析器具有不同的功能和「特徵」。
在我們開始之前,讓我們先認識下可能面臨的最常見的XXE漏洞類型—了解這些漏洞類型將有助於我們調試攻擊並創建最終正確的POC:
基礎的XXE注入— 外部實體注入本地DTD
基於盲注的XXE注入—XML解析器在響應中不顯示任何錯誤
基於錯誤的XXE注入—成功解析之後,XML解析器始終顯示SAME響應。(即「您的消息已被接收」),因此,我們可能希望解析器將文件的內容「列印」到錯誤響應中。
2
xxe攻擊介紹
接下來我們將為大家按順序介紹這三種類型:
基礎的XXE注入
按照上一個概述,我們可以通過使用SYSTEM標識符來引用外部實體的數據。所以現在我們可以引入XXE注入的第一種技術,它將外部實體注入到包含引用本地文件路徑(如/ etc / passwd)的SYSTEM標識符的XML文檔中:
現在讓我們做一個更複雜和更嚴重的攻擊:
如果作為通用功能的一部分,應用程序伺服器沒有作出回應呢?(記得剛剛提到的基於錯誤的XXE嗎?)如果我們想從其中具有XML特殊字元的外部源讀取數據呢?如果在解析過程中解析失敗呢?
這時我們可以載入引用我們的遠程伺服器並嘗試從其URL獲取內容的輔助外部DTD—這可以是一組字元,或下面的示例轉儲文件,最重要的是它甚至沒有經過XML模式驗證過程,因為它在解析器甚至獲取遠程內容之前發送!
例如,遠程DTD文件—包含帶有SYSTEM標識符和「file」處理程序的參數實體。請注意,參數實體「file」也連接到實體「send」內的URL:
解析DTD後,我們得到以下實體:
最終,伺服器會嘗試以文件內容發送參數「c」所指定的內容,到達我們定義的URL—我們記錄該內容,並通過這樣做來轉儲文件的內容:
第一步:如下圖
第二步: 遠程DTD正在解析。我們正在竊取文件的內容...
第三步:我們成功得到文件內容!
用這種技術記住的幾件事情:文件內容中的字元「#」將導致URL截斷。如果我們使用「or」定義參數實體,內容可能會中斷。這取決於我們使用的是哪種(所以請確保在出現錯誤的情況下同時使用這兩種測試場景)。
基於盲注的XXE注入
XML實體分為:參數實體和通用實體兩種。參數實體用在DTD定義中。一般的xml文檔中都使用通用實體。這裡只介紹通用實體。
a、Blind XXE用途
對於傳統的XXE來說,要求有一點,就是攻擊者只有在伺服器有回顯或者報錯的基礎上才能使用XXE漏洞來讀取伺服器端文件。
例如:提交請求:
&file;
伺服器在這個節點中返回etc/passwd的文件內容:
root:1:3.......
如果伺服器沒有回顯,只能使用Blind XXE漏洞來構建一條帶外信道提取數據。
b、參數實體和內部參數實體
Blink XXE主要使用了DTD約束中的參數實體和內部實體。參數實體是一種只能在DTD中定義和使用的實體,一般引用時使用%作為前綴。而內部實體是指在一個實體中定義的另一個實體,也就是嵌套定義。
如:
%param1;
[This is my site] &internal;
但是在我研究過程中,發現內部實體的這支持與否也是取決於解釋器的。
IE/Firefox:
Chrome:
這也是比較蛋疼的特性,因為php,java,C#等語言的內置XML解析器都是有一定差別的,也就給漏洞利用帶來不便。
c、bllind xxe
如果目標伺服器沒有回顯,就只能用 Blind XXE 了。原理就是帶著獲取的文件源碼以 get 參數或其他形式去訪問我們的伺服器,然後在日誌里就可以找到我們要獲取的內容了。
Blink XXE主要使用了DTD約束中的參數實體和內部實體。參數實體是一種只能在DTD中定義和使用的實體,一般引用時使用%作為前綴。而內部實體是指在一個實體中定義的另一個實體,也就是嵌套定義。
%remote;
%all;
&send;
xxx.xml
">
這裡解釋下,%remote; 會把外部文件引入到這個 XML 中,%all; 替換為後面的嵌套實體,這時再在 root 節點中引入 send 實體,便可實現數據轉發。如果在 xxx.xml 中 send 實體是參數實體的話,也可以採用下面的形式。
%remote;
%all;
%send;
xxx.xml
">
d、測試
【1.php】
file_put_contents("1.txt", $_GET["file"]) ;
【test.php】
$xml=
%remote;
%all;
%send;
EOF;
$data = simplexml_load_string($xml) ;
echo "
" ;
print_r($data) ;
【evil.xml】
">
訪問http://localhost/test.php, 這就是模擬攻擊者構造XXE請求,然後存在漏洞的伺服器會讀出file的內容(c:/1.txt),通過帶外通道發送給攻擊者伺服器上的1.php,1.php做的事情就是把讀取的數據保存到本地的1.txt中,完成Blind XXE攻擊。
攻擊之後1.txt中的數據:
攻擊者伺服器日誌:
e、總結
遇到XML相關的交互過程,以如下步驟判斷是否存在漏洞:
(1)檢測XML是否會被解析:
&shit;
如果$shit;變成了」this is shit」,那就繼續第二步。
(2)檢測伺服器是否支持外部實體:
%shit;
通過查看自己伺服器上的日誌來判斷,看目標伺服器是否向你的伺服器發了一條請求evil.xml的HTTP request。
(3)如果上面兩步都支持,那麼就看能否回顯。如果能回顯,就可以直接使用外部實體的方式進行攻擊。當然有時候伺服器會不支持一般實體的引用,也就是在DTD之外無法引用實體,如果這樣的話,只能使用Blind XXE攻擊。
(4)如果不能回顯,毫無疑問,使用Blind XXE攻擊方法。
基於錯誤的XXE注入
有時候,當解析過程成功時,當我們從伺服器得到通用的響應時,我們可能希望伺服器返回詳細錯誤—因此,我們可以使用與遠程DTD相同的技術,但會發生故意的錯誤如:
解析器將嘗試解析DTD並訪問發送實體中給出的路徑,但是由於不能到達「my-evil-domain。$$$$ 」,我們將導致以下錯誤:
然後我們就可以根據信息調試我們自己的payload!# 安全脈搏 https://www.secpulse.com/archives/58915.html
請注意,由伺服器響應的任何錯誤顯示哪一行導致解析錯誤,同時出現語法錯誤,有時我們可能會使用此信息來調試我們自己的payload,使用「 n」。
例如:
]> n
包含payload的兩個額外的「 n」會在第一行「 n」之後的第2行中出現錯誤,而其餘的XML內容將會顯示在第3行。
總之,XXE是一個非常強大的攻擊,它允許我們操縱錯誤的XML解析器並利用它們。請注意,有更多的技術和攻擊利用方式可以通過XXE注入完成。如前所述,每個解析器都有不同的能力,因此我們可以提出不同的漏洞。
3
xxe外部引入方式
當允許引用外部實體時,通過構造惡意內容,可導致讀取任意文件、執行系統命令、探測內網埠、攻擊內網網站等危害。引入外部實體方式有多種,比如:
(1)惡意引入外部實體方式一
XML內容:
(2)惡意引入外部實體方式二
其中attack.dtd的內容為:
XML內容:
DTD文件(evil.dtd)內容:
(3)惡意引入外部實體方式三
XML內容:
DTD文件(evil.dtd)內容:
另外,不同程序支持的協議不一樣,
上圖是默認支持協議,還可以支持其他,如PHP支持的擴展協議有


※美聯社:谷歌在偷偷記錄你的位置數據 即使你拒絕
※換殼Chrome的紅芯瀏覽器 曾拿數百萬政府和國企訂單
TAG:安全犀牛 |