一:初識XXE漏洞
1.XXE簡介
XXE就是XML外部實體注入,當允許引用外部實體時, XML數據在傳輸中有可能會被不法分子被修改,如果服務器執行被惡意插入的代碼,就可以實現攻擊的目的攻擊者可以通過構造惡意內容,就可能導致任意文件讀取,系統命令執行,內網端口探測,攻擊內網網站等危害。
那有的小伙伴可能就會問了,那XML又是什么呢?
2.XML概念
XML是可擴展的標記語言(eXtensible Markup Language),設計用來進行數據的傳輸和存儲, 結構是樹形結構,有標簽構成,這點很像HTML語言。
但是XML和HTML有明顯區別如下:
XML 被設計用來傳輸和存儲數據。
HTML 被設計用來顯示數據。
二:XML語法簡析
1.XML基礎語法
先來看一段簡單的XML代碼
簡單來說XML的語法中,標簽就是變量名,標簽里面的數據就是變量的值
但這里也存在一個問題,當數據里出現了尖括號時,就會造成XML數據的解析錯誤,如下
所以xml語法中也對這種寫法最初了規定,即
在XML中某些單獨字符,如引號” ‘ & 和 尖括號 都是不允許直接出現在XML文檔中(也就是不能直接用剛才那種寫法保存這些帶有這些單獨字符的數據)的,因為XML 解析的時候會分辨不清這種輸入到底是數值還是標簽 那有什么辦法能夠保存這些帶有特殊字符的數據呢?這就是下面我們要講的實體
2.XML實體
上面的問題必須要解決,所以出現了實體Entity來解決這個問題 實體Entity是一種簡單的存儲單元就好比xml變量一樣可以對它進行賦值﹐并在xml文檔中不同的地方對他引用。實體在XML文檔中的文檔類型定義部分(DTD)被單獨定義描述。
[1].XML的基本結構
上面有一些詞可能大家還比較陌生,先簡單介紹一些XML基本的結構,由XML聲明,DTD部分,XML部分,三部分組成,示意圖如下
DTD部分就是用來定義 XML 文檔的合法構建模塊的,繼續往下看你就明白了
上面講到了實體,我們繼續來看看
而實體又分為三種,一般實體(通用實體),參數實體,預定義實體
[2].一般實體
一般實體的聲明:
引用一般實體的方法:&實體名稱;
來看看下面一段使用了一般實體的代碼
范圍:普通實體可以在DTD中引用,可以在XML中引用,可以在聲明前引用,還可以在實體聲明內部引用。
[3].參數實體
參數實體的聲明:
引用參數實體的方法:%實體名稱;
來看看下面一段使用了參數實體的代碼,其實跟一般實體差不多知識%的區別
它必須定義在單獨的DTD區域,這種實體相對靈活,這種功能在漏洞利用場景的外部實體注入(XXE)過程中非常有用
[4].預定義實體
這玩意在XXE漏洞中一般用不到,有興趣的同學可以去簡單了解一下,我這里就不講了
[5].內部實體和外部實體
上面講的那些都是內部實體,實體的值來源于內部,而外部實體顧名思義就是引用外部的值,兩者的寫法也差不多,外部實體僅僅是多了一個SYSTEM,給大家列了個表格這樣大家可以更清楚一點,如下
注意:引入外部的DTD文件時,dtd文件中存放的就是xml代碼,并且引用外部實體的時候還可以使用各種偽協議,而不是僅限于http協議
[6].實例演示
可能有些人還是比較迷糊, 下面分別給出一個內部實體和外部實體的例子大家就能看懂了 來看一段內部實體的例子
再來看看外部實體
總結一下,內部實體就相當于自己編寫DTD內容,而外部實體就相當于引入外部的DTD內容,類似于寫JS代碼時從外部引入JS文件,這樣就能理解了吧,上面的一般實體和參數實體都可以化為外部實體
而XXE漏洞,就存在于外部實體中,我們將惡意代碼寫入DTD文件中再通過外部實體引入
三:漏洞演示
1.漏洞明析
在這里在復習一下XXE漏洞是什么
XXE漏洞就是XML外部實體注入。既然是外部實體注入,那么針對于XXE漏洞肯定就是XML外部實體了。引入外部實體方式有很多種,比如:實體ENTITY不僅能用來儲存指定數值,他還能從本地文件或者遠程文件中調用相關的數據作為后續實體引用。如外部實體(XMLExternal Entity)就是其中之一。
下面舉兩個簡單的外部實體攻擊例子
[1].例一.
此時c變量讀取的值便是/etc/passwd文件的內容
但這種方式也有問題,就是會涉及到敏感內容,所以還有下面這種攻擊方法
[2].例二
該方法通過引入外部的DTD文件,而文件中同樣是讀取敏感文件的惡意代碼,這樣被檢測的可能性就大大降低
2.檢測漏洞
這里的漏洞環境我們使用的是pikachu這個靶場的XXE關卡,這個靶場應該都有吧,沒有的也可以找我拿,打開該靶場的XXE關卡,如下
可以看到是一個輸入框,提示可以接收xml數據
那我們該怎么判斷是否存在XXE漏洞呢?其實就是看他是否能夠解析XML數據,所以我們直接傳入一段XML代碼看他能否解析
我們放入下面這段代碼
這段代碼都能看懂吧,就是給name變量賦了一個test值,把代碼放到輸入框中,點擊提交,結果如下
成功提取到test數據,說明有可能存在XXE漏洞
3.漏洞利用
上面已經檢測數來存在XXE漏洞了,那應該怎么利用呢,很簡單,就是利用我們剛才講到的,外部實體引用可以使用的——協議
這里也給大家準備了各種語言支持的協議 ,如下
[1].直接外部實體注入
直接外部實體注入,就是通過協議直接執行惡意命令
因為我是windows主機,這里我們以file協議來讀取c:/windows/win.ini配置文件的內容,xml代碼如下(注意這里的路徑需要改變寫法,不然會受到轉義的影響)
將代碼放入輸入框提交,結果如下:
成功讀取
[2].間接外部實體注入
這個也比較簡單,就會將惡意代碼寫在DTD文件中,再引入DTD文件,操作如下
構造外部dtd文件
打開虛擬機,這里我選擇的是kali,進入根目錄,創建一個xxx.dtd的文件,內容如下
使兩臺機器可以互相連接
這里直接打開apache服務就可以達到這個效果了,主要是為了使xml代碼能成功引用到kali的dtd文件
構造XML代碼
引用外部實體的xml代碼如下(192.168..0.107是我的kali的ip地址),這里用參數實體給大家演示一下
效果如下,成功讀取
四:漏洞防范
針對于XXE漏洞修復其實只有兩點:
禁止使用外部實體,例如libxml disable_entity_loader(true) 。
過濾用戶提交的XML數據,防止出現非法內容。