天天看點

XXE攻擊原理研究

XMLExternal Entity

附上Owasp對于XXE的相關說明

https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing

XXE 翻譯過來是XML外部實體,XXE攻擊一般是指XXE注入攻擊

XXE 攻擊的是XML這種标記格式,理論上所有XML進行配置或者作為傳輸的應用程式都會受到這種攻擊

在2017年OWASP在Top 10 中将XXE攻擊列為第四名

從此國内引發了XXE學習的熱潮,一開始我并不感冒,因為這不是一個新的漏洞,在《黑客攻防技術寶典 WEB實戰篇》中已經包含過這種攻擊方式,在《白帽子講web安全》中隻是一筆帶過

是以我并沒有因為這個而打亂自己的學習計劃,直到最近和Hr 聊天的時候,他們涉及到了這個話題,由此引發今天的這篇文章!

XML

在介紹攻擊方法之前還是要介紹一下我們的“被害方”XML

http://www.w3school.com.cn/xml/index.asp

上面是一個學習XML的網站,大家可以學習一下XML的表現和傳遞資料的形式

XXE攻擊原理研究

可以看到是一種樹狀結構,與HTML類似,表示方法都是在兩個标簽中表示資料

漏洞成因

與SQL注入,XSS的漏洞成因很相似,都是通過注入惡意字元,改變網站原本意圖,進而達到某些目的。

在XSS防禦的時候,防禦方法就是把類似 < > “ 等字元轉化為HTML實體,就是像 &lt; 這種形式,進而規避由惡意輸入導緻的使用者資産損失。

XML為了保證自身的結構不被破壞,是以約定在 資料段使用 < & 都是非法的,如果想要使用都要替換為相應的實體字元

XXE攻擊原理研究

從此引出 XML實體(DTD實體)

http://www.w3school.com.cn/dtd/dtd_entities.asp

在我看來,XML實體其實也就是其他語言中說的變量,準确來說可能更像是全局變量,這樣說大家可能更好的了解

XXE攻擊原理研究

從上面的圖檔,大家可以看出如何定義一個外部實體,并且給它“指派”

最後就是在XML中如何調用它

<author>&writer;&copyright;</author>

這種調用方式和php中的變量差不多,

writer的值如果是“aaaa”,copyright的值如果是"bbbb",

最終的傳回值就是 aaaabbbb

重點來了!!!

很多程式使用 XML作為傳輸格式,導緻我們可以修改參數,送出任意XML,進而導緻定義任何實體,并且做引用。

遺憾的是XML外部實體能做的事還挺多,可以讀取檔案,可以發起網絡請求等等,我就以讀取檔案作為危害點來進行簡單的講述吧!

模拟情景

此處我們送出的是一個關鍵字,之後通過XML傳輸,最後頁面會傳回我們的關鍵字

原本我們送出的應該是<keyword>hahaha</keyword>

然而我們送出的是

<?xml version="1.0"encoding="utf-8"?>

<!DOCTYPE foo [

<!ENTITY filecontent SYSTEM"file:///etc/passwd">]>

<aaa>&filecontent;</aaa>

此時就會造成 /etc/passwd 檔案的内容直接指派給了filecontent

之後再由<aaa>這個标簽調用這個變量,把内容顯示了出來,進而造成了檔案讀取

看到這裡之前,大家一定要把DTD的那個教程連結看了,其中的内容也就花費你20分鐘,當你讀完之後再來向下看就會清晰得多了

如果你看完了,這回我再說說DTD

通俗來講,DTD其實就是給了一個規範,是我們的XML規範化,比如

XXE攻擊原理研究

可以看到這個DTD 用!DOCTYPE來定義了note這個标簽的内部内容規範

有四個元素

XXE攻擊原理研究

之後給出了一個真實XML中的實作

XXE攻擊原理研究

看到這裡,大家應該已經能夠明白DTD的作用以及簡單的使用方法了

上面的例子中,DTD是被寫入到XML源碼中的,也就是通常說的内部文檔類型聲明,正常的内部文檔類型聲明沒有什麼問題

XML中還支援外部文檔類型聲明,也就是說定義了規則的DTD代碼并沒有寫在XML檔案中,可能是因為不想XML的文本太過臃腫或者其他的一些個原因

此時我們隻需要在XML中做一條外部引用的語句,如下

XXE攻擊原理研究

對比之前就會發現,這裡使用SYSTEM文法來指定了一個外部的文檔定義,文檔定義的檔案名稱是note.dtd

下面我們來看看這個檔案中的内容有哪些?

XXE攻擊原理研究

可以看到就是之前XML中的那些内容,隻不過用一個獨立的檔案進行了封裝而已,并且在XML中進行了引用

看到這裡,大家應該已經能夠了解XML是如何進行外部文檔聲明的了

這個時候你在回去看我們之前的那個例子

模拟情景

此處我們送出的是一個關鍵字,之後通過XML傳輸,最後頁面會傳回我們的關鍵字

原本我們送出的應該是<keyword>hahaha</keyword>

然而我們送出的是

XXE攻擊原理研究

此時就會造成 /etc/passwd 檔案的内容直接指派給了filecontent

之後再由<aaa>這個标簽調用這個變量,把内容顯示了出來,進而造成了檔案讀取

基于剛才的知識我們知道了:

送出的資料中首先定義了一個内部文檔聲明,對foo标簽進行了規則的定義,

而對于foo的進行了元素聲明(用[ ]擴起來的 )

聲明的内容就是我們白色框中的,我們在這個位置添加了payload

這個payload是一個外部實體引用,特征就是SYSTEM

外部實體引用的是/etc/passwd 檔案,而不是其他的DTD檔案

注意:此處其實是可以很多種協定的,比如file, http, ftp

這些聲明指派給了foo,之後被<aaa>标簽列印出來

此時大家應該就可以明白XXE漏洞産生的原因及其簡單利用了吧!

-END-