XXE漏洞利用

英文全名即 Xml External Entity Injection, 即我們所說的 xml 外部實體注入攻擊。
實體可以通過預定義在文檔中被調用,而實體的標識符又可以訪問本地或者遠程內容,當允許引用外部實體時,攻擊者便可以構造惡意內容來達到攻擊。

XML:

xml 是一種可擴展的標記語言,主要就是用來傳輸數據的,你可以理解爲就是一種寫法類似於 html 語言的數據格式文檔。但是 xmlhtml 是爲不同目的而設計的,html 旨在顯示數據信息,而 xml 旨在傳輸數據信息

DTD:
xml 格式相關的就是這個叫 dtd(document type definition )的東西了,這個 dtd 的作用就是去定義 xml 文檔的合法構建模塊,也就是說聲明瞭 xml 的內容格式規範。

DTD的聲明方式:

1、內部 dtd:即對 XML 文檔中的元素、屬性和實體的 DTD 的聲明都在 XML 文檔中。

2、外部 dtd : 即對 XML 文檔中的元素、屬性和實體的 DTD 的聲明都在一個獨立的 DTD 文件(.dtd)中。

內部DTD的實例:


<!--XML聲明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,文檔類型聲明-->          
<!DOCTYPE note [
<!ELEMENT note (body)>
<!ELEMENT body (#PCDATA)>
<!ENTITY writer "hello word">        
]>

<!--文檔元素-->                                                                         
<note>
<body>&writer</body>
</note>

我們就 dtd 的內容一個一個來看,

1、!DOCTYPE note (第四行)定義此文檔是 note 類型的文檔。
2、!ELEMENT note (第五行)定義 note 元素有一個元素:“body "
3、!ELEMENT body (第六行)定義 body 元素爲 " #PCDATA” 類型
4、!ENTITY writer " hello world"(第七行)定義了一個內部實體

最後 body 元素標籤裏的"&writer"就是對內部實體的一個引用,到輸出的時候 &writer 就會被 "hello world" 替換。

外部DTD的實例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>

<root>
  <body>&xxe</body>
</root>

1、!ELEMENT foo ANY (第三行)定義元素爲 ANY,即可以接受任何元素。
2、!ENTITY xxe SYSTEM “file:///c:/test.dtd”(第四行)定義了一個外部實體

這裏樣義文檔就會對 c:/test.dtd 文件資源進行引用,這是一種用 SYSTEM 關鍵字的引用方式,還有一種用 PUBLIC 引用公用 DTD 的方式:

<!DOCTYPE 根元素名稱 PUBLIC "DTD標識名" "公用DTD的URI">
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章