1.XXE漏洞
XXE漏洞就是XML外部实体注入,就是当xml引用外部实体并解析的时候会产生的漏洞,xml解析器去获取其中的外部资源并存储到内部实体中,攻击者可引用外部实体对目标进行文件读取、命令执行、DDOS、内网探测等。
2.什么是xml
1.XML 指可扩展标记语言(EXtensible Markup Language)是被设计用来传输和存储数据,而HTML则是被设计用来显示数据。
一个简单的xml文件包括声明、文档定义类型(DTD)、和元素。
声明
DTD定义类型
]>
根元素
&name; 子元素
Jani
Don't forget me this weekend!
3.什么是DTD
DTD(Document Type Definition,文档类型定义)
1)DTD是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。
2)XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,
各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
4)DTD中的所有约束都是针对 与某个标签的子标签进行约束的
(XML之DTD)[https://www.cnblogs.com/zhangyinhua/p/7586853.html#_label0]
3.1DTD内部文档类型声明
引入内部的dtd
]>
<班级>
<学生>
<姓名>张三姓名>
<身高>180身高>
<年龄>20年龄>
学生>
班级>
1.ELEMENT 声明元素
2.PCDATA的意思是被解析的字符数据
3.就是通过DTD来定义xml的文档类型,必须要有一个或者多个班级标签,班级标签又要有姓名、年龄、身高等子标签,然后就是姓名和年龄标签里只可以又 PCDATA的元素,身高的标签可以是任何元素。
3.2DTD外部部文档类型声明
引入外部的DTD
<班级>
<学生>
<姓名>张三姓名>
<身高>180身高>
<年龄>20年龄>
学生>
班级>
//1.dtd
3.3DTD实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量,相当于变量,但它和变量不同的是不仅能用来存储指定的数值,它还能从本地文件或者远程网络调用相关数据。
3.4DTD内部实体的声明方式是
使用&+实体名称+;在xml里调用对应的实体如下
&shiti1;&shiti2;
这样避免了对标签的反复赋值和在xml文档对该值多处调用过程时会相对的节省时间提高效率。
3.5实体有通用型实体,参数实体和预定义实体。
1)上面的就是通用型实体或者叫一般实体。
2)参数实体的定义必须在单独的DTD区域。它可以使用一个ENTITY给另一个ENTITY赋值
比如">
。
3)预定义实体就是当你定义的实体有小于号或者单引号双引号的时候xml解析器会报错因为它分别不出来这是运算符还是符号。
3.6外部实体的调用
SYSTEM 是让xml解析器知道这是一个外部实体,需要xml解析器去获取其中的外部资源并存储到内部实体中。(xxe漏洞的成因)
4.xxe-lab靶场
先来看看php的xxe靶场
一个登入界面
开启抓包登入一下,可以看到这很明显的xml格式
构造payload读取C盘下的4399.txt
首先声明xml,任何定义规则DTD内容为引用一个名为name的外部实体去获取 ,然后在下面的元素里调用该实体&name;。这样c:/4399.txt文件内容就会被获取并
且存储在我们的内部实体中,然后调用它就可以得到里面的内容。
]>
admin&name; admin123
5.防御方法:
1.打开php的libxml_disable_entity_loader(ture),不允许加载外部实体。
2.过滤用户提交的xml数据,比如ENTITY,SYSTEM。
6.总结:
xxe漏洞主要运用xml外部实体可以解析外部文件的特性 才使得攻击成为可能。
xml虽然使得一些web开发方面方便快捷了许多,也提高了效率,但这样的优化往往伴随的一些安全问题,就好比更好的用户体验会牺牲掉一定的安全性。