XML上的安全不容忽視
KCon Web安全大會是一個交流前沿、邊緣、主流的Web安全技術(shù)、技巧、案例的開放安全會議。大會上天融信阿爾法實驗室張晨做了《Having Fun with XML Hacking》議題演講,內(nèi)容非常精彩。本文把演講的內(nèi)容稍加整理,與大家分享。
XML的全稱是eXtensible Markup Language,意思是可擴展的標(biāo)記語言,它是標(biāo)準(zhǔn)通用標(biāo)記語言(Standard Generalized Markup Language,SGML)的一個子集。
在80年代早期,IBM提出在各文檔之間共享一些相似的屬性,例如字體大小和版面。IBM設(shè)計了一種文檔系統(tǒng),通過在文檔中添加標(biāo)記,來標(biāo)識文檔中的各種元素,IBM把這種標(biāo)識語言稱作通用標(biāo)記語言(Standard Generalized Markup Language,SGML),即GML。經(jīng)過若干年的發(fā)展,1984年國際標(biāo)準(zhǔn)化阻止(ISO)開始對此提案進行討論,并于1986年正式發(fā)布了為生成標(biāo)準(zhǔn)化文檔而定義的標(biāo)記語言標(biāo)準(zhǔn)(ISO 8879),稱為新的語言SGML,即標(biāo)準(zhǔn)通用標(biāo)記語言。
一個簡單的XML文件示例,一個XML文件由XML聲明、文檔類型定義和文檔元素組成。
那么什么是文檔類型定義呢?文檔類型定義,也叫DTD(Document Type Definition),可定義合法的XML文檔構(gòu)建模塊。它使用一系列合法的元素來定義文檔的結(jié)構(gòu),DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
DTD文檔的聲明及引用
內(nèi)部DTD文檔
<!DOCTYPE 根元素 [定義內(nèi)容]>
外部DTD文檔
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑">
內(nèi)外部DTD文檔結(jié)合
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑" [
定義內(nèi)容
-]>
XML被設(shè)計用來存儲和傳輸數(shù)據(jù),任何平臺上的程序都可以通過使用XML解析器來處理XML數(shù)據(jù),XML的使用范圍非常廣泛,不僅僅是web應(yīng)用,還包括數(shù)據(jù)庫軟件、瀏覽器等等。既然XML的覆蓋面這么廣,那么如果出現(xiàn)安全問題也是相當(dāng)可怕的。而且很多軟件都是使用的同一款XML解析庫,如果這套解析庫存在漏洞,那么無疑又將影響的范圍擴大了。
下面這張圖很清晰的描述了程序在處理XML時容易出現(xiàn)問題的點,我們逐步來看:應(yīng)用先將原始數(shù)據(jù)交給XML生成器,生成XML數(shù)據(jù),然后將生成后的XML數(shù)據(jù)提交到web服務(wù)器,web服務(wù)器接收到XML數(shù)據(jù)后,將XML數(shù)據(jù)交給XML解析器,由XML解析器完成對XML數(shù)據(jù)的解析后把數(shù)據(jù)再返回給應(yīng)用。在整個數(shù)據(jù)處理流程中,XML生成器和XML解析器這兩個點是最容易出現(xiàn)問題的。
在XML解析的過程中,最常見的有三種漏洞:
◆拒絕服務(wù)漏洞
◆XML注入
◆XML外部實體注入
XML拒絕服務(wù)漏洞
我們逐個分析,先來看拒絕服務(wù)攻擊。
下圖是一個典型拒絕服務(wù)攻擊的payload:
可以看到,payload中先定義了lol實體,值為“lol”字符串,然后下面又定義了lol2實體,在lol2實體中,引用10個lol實體,也就是說現(xiàn)在lol2的值是10個“lol”字符串,下面的lol3又引用了10個lol2實體的值,現(xiàn)在lol3的值是100個“lol”字符串,依此類推,到了最后在lolz元素中引用的lol9中,就會存在上億個“lol”字符串,如果程序在解析數(shù)據(jù)時沒有做特別的處理,那么極有可能對程序造成拒絕服務(wù)攻擊。
XML注入漏洞
再來看XML注入的例子:
例圖這是一個標(biāo)準(zhǔn)的xml文件,即將被提交到web服務(wù)器中,我們假設(shè)這是一個存有訂單信息的xml文件,其中price的值不可控,quantity和address項的值可控,可以由用戶自由輸入,那么這時,攻擊者可以實施xml注入攻擊,在quantity的值中構(gòu)造"<!--",注釋符,然后在address的值中先閉合前面的注釋符,然后再重新根據(jù)原xml文件結(jié)構(gòu)重新構(gòu)造xml文件,這時候price元素的值也是可以由攻擊者隨意構(gòu)造的,如下圖:
可以看到,我們重新構(gòu)造出了一個xml文件,這時候price的值由原來的25變成了0.01,也就是說,訂單的價格被成功的修改了。
XML外部實體注入
在眾多xml漏洞中,最容易出現(xiàn)的就是XXE(XML_External_Entity),也就是XML外部實體注入攻擊。在文檔類定定義部分,可以引用外部的dtd文件,dtd文件的路徑可以是URL地址,也可以使用多種協(xié)議,所以在這里會出現(xiàn)安全問題。
上圖為一個標(biāo)準(zhǔn)的XXE Payload,可以看到,這里引用的外部實體為file:///etc/passwd,如果XML解析庫在解析到這里時允許引用外部實體,那么程序?qū)埱筮@個地址,并將內(nèi)容返回。
對于XXE漏洞,我們還有更多的利用技巧,比如某些場景下,我們需要在一次請求中讀取多個文件,那么可以用下面的payload來實現(xiàn):
XXE不光可以讀取文件,還可以通過SSRF來完成更深入的攻擊。SSRF(Server Side Request Forgery)被稱為服務(wù)端請求偽造攻擊,與CSRF不同的是它的請求是由服務(wù)器發(fā)起的,并不是由客戶端發(fā)起。
通過這張圖我們可以看到,攻擊者先發(fā)送包含payload的請求到前端,前端接到數(shù)據(jù)后將xml數(shù)據(jù)發(fā)送到后端的xml解析器進行解析,這時payload被執(zhí)行,payload執(zhí)行后,結(jié)果可能會直接被后端返回給攻擊者,也可能由payload中所指向的服務(wù)器返回給攻擊者。
更常見的攻擊場景如下:
攻擊者想要訪問主機B上的服務(wù),但是由于存在防火墻的原因無法直接訪問,這是可以借助主機A來發(fā)起SSRF攻擊,通過主機A向主機B發(fā)起請求,從而完成攻擊。
SSRF攻擊常用的payload如下:
Portscan實體是通過http協(xié)議來訪問主機的某些端口,通過返回信息來判斷端口是否開放。Smb實體是訪問內(nèi)網(wǎng)中的共享資源,Sqli實體是對內(nèi)網(wǎng)中web服務(wù)器發(fā)起sql注入攻擊,Syslog實體可以像內(nèi)網(wǎng)syslog服務(wù)器添加垃圾日志。
除了這些,還可以擴展思路,比如對內(nèi)網(wǎng)中的zabbix_agent進行攻擊(在外部實體引用 gopher://ip:10050/1system.run[ls]),即可在該主機執(zhí)行系統(tǒng)命令。
在PHP環(huán)境下,還可以利用封裝協(xié)議來直接執(zhí)行系統(tǒng)命令,如expect://。也可以用php://來讀取文件內(nèi)容。
除了這些,還支持其他很多協(xié)議,可以自由發(fā)揮編寫payload。
隨著應(yīng)用越來越龐大、邏輯越來越復(fù)雜,有些需求要用到XML來實現(xiàn),但很多開發(fā)人員還沒有充分意識到在使用和解析XML文件時可能會導(dǎo)致安全問題出現(xiàn),XML漏洞也是一個比較好的研究方向。
天融信阿爾法實驗室作為北京天融信前沿安全研究部門,在安全漏洞研究發(fā)掘、最新Web安全及瀏覽器安全問題研究、軟件逆向研究等諸多領(lǐng)域積累了大量的成果,獲得了國際CVE漏洞編號、中國國家漏洞庫漏洞編號的各類型原創(chuàng)漏洞證書。在所發(fā)現(xiàn)的不同類型的安全漏洞中,不乏大量的國產(chǎn)軟件,阿爾法實驗室都在第一時間通知了軟件廠商,并提供修補建議,為保障國產(chǎn)軟件的安全性做出了貢獻。同時作為國家不同部委類型單位的技術(shù)服務(wù)支撐成員,天融信阿爾法實驗室為國家相關(guān)部門提供了不同類型技術(shù)支持,在安全漏洞研究、安全趨勢研究判斷、惡意非法軟件分析以及移動設(shè)備安全等技術(shù)領(lǐng)域做出了突出的貢獻。