XXE归档-韶华当歌





XXE归档

发布时间:2020/06/18 作者:linmoumou 浏览(501) 评论(15) 分类【总结】 文章来源:博主原创

    0x00 什么是XML

    1. 定义

    XML(可扩展标记语言):一种标记语言,类似于HTML,设计用来传输和存储数据。

    XML是一种常用的标记语言,通过标签对数据进行结构化表示。XML与HTML都是SGML(Standard Generalized Markup Language,标准通用标记语言。)XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定 义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

    2. 文档结构

    XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    3. DTD

    DTD(文档类型定义):定义 XML 文档的合法构建模块。简单来说就是规定 XML 的内容、格式

    4. 实体类别介绍

    实体主要分为以下四类:

    1. 内置实体 (Built-in entities)
    2. 字符实体 (Character entities)
    3. 通用实体 (General entities)
    4. 参数实体 (Parameter entities)

    参数实体用%实体名称申明,引用时也用%实体名称;

    其余实体直接用实体名称申明,引用时用&实体名称。

    参数实体只能在DTD中申明,DTD中引用;

    其余实体只能在DTD中申明,可在xml文档中引用。

    注意:参数实体是在DTD中被引用的,而其余实体是在xml文档中被引用的

    0x01 DTD实体声明

    实体主要分为两种,内部实体外部实体

    1. 内部实体声明

    一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在GET还是在POST中都需要进行URL编码,因为是使用参数传入xml的,&符号会被认为是参数间的连接符号,示例:

    2. 外部实体声明

    XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议,比如如下的三种:

    外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

    linxml2phpjava.NET
    file
    http
    ftp
    file
    http
    ftp
    php
    compress.zlib
    compress.bzip2
    data
    glob
    phar
    http
    https
    ftp
    file
    jar
    netdoc
    mailto
    fopher *
    file
    http
    fttps
    ftp

    外部实体的默认协议

    示例:

     

    这种写法则调用了本地计算机的文件/etc/passwd,XML内容被解析后,文件内容便通过&xxe被存放在了methodname元素中,造成了敏感信息的泄露。

    3. 参数实体声明

    示例:

    外部evil.dtd中的内容。

    4. 引用公共实体

    0x02 普通的 XML 注入到XML 外部实体注入(XXE)

    XML注入

    XML与HTML一样,也存在注入攻击,甚至再注入的方法上也非常相似。

    XML注入需要满足注入攻击的两大条件:用户能控制数据的输入;程序拼凑了数据。

    CTF,web,XXE,CTF总结

    XML 外部实体注入(XXE)

    XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是什么?XML外部实体。

    有了XML实体,关键字SYSTEM会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。比如,下面的代码将获取file的内容并返回。

     

     

     

    以Code1代码为例,XML外部实体 passwd 被赋予的值为:file:///etc/passwd。在解析XML文档的过程中,实体passwd的值会被替换为URI(file:///etc/passwd)内容值(也就是passwd文件的内容)。关键字SYSTEM会告诉XML解析器,passwd实体的值将从其后的URI中读取。

    0x03 怎么甄别一个XML实体攻击漏洞?

    XXE漏洞主要针对web服务危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等。

    最直接的回答就是: 甄别那些接受XML作为输入内容的端点。 但是有时候,这些端点可能并不是那么明显(比如,一些仅使用JSON去访问服务的客户端)。在这种情况下,渗透测试人员就必须尝试不同的测试方式,比如修改HTTP的请求方法,修改Content-Type头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有XXE攻击漏洞。

    例如wsdl(web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。不过现实中存在的大多数XXE漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录,这里简单来说就是攻击者必须具有一台具有公网ip的主机。

    xxe漏洞检测

    第一步检测XML是否会被成功解析:

    如果页面输出了my name is nMask,说明xml文件可以被解析。

    第二步检测服务器是否支持DTD引用外部实体:

    可通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求index.html的请求。

    从PHP代码层面上

    最开始,引入一个file_get_contents函数,将整个XML数据读入data字符串中,然后交给php的xml解析函数simplexml_load_string()解析,解析后的数据赋给xml变量。

    这一数据即XML字符串中使用的对象(或者说根元素)的数据,并echo输出出来。

    0x04 XXE不同题型

    情况一:有网页回显

    方法:自己读取 当传入的 XML 代码为以下内容时:

    在有网页回显的地方,会将 c:/windows/system.ini 文件内容进行输出。 但是当改文件中出现一些特殊字符,如 <、 >、 / 、等,在解析时会报错,因为此时的&info; 变成了<、 >、 / 、 </hack>,解析出错 解决办法: 1.用 实体引用 代替特殊字符,例如将 < 替换成 < 。当然在进行 XXE 攻击的时候显然不可能,你的目标不可能这么贴心,自动帮你编码

    2.使用 CDATA 包裹

    evil.dtd 文件

    情况二:无回显

    方法:间接读取 由于 xml 可以发起网络请求,于是便可以将数据外带出去 远程 vps 上的 test.dtd

    传输的 xml payload

    至于为什么一定要借助远程vps上的dtd文件,大致原因是不能在实体定义中引用参数实体,即有些解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体。

     

    0x04 xxe漏洞的危害

    xxe漏洞的危害有很多,比如可以文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等,这里就读取任意文件的利用方式进行测试。

    危害1:读取任意文件

    有回显情况

    XML.php

     

    访问XML.php可以读取etc/passwd文件内容

    该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

    实例展示:

    可以使用如下的两种方式进行XXE注入攻击。

    外部evil.dtd中的内容。

    CTF,web,XXE,CTF总结

    当然也可以进行内网站点的入侵。

    CTF,web,XXE,CTF总结

    以上任意文件读取能够成功,除了DTD可有引用外部实体外,还取决于有输出信息,即有回显。那么如果程序没有回显的情况下,该怎么读取文件内容呢?需要使用blind xxe漏洞去利用。

    无回显的情况

    blind xxe漏洞方案1:

    对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。

    创建test.php写入以下内容:

    创建index.php写入以下内容:

    创建test.xml并写入以下内容:

    当访问http://localhost/index.php, 存在漏洞的服务器会读出text.txt内容,发送给攻击者服务器上的test.php,然后把读取的数据保存到本地的test.txt中。

    blind xxe漏洞方案2:

    可以将文件内容发送到远程服务器,然后读取。

    远程服务器的evil.dtd文件内容

    blind xxe漏洞方案3:

    可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。

    evil.dtd的内容,内部的%号要进行实体编码成&#x25。

    有报错直接查看报错信息。

    无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。

    CTF,web,XXE,CTF总结

    CTF,web,XXE,CTF总结

    这里列举几个案例:

    恶意引入外部实体1:

    XML内容

    恶意引入外部实体2:

    XML内容

    DTD文件(evil.dtd)内容:

    恶意引入外部实体3

    XML内容

    DTD文件内容

    恶意引入外部实体(4)

    危害2:命令执行

    php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装。

    该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

    危害3:内网探测/SSRF

    由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。

    危害4:攻击内网网站

    该CASE是攻击内网struts2网站,远程执行系统命令。

    危害5:拒绝服务攻击

    \2. To crash the server / Cause denial of service:

    上面样例代码2中的XXE漏洞攻击就是著名的’billion laughs’ 攻击。

    (https://en.wikipedia.org/wiki/Billion_laughs),该攻击通过创建一项递归的 XML 定义,在内存中生成十亿个”Ha!”字符串,从而导致 DDoS 攻击。

    原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。除了这些,攻击者还可以读取服务器上的敏感数据,还能通过端口扫描,获取后端系统的开放端口。

    0x05 XXE漏洞修复与防御

    xxe漏洞存在是因为XML解析器解析了用户发送的不可信数据。然而,要去校验DTD(document type definition)中SYSTEM标识符定义的数据,并不容易,也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此,最好的解决办法就是配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD。通过设置相应的属性值为false,XML外部实体攻击就能够被阻止。因此,可将外部实体、参数实体和内联DTD 都被设置为false,从而避免基于XXE漏洞的攻击。

    方案一:使用开发语言提供的禁用外部实体的方法

    PHP

    libxml_disable_entity_loader(true);

     

    JAVA

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

    dbf.setExpandEntityReferences(false);

     

    Python

    from lxml import etree

    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    方案二:过滤用户提交的XML数据

    过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。

    0x06 一道CTF题目

    题目链接:

    http://web.jarvisoj.com:9882/

    img

    目的很明确获取/home/ctf/flag.txt的内容

    下面分析源码

    很明显是AJAX异步传送数据

    在一般的异步网站都会有异步数据与服务器的交互,一般传送数据为json但如果将传送的数据格式改为xml。有很大的可能服务器会解析你异步上传的xml脚本执行想要干的事

    img

    解题步骤:

    要先修改Content-Type: application/xml

    然后加入xml脚本即可

    CTF,web,XXE,CTF总结

    得到返回结果

    CTF{XxE_15_n0T_S7range_Enough}

    0x07 参考链接

    https://www.cnblogs.com/zhaijiahui/p/9147595.html#autoid-2-4-0

    https://www.cnblogs.com/wjrblogs/p/12712209.html

    https://www.k0rz3n.com/2018/11/19/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%20XXE%20%E6%BC%8F%E6%B4%9E/

     

    https://security.tencent.com/index.php/blog/msg/69

    https://thief.one/2017/06/20/1/

    https://www.jianshu.com/p/7325b2ef8fc9

    https://blog.csdn.net/qq_31481187/article/details/53028221

    http://netsecurity.51cto.com/art/201702/531996.htm

    https://www.cnblogs.com/wfzWebSecuity/p/6681114.html

    https://www.jianshu.com/p/7325b2ef8fc9

     

     

     

     

关键字词:CTF,web,XXE,CTF总结

返回顶部小火箭


常用网站

我的主页

浙ICP备20007936号 · @版权所有 lin 联系我