zoukankan      html  css  js  c++  java
  • XXE漏洞原理、演示与防御

    目录:

    • 前言
    • 漏洞原理
    • Demo演示
    • 如何发现XXE漏洞
    • XXE其他危害
    • 案例-微信支付的XXE
    • 修复建议

    前言

    什么是XXE漏洞? 

    XXE全称是——XML External Entity

    简单来说,XXE就是XML外部实体注入。当应用程序允许引用外部实体时,通过构造恶意内容,就可以导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

    什么是XML,如需详细了解,可参考XML菜鸟教程

    一、漏洞原理

    1、DTD

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

    什么是DTD,如需详细了解,可参考DTD菜鸟教程

    1.1、内部的 DOCTYPE 声明:

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

     

    1.2、外部的 DOCTYPE 声明:

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

     

    这是包含 DTD 的 "note.dtd" 文件

     

     1.3、DTD实体

     实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

    • 实体引用是对实体的引用。

    • 实体可在内部或外部进行声明。

    DTD内部实体声明:

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

     

    DTD外部实体声明:

    <!ENTITY 实体名称 SYSTEM "URI/URL">

     

    2、XML外部实体

    XML,可拓展的标记语言,(eXtensible Markup Language),用于传输和存储数据。

    XML文档实例:

     

    XML“外部实体”实例:

     

    可以在DOCTYPE头部标签中通过SYSTEM关键字定义“实体”,这些“实体”可以访问本地或远程的内容。SYSTEM告诉XML解释器,从URI中读取实体的内容。攻击者可以通过实体将自定义的值发送给应用程序,然后让应用程序去呈现,比如上面就是把实体定义为passwd文件,让XML解释器去读取文件。

    二、Demo 演示

    2.1、新建一个外部实体的XML文档,读取本地的某个文件。

    <?xml version="1.0"?>
    <!DOCTYPE note [
            <!ENTITY myentity  SYSTEM  "file:///C:/XXE.txt">
            ]>
    <note>
        <to>Tove</to>
        <from>&myentity;</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend</body>
    </note>

    2.2、创建DOM解释器解析上面的XML文件

    package Eleven;
    
    
    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import java.io.*;
    
    public class Test  {
        public static void main(String[] args) throws Exception{
            /**
             *创建DOM解释器解析XML文件
             */
            // 把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它
            InputStream is = new FileInputStream("D:\2-code\Eleven\src\main\resources\templates\note2.xml");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //创建DOM模式的解析器工厂
            DocumentBuilder builder = factory.newDocumentBuilder();  //调用工厂的方法得到DOM解析器对象
            Document doc = builder.parse(is);//调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象
            NodeList nodeList = doc.getElementsByTagName("from");//根据元素名称获取元素值
            System.out.println(nodeList.item(0).getTextContent());
        }
    
    }

    2.3、执行后的结果

     三、如何发现XXE漏洞

    3.1、寻找XML输入点

    比如Content-Type:text/xml, post的数据包含XML格式,如:

    <forgot><username>admin</username></forgot>

    请求头中添加Content-Type:text/xml,或Content-type:application/xml

    同时,POST中添加payload

     

    3.2 通过关键字,在代码中查找XML解释器,确认解释器是否针对此漏洞做了安全限制(禁用外部实体、过滤关键字等)

    关键字:DocumentBuilderFactory等

    四、XXE其他危害

    4.1、任意文件读取(如上)

     

    通过提交自动以URI,可以读取任意文件(本地或远程)。

    还可以通过DTD文档引入外部DTD文档,再引入外部实体声明,如下:

     

    以上输入有回显的情况,/etc/passwd可以直接被显示出来,无回显的情况,需要把文件外发至远程服务器,具体如下:

     

    4.2、拒绝服务攻击

    原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

     

    4.3、测试后端服务器的开放端口

     

    通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

    4.4、后端WEB漏洞如果可以通过URL加以利用,可造成WEB漏洞攻击

     

    4.5、命令执行

     

    PHP要开启PECL上的Expect扩展。

    五、案例-微信支付的XXE

    漏洞描述:

    微信支付提供了一个 api 接口,供商家接收异步支付结果,微信支付所用的java sdk在处理结果时可能触发一个XXE漏洞,攻击者可以向这个接口发送构造恶意payloads,获取商家服务器上的任何信息,一旦攻击者获得了敏感的数据 (md5-key and merchant-Id etc.),他可能通过发送伪造的信息不用花钱就购买商家任意物品

    如图所示:

     

    上述类中实现了xmltoMap和maptoXml这两个方法,而这次的微信支付的xxe漏洞爆发点就在xmltoMap方法中,当构建了 documentBuilder 以后就直接对传进来的 strXML 解析了,而不巧的是 strXML 是一处攻击者可控的参数,于是就出现了 XXE 漏洞。

    六、修复建议

    1、配置XML处理器使用禁用DTD、禁止外部实体解析

    factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); 
    factory.setFeature("http://xml.org/sax/features/external-general-entities", false);  
    factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

    2、通过黑名单过滤用户提交的XML数据

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

  • 相关阅读:
    c# 反射应用之工厂
    UnityContainer 实现DI
    TinyMCE 的音乐插件/mp3 music insert plugin
    Django on IronPython and Windows
    说说分页
    Katze 简单的.net "ORM"框架
    Discuz!NT在64位Windows下运行的问题
    恐怖的迅雷
    基于Gettext的asp.net网站多语言解决方案
    微软是如何输掉API之战(下)
  • 原文地址:https://www.cnblogs.com/Eleven-Liu/p/8612821.html
Copyright © 2011-2022 走看看