邱永哲
摘 要:為提高Web應(yīng)用程序接口的安全性,文章介紹了一種基于XML外部實(shí)體的注入漏洞-XXE漏洞。通過列舉該漏洞的一些攻擊方式及其造成的危害,能對(duì)程序開發(fā)者起到警示作用,最后給出了該漏洞的防御方法,對(duì)安全實(shí)現(xiàn)Web應(yīng)用程序的接口提供了參考。
關(guān)鍵詞:Web應(yīng)用程序;接口;XML;注入漏洞
當(dāng)前,伴隨著云計(jì)算的蓬勃發(fā)展,互聯(lián)網(wǎng)應(yīng)用正逐步邁向微服務(wù)化、容器化、接口化,互聯(lián)網(wǎng)入口也正在從傳統(tǒng)的PC向種類繁多的智能設(shè)備和IoT設(shè)備轉(zhuǎn)移。因此,隨之帶來的網(wǎng)絡(luò)安全問題也愈發(fā)嚴(yán)峻,引起眾多政府組織的關(guān)注[1]。2017年4月,開放式Web應(yīng)用程序安全項(xiàng)目發(fā)布了2017年Web安全十大問題,首次將“未受有效保護(hù)的應(yīng)用程序的調(diào)用接口( Application Programming Interface,API)”列入了OWASP Top 10,指出了應(yīng)用程序接口存在易受攻擊的風(fēng)險(xiǎn)。常見的應(yīng)用程序接口之間數(shù)據(jù)傳遞的格式有XML和JSON等,如果在這些傳遞數(shù)據(jù)的過程中未對(duì)接口進(jìn)行保護(hù),將造成服務(wù)器被攻擊的嚴(yán)重安全事故[2]。本文在XML的基礎(chǔ)上介紹了一種較為嚴(yán)重的注入漏洞-XXE漏洞,并針對(duì)該漏洞列舉了一些攻擊手段和防御方法,為應(yīng)用程序接口的安全實(shí)現(xiàn)與開發(fā)提供了參考。
1 XXE漏洞簡介
1.1 XML基礎(chǔ)
XML是一種標(biāo)記語言,目前被廣泛地用來作為跨平臺(tái)之間交互數(shù)據(jù)的形式,主要針對(duì)不同的數(shù)據(jù)內(nèi)容,通過不同的格式化描述手段完成最終的形式表達(dá)[3]。XML能定義數(shù)據(jù)的結(jié)構(gòu)、存儲(chǔ)信息,例如將小張發(fā)送給小李的短信存儲(chǔ)為XML格式:
<?xml version=" 1.0"?>
如圖l所示,一個(gè)完整的XML文檔應(yīng)當(dāng)包括XML聲明、文檔元素,有時(shí)也包括文檔類型定義(Document TypeDefinition, DTD)。
DTD可以將它看作是一個(gè)或者多個(gè)XML文檔的模板,在這里可以定義XML文件中的元素、元素的屬性、元素的排列方式、元素包含的內(nèi)容等。DTD文檔類型定義由4個(gè)關(guān)鍵字組成:元素(Element)、屬性(Attribute),實(shí)體( Entity)、注釋(Comments)。XXE漏洞就是由DTD中的“實(shí)體”引發(fā)[4]。
1.2 XXE漏洞原理
在XML l.0標(biāo)準(zhǔn)當(dāng)中首次引入了“實(shí)體(Entity)”的概念,其作用類似于Word當(dāng)中的“宏”。實(shí)體標(biāo)識(shí)符的定義方式分為兩種,一種是在DTD中內(nèi)部聲明實(shí)體:
另一種是在DTD中引入外部實(shí)體:
或者:
其中,外部實(shí)體可以訪問存儲(chǔ)在本地或者遠(yuǎn)程的文件,因此XML文檔在處理DTD定義中的外部實(shí)體時(shí),如不做好防護(hù),將產(chǎn)生信息泄露、SSRF等漏洞。這也被叫作是XXE(XML External Entity injection)漏洞,即XML外部實(shí)體注入。
對(duì)于XXE漏洞的測(cè)試,可以使用DNS帶外查詢的方式來進(jìn)行驗(yàn)證,例如某服務(wù)器能處理XML格式的請(qǐng)求數(shù)據(jù),可將如下PoC發(fā)送給服務(wù)器進(jìn)行漏洞驗(yàn)證:
<?xml version=" 1.0"?>
]> 借助XXE漏洞,攻擊者能夠?qū)崿F(xiàn)對(duì)服務(wù)器的任意文件讀取、拒絕服務(wù)攻擊、代理掃描內(nèi)網(wǎng)等。但是不同的XML解析器對(duì)外部實(shí)體的處理規(guī)則不同,例如在PHP中常用來處理XML數(shù)據(jù)的函數(shù)有simplexml_load_string和expat庫中的xml_parse,xml_parse函數(shù)默認(rèn)情況下不會(huì)解析DTD中的外部實(shí)體,但simplexml_load_string默認(rèn)會(huì)解析外部實(shí)體導(dǎo)致XXE。除PHP以外,Java、Python平臺(tái)中處理XML的函數(shù)都可能會(huì)產(chǎn)生XXE漏洞。 2 XXE漏洞利用 2.1任意文件讀取 任意文件讀取是XXE漏洞最常見的利用方式,本文在Linux平臺(tái)下搭建了基于docker容器的測(cè)試環(huán)境來測(cè)試演示該漏洞的攻擊過程[5]。 首先使用docker容器創(chuàng)建Apache+PHP架構(gòu)服務(wù)器,隨后在服務(wù)器web目錄中創(chuàng)建包含有XXE漏洞的PHP文件simplexml_load_string.php,內(nèi)容為: <?php $data = file_get_content s ( 'php://input ' ) $xml = simplexml_load_string($data); ?> 即在該文件中使用PHP的simplexml_load_string函數(shù)來接收處理XML數(shù)據(jù)。接下來使用請(qǐng)求構(gòu)造工具Postman發(fā)送以下的XML請(qǐng)求: <?xml version=" 1.0" encoding=" utf-8"?>
請(qǐng)求響應(yīng)結(jié)果如圖2所示,可以看到這里使用file協(xié)議成功讀取到了服務(wù)器文件/etc/passwd,造成了服務(wù)器文件信息泄露,利用該方法還有可能讀取到服務(wù)器中存放的數(shù)據(jù)庫密碼、SVN服務(wù)器密碼等其他敏感信息。
2.2服務(wù)端請(qǐng)求偽造
在某些情況下服務(wù)器端存在XXE漏洞,但只能使用http協(xié)議通過帶外查詢檢測(cè),此時(shí)該XXE漏洞被稱為BlindXXE。由于無法使用file協(xié)議進(jìn)行文件讀取,Blind XXE無法帶來更大的攻擊面,但是如果能結(jié)合SSRF服務(wù)器端請(qǐng)求偽造,往往能發(fā)揮至關(guān)重要的作用。
例如某企業(yè)一臺(tái)處于網(wǎng)絡(luò)邊界的Apache服務(wù)器存在Blind XXE漏洞,該服務(wù)器使用雙網(wǎng)卡連接了企業(yè)內(nèi)部網(wǎng)絡(luò)10.4.10.0/24,企業(yè)內(nèi)網(wǎng)有一臺(tái)未授權(quán)即可訪問的Redis服務(wù)器10.4.10.7,如果這臺(tái)服務(wù)器未做好SSRF防護(hù),那么此時(shí)就可以利用這枚Bind XXE漏洞直接發(fā)起對(duì)內(nèi)網(wǎng)Redis服務(wù)器的攻擊:
<?xml version=" 1.0"?>
<!ENTITY b SYSTEM“http://123.123.123.123/ gopher.php”> ]> 其中123.123.123.123為攻擊者的服務(wù)器,gopher.php的內(nèi)容為: <?php header(Location: gopher://10.4.10.7:6379/ 一*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%Oa$60%Od%Oa%Oa%Oa*/1 **** bash—i>&/dev/tcp/12 3.123.123.12 3/77 77 0>&1%Oa%Oa%Od%Oa≠4%Od%Oa$ 6% Od% Oaconfig% Od% Oa$3%Od% Oadir% Od% Oa$16% Od%Oa/var/s pool/cron/% Od% Oa*4% Od% Oa$ 6% Od% Oaconfig%0d% Oa$3% Od% Oaset% Od% Oa$ 10% Od% Oadbfilename% Od%0a$ 4% Od%0 aroot%0d% Oa* 1%Od% Oa$4%0d% Oas ave%0d%0a)?> 這時(shí)候攻擊者將直接獲得內(nèi)網(wǎng)Redis服務(wù)器的權(quán)限進(jìn)而對(duì)企業(yè)內(nèi)網(wǎng)進(jìn)行進(jìn)一步滲透??梢姶藭r(shí)Blind XXE通過與SSRF的結(jié)合極大地拓展了攻擊面,為攻擊者進(jìn)一步的突破創(chuàng)造了條件。 2.3拒絕服務(wù)攻擊 由于XXE漏洞是由服務(wù)器端接收并處理用戶惡意數(shù)據(jù)造成,因此攻擊者還可以通過構(gòu)造復(fù)雜的邏輯來消耗服務(wù)器的運(yùn)算資源,最終導(dǎo)致拒絕服務(wù)攻擊。例如向一臺(tái)存在XXE漏洞的服務(wù)器發(fā)送如下的XML數(shù)據(jù): <?xml version="1.0"?> <101z>&1019;
2.4其他危害
事實(shí)上,XXE漏洞除了上述一些攻擊利用方式之外,也可能會(huì)出現(xiàn)更多的攻擊方式。XXE漏洞在不同語言和平臺(tái)上可能支持的協(xié)議如圖3所示。
而對(duì)于PHP應(yīng)用程序來說,如果安裝了更多PHP的擴(kuò)展例如expect協(xié)議,那么XXE漏洞將直接可以被轉(zhuǎn)化為命令執(zhí)行漏洞。
3 XXE漏洞防御方法
對(duì)XXE漏洞的防御要做到兩點(diǎn)。
(l)過濾用戶提交的XML數(shù)據(jù),禁止出現(xiàn)<!DOCTYPE、 <!ENTITY. SYSTEM和PUBLIC等關(guān)鍵字。
(2)在源代碼層面禁止使用外部實(shí)體。
#PHP
libxml disable_entity_loader(true);
#Java
DocumentbuilderFactory dbf =DocumentbuilderFactory.newlnstance();
dbf setExpandEntityRe ferences (false);
#Python
from lxml import etree
xmIData=etree.parse(xmISource. etree.XMLParse (resolve_entities=False》
[參考文獻(xiàn)]
[1]維基百科.XML[EB/OL].( 2017-12-15)[2018-02-08].https://zh.wikipedia.org/wiki/XML.
[2]維基百科.文檔類型定義[EB/OL]( 2017-12-26) [2018-02-08] .https://zh.wikipedia.org/、viki/文檔類型定義
[3]Timothy D.Mo-gan, Omar AI Ibrahim.XML Schema. DTD. and Entity Attacks -A Compendium of Known Techniques[EB/OL]( 2017-
10~25)[2018 - 02- 08].https://、vww.vsecurity.c om//download/p aper s/XMLDTDEntit yAttacks .pdf.
[4]維基百科.Billion laughs attack[EB/OL].( 2017-11-15) [2018-02-08] .https://enrvikipedia.org/、viki/Billion
laughs
attack.
[5]騰訊安全應(yīng)急響應(yīng)中心.未知攻焉知防-XXE漏洞攻防[EB/OL]( 2018-01-10) [2018-02-08] .https://security.tencent.com/index.p hp/blog/
msg/69.