1、xxe攻擊漏洞的簡介
何為XXE漏洞?XXE是指xml外部實體攻擊,Xxe漏洞全稱xml external entity injection即xml外部實體注入漏洞,xxe漏洞發生在應用程序解析xml輸入時,沒有禁止外部實體的加載,導致可加載惡意外部文件,造成文件讀取、命令執行、內網端口掃描、攻擊內網網站、發起dos攻擊等危害。那么問題來了,xml又是什么???
xml是一個可擴展標記語言,標準通用標記語言的子集,是一種用于標記電子文件使其具有結構性的標記語言。在電子計算機中,標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種的信息比如文章等。它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 它非常適合萬維網傳輸,提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據。是Internet環境中跨平臺的、依賴于內容的技術,也是當今處理分布式結構信息的有效工具。早在1998年,W3C就發布了XML1.0規范,使用它來簡化Internet的文檔信息傳輸
喜歡更多知識內容可以關注微信公眾號:安界網
2、xml基礎
1)、 xml介紹以及用途
xml被設計用來傳輸和存儲數據,它和html最大的區別在html是用來格式和顯示數據,而xml是用來傳輸和存儲數據,對比html它是一種層次和嵌套結構,而xml文檔形成了一種樹結構,它從(文檔)"根部"開始(出發),一直擴展到"枝葉"。Xml允許創作者定義自己的標簽和自己的文檔結構,也就是說咱們可以自己去自定義樹的結構以及樹上面節點的名稱,也就是對應的這個元素。
這個一個簡單的一個xml,首先第一行它給出了xml的版本是1.0,和xml的編碼是utf-8。

接下來就是xml的根節點以及下屬節點,<to>就是一個節點,里面包含了對應的值,就相當于樹狀結構當中是這樣一個結構

以下是xml的樹狀結構圖,在根部是note,note下有no節點、from節點、heading節點、body節點

2)xml語法規則
(1)、 所有的xml元素(樹的節點)都必須有一個關閉標簽,否則會出現錯誤無法解析xml文件
(2)、 Xml標簽對大小寫敏感,在html當中大小寫是不敏感的
(3)、 Xml必須正確嵌套,不能說咱們一這里寫個<p1>這樣一個標簽,在另外一方寫個<p2>標簽,然后用<p1>閉合該標簽,最后又寫個<p2>,那這個時候,它就是個錯誤的格式,咱們必須嵌套,而不能一個標簽嵌套了另外一個標簽
(4)、 Xml屬性值必須加引號,比如說有個p標簽,標簽里面有個a屬性,屬性里面有對應的值,那么這個sa值就是需要加引號括起來,如果沒有就會報錯,然后用</p>標簽閉合,<p a='' sa''></p>
(5)、 實體引用 比如說<p a=''sa''></p>的這些屬性中以及對應的值中會出現大于和小于等一些符號,這些符號在xml當中是有聚體含義的,咱們必須使用xml對應的實體進行對應的表示,比如說小于號對應的就是lt后對應的符號,大于號就是gt后對應的符號。
(6)、 在xml中,空格會被保留 比如說<p a='' sa''></p>中的p標簽和p的結束標簽,在中間如果有A(空格)B,那這個時候A和B之間的空格就會被保存。

3)、 xml元素介紹
xml元素是指從(且包括)開始標簽直到(且包括)結束標簽的部分,每個元素又可以有對應的屬性,xml屬性必須加引號 ,首先的話note是一個根元素,下面是子元素,子元素里面就是一些嵌套的關系。那么這些元素的名稱都可以改變。比如說note修改為m1的一些操作.

4)、 Xml DTD介紹
剛才說了關于xml的語法規則以及對應的元素,這樣一個靈活存儲數據的文件格式,那我們勢必要有一些約束規則來使得它符合這個規則,咱們用戶定義的這個規則,才能把標明咱們這個數據是正確的,那這個時候我們就用xml DTD進行校驗,
擁有正確的語法的xml被稱為"形勢良好"的xml。通過DTD驗證的xml是"合法"的xml


5)DTD快速入門
(1)、DTD聲明介紹
內部的DCOTYPE聲明:<!DOCTYPE root-element [element-declaeations]>
<根元素 [元素聲明]>,首先是note根元素,用了方括號括起來了

這里是對應的子元素

用子元素的描述用的是element,首先描述的是根元素note,然后對應是子元素(用括號括起來的的就是子元素),可以看見to是一個子元素。括號內的就是對應的類型,所以我們稱之為內部DTD

外部文檔聲明:假如DTD位于xml源文件的外部,那么它應通過下面的語法被封裝在一個DOCTYPED定義中:<!DOCTYPE root-element SYSTEM "filename">

這個是個xml的文件

首先用了DOCTYPE note根元素,然后用SYSTEM用引用note.dtd

而note.dtd是外部的dtd文件,這個dtd文件以下內容是描述對應的元素,結構首先是根元素note,然后對應的是子元素,接下來都是子元素對應的類型以及名稱。都是用ELEMENT進行聲明

(2)、DTD數據類型
PCDATAd的意思是被解析的字符數據(parsed character data) PCDATA是會被解析器解析的文本。這些文件將被解析器檢查實體以及標記,可以看見這個圖。PCDATA是會被解析器作為合法的內容進行解析。

CDATA的意思是字符數據(character data)
CDATA是不會解析器解析的文本,在這些文本中的標簽不會被當作標記來對待,其中的實體也不會被展開,那么只作為一個普通的文本做處理
Pcdata是xml的解析器,可用于識別
Cdata無法進行識別的
(3)、DTD實體介紹

3、Xml注入產生原理
1)Xxe漏洞全稱xml external entity injection即xml外部實體注入漏洞,xxe漏洞發生在應用程序解析xml輸入時,沒有禁止外部實體的加載,導致可加載惡意外部文件,造成文件讀取、命令執行、內網端口掃描、攻擊內網網站、發起dos攻擊等危害。
Xxe/xml漏洞觸發的點往往是可以上傳xml文件的位置,沒有對上傳的xml文件進行過濾,導致可上傳的惡意xml文件。
2)、 測試代碼介紹
首先要的是file_get_contents()來獲取對應的數據流,獲取的數據流是一個php://input這樣一個可讀的數據流,可以通過post的提交方式來將這個流輸入對應的內容,通過file_get_contents()讀取然后保存到$xml, 然后調用simplexml_load_string()加載$xml存儲的字符串,保存到$data,然后用echo進行格式化輸出。

3)Xxe漏洞利用-任意文件讀取
首先這里是我們的一個靶機,我們用burp進行登錄抓包

可以看見我們的數據包是這樣的,其中就有一些xml的一些格式,我們將數據包發送到repeater模塊

這個是我們的讀取本地文件的payload,利用file偽協議去讀取c盤下的win.ini文件內容

那么我用這個payload讀取了d盤下的1.txt文件,并且返回了文本中的內容


4)讀取php文件
直接利用file協議讀取php文件會出現錯誤,那么需要使用base64編碼來進行讀取
那我直接讀取了本地的xxe.php內容,并且以base64編碼的形式輸出,那么我們就可以拿這個編碼進行base64解碼

解碼出來的就是我們的xxe漏洞的代碼

另外也有不同語言支持不同的協議。

最后喜歡我文章的朋友請加圈子關注我們,私信關鍵詞:加群。
識,提升大家的網絡安全技能一直是我們的初衷和愿景,讓我們共同成為守護信息世界的"SaFeMAN"。
還有可以關注我們微信公眾號,在公眾號上輸入安界網,就可以關注到我們。