作者:
小飛
·
2015/03/23 10:41
0x00 XML簡介
XML 可擴充套件標記語言,被設計用來傳輸和儲存資料。其形式多樣
例如:
1.文件格式(OOXML,ODF,PDF,RSS,DOCX...)
2.圖片格式(SVG,EXIF Headers,...)
3.配置檔案(自定義名字,一般是.xml)
4.網路協議(WebDAV,CalDAV,XMLRPC,SOAP,REST,XMPP,SAML,XACML,...)
某些在XML中被設計出來的特性,比如 XML schemas(遵循XML Schemas 規範)和documents type definitions(DTDs)都是安全問題來源。縱然被公開的討論了上十年,還是有一大批一大批的軟體死在針對XML的攻擊上。
其實XML實體機制很好理解,可以直接用“轉義”來理解:%
和&foo
從原始意義上來說是一樣的,只是後者是由我們自己來定義任意內容。
拿DTD來說,DTD中能宣告實體來定義變數(或是文字類的宏),以便在接下來的DTD或者XML文件中使用。一般實體在DTD中定義,用來訪問內部資源,獲取裡面的文字並用來替換自己的xml文件,而外部實體用來訪問外部資源(也就是說,這些資源能來自本地計算機,也可以是遠端主機)。在解析外部實體的過程中,XML的分析器可能會使用眾多網路協議和服務(DNS,FTP,HTTP,SMB等等)這取決於URLs裡面被指定成什麼。外部實體用來處理那些實時更新的文件是很有用的,然而,攻擊也能在解析外部實體的過程中發生。攻擊手段包括:
讀取本地檔案(可能包含敏感資訊 /etc/shadow)
記憶體侵犯
任意程式碼執行
拒絕服務
本文將對長期以來出現的xml攻擊方法進行一個總結。
0x01 初識XML外部實體攻擊
基於外部實體的檔案包含
最早被提出的XML攻擊方法是利用外部實體的引用功能來實現任意檔案讀取
#!xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE updateProfile [
<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
<updateProfile> <firstname>Joe</firstname> <lastname>&file;</lastname>
...
</updateProfile>
然而這種讀取是有限制的,因為xml的解析器要求被引用的資料是完整的,我們使用一個例子來解釋什麼是完整。
#!xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE simpleDocument [
<!ENTITY first "<my">
<!ENTITY second "tag/>"> ]>
<simpleDocument>&first;&second;</simpleDocument>
如上的xml文件當傳送給伺服器時,實際上是會產生一個錯誤的 其中<my 和tag/>
雖然在組合在一起時是能夠完美閉合的,但是這些實體由於在第3,4行就被解析一次,此時由於不是完美閉合的,就會丟擲一個錯誤。
這種錯誤讓xml攻擊一度變得雞肋起來,因為實際上很多檔案都是“未閉合形式”的,比如在php檔案推薦的寫法中就是隻有前面一個"<?php"
而包含這樣一個檔案無疑會導致一個錯誤。
更糟糕的是,當你選擇包含的是一個完整的xml檔案(比如資料庫連線檔案)的時候,返回結果將是
可以看到,在