英文全名即 Xml External Entity Injection, 即我們所說的 xml 外部實體注入攻擊。
實體可以通過預定義在文檔中被調用,而實體的標識符又可以訪問本地或者遠程內容,當允許引用外部實體時,攻擊者便可以構造惡意內容來達到攻擊。
XML:
xml
是一種可擴展的標記語言,主要就是用來傳輸數據的,你可以理解爲就是一種寫法類似於 html 語言的數據格式文檔。但是 xml
跟 html
是爲不同目的而設計的,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">