漏洞經驗分享丨Java審計之XXE(上)


最近在審計公司的某個項目時(Java方面),發現了幾個有意思的Blind XXE漏洞,我覺得有必要分享給大家,尤其是Java審計新手,了解這些內容可以讓你少走一些彎路。

Java總體常出現的審計漏洞如下:

>SQL注入

>XSS

>CSRF

>XXE

>SSRF

>CRLF注入

>遠程命令執行

>反序列化

>文件上傳

>任意文件刪除

>文件下載

>DWR接口未授權訪問

>JSONP

>URL報名單繞過

 

XXE簡介

XXE(XML外部實體注入、XML External Entity),在應用程序解析XML輸入時,當允許引用外部實體時,可以構造惡意內容導致讀取任意文件或SSRF、端口探測、DoS拒絕服務攻擊、執行系統命令、攻擊內部網站等。

Java中的XXE支持sun.net.www.protocol里面的所有協議:http,https,file,ftp,mailto,jar,netdoc 。一般利用file協議讀取文件、利用http協議探測內網,沒有回顯時可組合利用file協議和ftp協議來讀取文件。

 

相關基礎概念

XML&DTD

XML(可擴展標記語言,EXtensible Markup Language ),是一種標記語言,用來傳輸和存儲數據。

DTD(文檔類型定義,Document Type Definition )的作用是定義XML文檔的合法構建模塊。它使用一系列的合法元素來定義文檔結構。

實體ENTITY

XML中的實體類型,一般有下面幾種:字符實體,命名實體(或內部實體)、外部實體(包含分為:外部普通實體、外部參數實體)。除外部參數實體外,其他實體都以字符(&)開始以字符(;)結束。

0x1):字符實體

字符實體類似html的實體編碼,形如a(十進制)或者a(十六進制)。

0x2):命名實體(內部實體)

內部實體又叫命名實體。命名實體可以說成是變量聲明,命名實體只能在DTD或者XML文件開始部分(<!DOCTYPE>語句中)。

命名實體(或內部實體語法):

`<!ENTITY 實體名稱 "實體的值">`

如:

漏洞經驗分享丨Java審計之XXE(上)

 

說明:

定義一個實體名稱x 值為First Param!

&x; 引用實體x

知道以上語法后,可以使用名為foo的數據類型定義(DTD)構造如下請求:

request:

漏洞經驗分享丨Java審計之XXE(上)

 

bar元素是單詞“World”的別名 。看起來這樣的內部實體似乎無害,但攻擊者可以使用XML實體通過在實體內嵌入實體來導致拒絕服務攻擊。通常被稱為“ (Billion Laughs attack)十億笑攻擊 ”。某些XML解析器會自動限制它們可以使用的內存量。

如:

request:

漏洞經驗分享丨Java審計之XXE(上)

 

response:

HTTP/1.0 200 OK

Hello World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World

 

0x3):外部普通實體

外部實體用於加載外部文件的內容。(顯示XXE攻擊主要利用普通實體)

外部普通實體語法:

<!ENTITY 實體名稱 SYSTEM "URI/URL"

如:

漏洞經驗分享丨Java審計之XXE(上)

 

0x4):外部參數實體

參數實體用於DTD和文檔的內部子集中。與一般實體不同,是以字符(%)開始,以字符(;)結束。只有在DTD文件中才能在參數實體聲明的時候引用其他實體。(Blind XXE攻擊常利用參數實體進行數據回顯)

漏洞經驗分享丨Java審計之XXE(上)

 

combine.dtd的內容為:

<!ENTITY content "%parm1;%parm2;%parm3;">

說明:

上面combine.dtd中定義了一個基本實體,引用了3個參數實體:%param1;,%param2;,%param3;。

解析后<foo>…</foo>中的內容為Hello World。

 

XML外部實體的一些限制與解決辦法

error

通常對於XXE的經典用法,用來讀取文件比較直接方便,但是,也決定了能被解析的內容元素必須是XML文檔。

如下面一個例子:

request:

漏洞經驗分享丨Java審計之XXE(上)

 

response:

通常會得到如下響應

HTTP/1.0 500 Internal Server Error

File "file:///etc/fstab", line 3

lxml.etree.XMLSyntaxError: Specification mandate value for attribute system, line 3, column 15...

/etc/fstab是一個包含一些看起來像XML的字符的文件(即使它們不是XML)。這將導致XML解析器嘗試解析這些元素,只是注意到它不是有效的XML文檔。

因此,這限制了XML外部實體(XXE)在以下兩個重要方面:

  • XXE只能用於獲取包含“有效”XML的文件或響應
  • XXE不能用於獲取二進制文件

 

XML外部實體(XXE)限制解決辦法

這其實也就用到了外部參數實體,解決了命名實體和普通實體所帶來的一些問題。具體如下分析:

攻擊者可以通過使用一些巧妙的技巧來解決上述限制。攻擊者使用XML外部實體(XXE)攻擊所面臨的主要問題是,它很容易撞了南牆試圖exfiltrate不是有效的XML文件(包含XML特殊字符,如例如,文件明文文件時&,< and >)。

理論上的解決辦法

XML已經解決了這個問題,因為有些合法的情況可能需要在XML文件中存儲XML特殊字符。CDATAXML解析器忽略(Character Data)標記中的特殊XML字符。

漏洞經驗分享丨Java審計之XXE(上)

 

因此,從理論上講,攻擊者可以發送類似於以下內容的請求。

request:

漏洞經驗分享丨Java審計之XXE(上)

 

預期response:

漏洞經驗分享丨Java審計之XXE(上)

 

但實際上並不起作用,因為XML規范不允許將外部實體與內部實體結合使用。

內部實體代碼示例:

漏洞經驗分享丨Java審計之XXE(上)

 

外部實體代碼示例:

漏洞經驗分享丨Java審計之XXE(上)

 

參數實體

然而,攻擊者仍然可以扔出手里的另一張牌-——參數實體,在得到以上限制解決方法之前先理解兩個重點:

重點一:

實體分為兩種,內部實體和外部實體,上面我們舉的例子就是內部實體,但是實體實際上可以從外部的 dtd 文件中引用,我們看下面的代碼:

還是以上代碼

漏洞經驗分享丨Java審計之XXE(上)

 

重點二:

我們上面已經將實體分成了兩個派別(內部實體和外部實體),但是實際上從另一個角度看,實體也可以分成兩個派別(通用實體和參數實體)

通用實體

用&實體名:引用的實體,他在DTD中定義,在XML文檔中引用。

示例代碼:

 

漏洞經驗分享丨Java審計之XXE(上)

 

參數實體

 

(1)使用 % 實體名(這里面空格不能少) 在 DTD 中定義,並且只能在 DTD 中使用 %實體名;引用

(2)只有在 DTD 文件中,參數實體的聲明才能引用其他實體。

(3)和通用實體一樣,參數實體也可以外部引用。

示例代碼:

漏洞經驗分享丨Java審計之XXE(上)

 

參數實體在我們 Blind XXE 中起到了至關重要的作用

接下來怎么做?(解決辦法)

除了一般實體,這是我們到目前為止所看到的,還有參數實體。 以下是參數實體的外觀。它與一般實體相同,除了它存在於DTD內部並以%作為前綴開始,以指示XML解析器正在定義參數實體(不是通用實體)。在下面的示例中,參數實體用於定義通用實體,然后在XML文檔內部調用該實體。

request:

漏洞經驗分享丨Java審計之XXE(上)

 

考慮到上面的示例,攻擊者現在可以通過創建在attacker.com/evil.dtd上托管的惡意DTD,將上面的理論CDATA示例轉換為工作攻擊。

request:

漏洞經驗分享丨Java審計之XXE(上)

 

解析:

當攻擊者發送上述請求時,XML解析器將首先%dtd通過向

http://attacker.com/evil.dtd發出請求來嘗試處理參數實體。

一旦下載了攻擊者的DTD,XML解析器將加載%file參數實體(來自evil.dtd),在本例中是/etc/fstab。然后它將分別<![CDATA[ ]]>使用%start和%end參數實體將文件的內容包裝在標簽中,並將它們存儲在另一個名為的參數實體中%all。

這個技巧的核心是%all創建一個被調用的通用實體&fileContents;,它可以作為響應的一部分包含在攻擊者中。

注:請記住,攻擊者可以只使用DTD內參數實體,而不是內部的XML文檔。

結果是回復攻擊者,文件(/etc/fstab)的內容包含在CDATA標簽中。

XXE審計函數

XML解析一般在導入配置、數據傳輸接口等場景可能會用到,涉及到XML文件處理的場景可查看XML解析器是否禁用外部實體,從而判斷是否存在XXE。部分XML解析接口(常見漏洞出現函數)如下:

漏洞經驗分享丨Java審計之XXE(上)

 

以上是今天分享的內容,在下期文章中我將繼續分享Blind XXE與OOB-XXE的相關知識點以及XXE防御方法等,小伙伴們不要錯過哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM