XXE 攻击

0x00 什么是 XXE

XXE:XML External Entity,即外部实体攻击,其本质是利用应用过滤不严格进行xml语句的注入攻击,感觉应该属于注入攻击的一种,

0x01 XML 文档的DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构,包括定义了XML文档的元素(!ELEMENT),属性(!ATTLIST),实体(!ENTITY),其中实体的定义为:实体是用于定义引用普通文本或特殊字符的快捷方式的变量。类似于定义了一个变量

详细的DTD定义可以参考下面的链接:

http://www.runoob.com/dtd/dtd-building.html

x03 内部实体和外部实体


DTD 定义内部实体

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">

XML引用上面实体的内部定义:

<author>&writer;&copyright;</author>

DTD 定义外部实体,加了一个SYSTEM关键字

<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">

XML引用上面定义的外部实体

<author>&writer;&copyright;</author>

0x02 XXE 攻击PAYLOAD

<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > #定义了外部实体引用
]>
<foo>&xxe;</foo>

0x02 XXE攻击原理

在 XML1.0 标准里,XML文档里的实体的标识符可以访问本地远程内容,如果在外部实体引用的过程中,注入恶意代码,即可引发信息泄露等安全问题。

比如上述示例中所演示的 URI,即可读取 passwd 中的敏感信息。

0x03 攻击方式

  • 有回显

  • 无回显

具体就不继续了,网上一大堆文章,反正了解了核心概念就可以了,其他利用姿势自行Google

0x04 如何防御

可以将 libxml 版本升级到 2.9.0 以后,因为 libxml 2.9.0 以后默认是不解析外部实体的,还要做输入过滤,错误处理等,反正应对注入的措施都要有

Bonus

XML Schema 很快会将 DTD 取而代之,但 XML Schema 也会存在注入的问题,这个后面再慢慢看,还有Xpath注入等,关于xml的安全问题还是由很多的

Reference

http://mp.weixin.qq.com/s/vkCdz6YCoiiJPI30KePD6g

http://www.runoob.com/dtd/dtd-summary.html