网站首页  词典首页

请输入您要查询的论文:

 

标题 XXE漏洞攻击与防御研究
范文

    邱永哲

    

    

    

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

    

    

    ]>

    &b;:

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

    

    

    

    

    

    

    ]>

    

    &xxe;:

    

    请求响应结果如图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”>

    ]>

    &b;:

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

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/3/10 12:36:24