国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

XXE漏洞攻擊與防御研究

2018-06-25 07:34邱永哲
無線互聯(lián)科技 2018年6期
關(guān)鍵詞:接口

邱永哲

摘 要:為提高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"?>

]>

&b;:

借助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"?>

]>

&xxe;:

請(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”>

]>

&b;:

其中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.

猜你喜歡
接口
某電站工程設(shè)計(jì)管理與施工、質(zhì)量控制接口關(guān)系研究
财经| 葫芦岛市| 华蓥市| 富民县| 淮安市| 陵水| 上蔡县| 武安市| 赫章县| 五常市| 高要市| 河北区| 绥化市| 泗阳县| 休宁县| 瑞安市| 新余市| 喀喇沁旗| 扎赉特旗| 哈密市| 封开县| 铜鼓县| 原平市| 濮阳县| 正定县| 屏东县| 庄浪县| 石台县| 奎屯市| 太康县| 澳门| 和林格尔县| 涞源县| 威海市| 伊通| 仪征市| 郓城县| 剑河县| 潜江市| 灵璧县| 沁水县|