[Web安全] XXE漏洞攻防學習(上)

0x00、XXE漏洞

XXE漏洞全稱XML External Entity Injection 即xml外部實體注入漏洞,XXE漏洞發生在應用程序解析XML輸入時,沒有禁止外部實體的加載,致使可加載惡意外部文件和代碼,形成任意文件讀取命令執行內網端口掃描攻擊內網網站發起Dos攻擊等危害。工具

XXE漏洞觸發的點每每是能夠上傳xml文件的位置,沒有對上傳的xml文件進行過濾,致使可上傳惡意xml文件。網站

 

0x0一、XML基礎知識

要了xxe漏洞,那麼必定得先弄明白基礎知識,瞭解xml文檔的基礎組成spa

XML 指可擴展標記語言(Extensible Markup Language)設計

XML 被設計用來傳輸存儲數據。
HTML 被設計用來顯示數據

XML把數據從HTML分離,XML是獨立於軟件和硬件的信息傳輸工具。code

XML語言沒有預約義的標籤,容許做者定義本身的標籤和本身的文檔結構xml

XML的語法規則:對象

  • XML 文檔必須有一個根元素
  • XML 元素都必須有一個關閉標籤
  • XML 標籤對大小敏感
  • XML 元素必須被正確的嵌套
  • XML 屬性值必須加引導
<?xml version="1.0" encoding="UTF-8"?> <!--XML 聲明-->
<girl age="18">  <!--自定的根元素girl;age屬性須要加引導-->
<hair>長頭髮</hair>  <!--自定義的4個子元素,即girl對象的屬性-->
<eye>大眼睛</eye>
<face>可愛的臉龐</face>
<summary>可愛漂亮麗的女孩</summary>
</girl>  <!--根元素的閉合-->

實體引用blog

在 XML 中,一些字符擁有特殊的意義。utf-8

若是您把字符 "<" 放在 XML 元素中,會發生錯誤,這是由於解析器會把它看成新元素的開始。element

這樣會產生 XML 錯誤:

<message>if salary < 1000 then</message>

爲了不這個錯誤,請用實體引用來代替 "<" 字符:

<message>if salary &lt; 1000 then</message>

在 XML 中,有 5 個預約義的實體引用:

&lt;      <                  小於號           
&gt;       >        大於號
&amp;        & 和號
&apos;       ' 單引號
&quot; " 引號

 

 

 

 

 

0x0二、DTD (Document Type Definition)

DTD(文檔類型定義)的做用是定義XML文檔的合法構建模塊

DTD 可被成行地聲明於 XML 文檔中,也可做爲一個外部引用。

<!--XML聲明-->
<?xml version="1.0"?> 
<!--文檔類型定義-->
<!DOCTYPE note [    <!--定義此文檔是 note 類型的文檔-->
<!ELEMENT note (to,from,heading,body)>  <!--定義note元素有四個元素-->
<!ELEMENT to (#PCDATA)>     <!--定義to元素爲」#PCDATA」類型-->
<!ELEMENT from (#PCDATA)>   <!--定義from元素爲」#PCDATA」類型-->
<!ELEMENT head (#PCDATA)>   <!--定義head元素爲」#PCDATA」類型-->
<!ELEMENT body (#PCDATA)>   <!--定義body元素爲」#PCDATA」類型-->
]]]>
<!--文檔元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

上述XML代碼基本分爲三個部分:

第一部分是XML的聲明;

第二部分是XML的DTD文檔類型定義

第三部分是XML語句

而外部實體攻擊主要利用DTD的外部實體來進行注入的。

DTD有兩種構建方式,分別爲內部DTD聲明外部DTD聲明

內部DTD聲明:

<!DOCTYPE 根元素 [元素聲明]>

實例:如上述代碼

外部DTD聲明:

<!DOCTYPE 根元素 SYSTEM "文件名">

實例:

<?xml version="1.0"?>
<!DOCTYPE root-element SYSTEM "test.dtd">
<note>
<to>Y</to>
<from>K</from>
<head>J</head>
<body>ESHLkangi</body>
</note>

test.dtd

<!ELEMENT to (#PCDATA)><!--定義to元素爲」#PCDATA」類型-->
<!ELEMENT from (#PCDATA)><!--定義from元素爲」#PCDATA」類型-->
<!ELEMENT head (#PCDATA)><!--定義head元素爲」#PCDATA」類型-->
<!ELEMENT body (#PCDATA)><!--定義body元素爲」#PCDATA」類型-->

PCDATA的意思是被解析的字符數據。PCDATA是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。文本中的標籤會被看成標記來處理,而實體會被展開。

CDATA意思是字符數據,CDATA 是不會被解析器解析的文本,在這些文本中的標籤不會被看成標記來對待,其中的實體也不會被展開。

 

DTD實體一樣有兩種構建方式,分別爲內部實體聲明和外部實體聲明。

內部實體聲明:

<!ENTITY entity-name "entity-value">

實例:

<?xml version="1.0"> <!DOCTYPE note [ <!ELEMENT note(name)> <!ENTITY hacker "ESHLkangi"> ]> <note> <name>&hacker;</name> </note>

外部實體聲明:

<!ENTITY entity-name SYSTEM "URL/URL">

默認協議

PHP擴展協議

 

 實例:

<?xml cersion="1.0"> <!DOCTYPE hack [ <!ENTITY xxe SYSTEM "file:///etc/password"> ]> <hack>&xxe;</hack>

上述代碼中,XML的外部實體「xxe」被賦予的值爲:file:///etc/passwd

當解析xml文檔是,xxe會被替換爲file:///ect/passwd的內容。

參數實體+外部實體:

<?xml version="1.0" encoiding="utf-8">
<!DOCTYPE hack [
    <!ENTITY % name SYSTEM "file:///etc/passwd">
   %name; 
]>

"%name"(參數實體)實在DTD中被引用,而"&name;"是在xml文檔中被引用的。

XXE漏洞攻擊主要是利用了DTD引用外部實體致使的漏洞。

 

0x0三、攻擊思路

一、引用外部實體遠程文件讀取

二、Blind XXE

三、Dos

 

攻擊實例:看下篇

相關文章
相關標籤/搜索