邱永哲
摘 要:为提高Web应用程序接口的安全性,文章介绍了一种基于XML外部实体的注入漏洞-XXE漏洞。通过列举该漏洞的一些攻击方式及其造成的危害,能对程序开发者起到警示作用,最后给出了该漏洞的防御方法,对安全实现Web应用程序的接口提供了参考。
关键词:Web应用程序;接口;XML;注入漏洞
当前,伴随着云计算的蓬勃发展,互联网应用正逐步迈向微服务化、容器化、接口化,互联网入口也正在从传统的PC向种类繁多的智能设备和IoT设备转移。因此,随之带来的网络安全问题也愈发严峻,引起众多政府组织的关注[1]。2017年4月,开放式Web应用程序安全项目发布了2017年Web安全十大问题,首次将“未受有效保护的应用程序的调用接口( Application Programming Interface,API)”列入了OWASP Top 10,指出了應用程序接口存在易受攻击的风险。常见的应用程序接口之间数据传递的格式有XML和JSON等,如果在这些传递数据的过程中未对接口进行保护,将造成服务器被攻击的严重安全事故[2]。本文在XML的基础上介绍了一种较为严重的注入漏洞-XXE漏洞,并针对该漏洞列举了一些攻击手段和防御方法,为应用程序接口的安全实现与开发提供了参考。
1 XXE漏洞简介
1.1 XML基础
XML是一种标记语言,目前被广泛地用来作为跨平台之间交互数据的形式,主要针对不同的数据内容,通过不同的格式化描述手段完成最终的形式表达[3]。XML能定义数据的结构、存储信息,例如将小张发送给小李的短信存储为XML格式:
<?xml version=" 1.0"?>
如图l所示,一个完整的XML文档应当包括XML声明、文档元素,有时也包括文档类型定义(Document TypeDefinition, DTD)。
DTD可以将它看作是一个或者多个XML文档的模板,在这里可以定义XML文件中的元素、元素的属性、元素的排列方式、元素包含的内容等。DTD文档类型定义由4个关键字组成:元素(Element)、属性(Attribute),实体( Entity)、注释(Comments)。XXE漏洞就是由DTD中的“实体”引发[4]。
1.2 XXE漏洞原理
在XML l.0标准当中首次引入了“实体(Entity)”的概念,其作用类似于Word当中的“宏”。实体标识符的定义方式分为两种,一种是在DTD中内部声明实体:
另一种是在DTD中引入外部实体:
或者:
其中,外部实体可以访问存储在本地或者远程的文件,因此XML文档在处理DTD定义中的外部实体时,如不做好防护,将产生信息泄露、SSRF等漏洞。这也被叫作是XXE(XML External Entity injection)漏洞,即XML外部实体注入。
对于XXE漏洞的测试,可以使用DNS带外查询的方式来进行验证,例如某服务器能处理XML格式的请求数据,可将如下PoC发送给服务器进行漏洞验证:
<?xml version=" 1.0"?>
]> 借助XXE漏洞,攻击者能够实现对服务器的任意文件读取、拒绝服务攻击、代理扫描内网等。但是不同的XML解析器对外部实体的处理规则不同,例如在PHP中常用来处理XML数据的函数有simplexml_load_string和expat库中的xml_parse,xml_parse函数默认情况下不会解析DTD中的外部实体,但simplexml_load_string默认会解析外部实体导致XXE。除PHP以外,Java、Python平台中处理XML的函数都可能会产生XXE漏洞。 2 XXE漏洞利用 2.1任意文件读取 任意文件读取是XXE漏洞最常见的利用方式,本文在Linux平台下搭建了基于docker容器的测试环境来测试演示该漏洞的攻击过程[5]。 首先使用docker容器创建Apache+PHP架构服务器,随后在服务器web目录中创建包含有XXE漏洞的PHP文件simplexml_load_string.php,内容为: <?php $data = file_get_content s ( 'php://input ' ) $xml = simplexml_load_string($data); ?> 即在该文件中使用PHP的simplexml_load_string函数来接收处理XML数据。接下来使用请求构造工具Postman发送以下的XML请求: <?xml version=" 1.0" encoding=" utf-8"?>
请求响应结果如图2所示,可以看到这里使用file协议成功读取到了服务器文件/etc/passwd,造成了服务器文件信息泄露,利用该方法还有可能读取到服务器中存放的数据库密码、SVN服务器密码等其他敏感信息。
2.2服务端请求伪造
在某些情况下服务器端存在XXE漏洞,但只能使用http协议通过带外查询检测,此时该XXE漏洞被称为BlindXXE。由于无法使用file协议进行文件读取,Blind XXE无法带来更大的攻击面,但是如果能结合SSRF服务器端请求伪造,往往能发挥至关重要的作用。
例如某企業一台处于网络边界的Apache服务器存在Blind XXE漏洞,该服务器使用双网卡连接了企业内部网络10.4.10.0/24,企业内网有一台未授权即可访问的Redis服务器10.4.10.7,如果这台服务器未做好SSRF防护,那么此时就可以利用这枚Bind XXE漏洞直接发起对内网Redis服务器的攻击:
<?xml version=" 1.0"?>
<!ENTITY b SYSTEM“http://123.123.123.123/ gopher.php”> ]> 其中123.123.123.123为攻击者的服务器,gopher.php的内容为: <?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)?> 这时候攻击者将直接获得内网Redis服务器的权限进而对企业内网进行进一步渗透。可见此时Blind XXE通过与SSRF的结合极大地拓展了攻击面,为攻击者进一步的突破创造了条件。 2.3拒绝服务攻击 由于XXE漏洞是由服务器端接收并处理用户恶意数据造成,因此攻击者还可以通过构造复杂的逻辑来消耗服务器的运算资源,最终导致拒绝服务攻击。例如向一台存在XXE漏洞的服务器发送如下的XML数据: <?xml version="1.0"?> <101z>&1019;
2.4其他危害
事實上,XXE漏洞除了上述一些攻击利用方式之外,也可能会出现更多的攻击方式。XXE漏洞在不同语言和平台上可能支持的协议如图3所示。
而对于PHP应用程序来说,如果安装了更多PHP的扩展例如expect协议,那么XXE漏洞将直接可以被转化为命令执行漏洞。
3 XXE漏洞防御方法
对XXE漏洞的防御要做到两点。
(l)过滤用户提交的XML数据,禁止出现<!DOCTYPE、 <!ENTITY. SYSTEM和PUBLIC等关键字。
(2)在源代码层面禁止使用外部实体。
#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》
[参考文献]
[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]腾讯安全应急响应中心.未知攻焉知防-XXE漏洞攻防[EB/OL]( 2018-01-10) [2018-02-08] .https://security.tencent.com/index.p hp/blog/
msg/69.