1.漏洞简述:
没有对传入的xml数据以及引用的dtd文档作安全的处理,使得xxe(xml外部实体注入)漏洞发生
2.漏洞原理:
2.1什么是xml
xml是一种自定义标记性语言(参考html),非常的自由(因为使用的标签完全由用户自定义)ps:xml中没有单标签
以下为使用的例子
<?xml version="1.0" encoding="UTF-8"?>
<form>
<name>姓名</name>
<id>9527</id>
<work>杀手</work>
<asdaa>dadadadw</asdaa>
</form>
然后我们就可以通过标签来取用数据,不过这篇文章只是对xml简单了解一下就可以了,以后再深入。
xml常用于储存数据,相当于一个小型的数据库,一般多用于存储配置,也可以在数据包中传输
2.2什么是dtd文档
1.我们知道xml文档由xml标记语言进行编写,可以自定义标签以及属性而dtd文档的存在则是去约束这个自定义的范围,让其趋近于某个规则,使其标准化格式化,方便数据传递与处理。
2.dtd文档可以写在xml文档的开头,这样的dtd文档被成为内部声明
当然也可以通过dtd的语法引用外部dtd文档的内容,这种dtd文档的嵌入方法称为外部声明
(ps:可以类比一下html文件的css)
2.2dtd文档的作用
dtd文档可以对元素进行定义,这个定义很强大,它可以定义元素的数据类型(根据不同的数据类型有不同的解读规则,这个日后细讲)定义包含的子元素,定义元素出现的次数。此外dtd文档还可以定义属性,定义属性的默认值,属性的数据类型。
dtd文档不只是用来约束xml文档,更是对自身格式的一种描述,通过比对文档格式可以判断数据是否符合规定,同时还可以通过dtd文档对自身的数据进行检验。
2.3什么是实体
实体就是代表,就是变量,是快捷引用一段内容,快捷引用一段文本的一种方式,比如<!ENTITY qq"<">,那么qq就是<的实体,在文章中出现了&qq;就会自动替换为<,并且使用这种方式表达<等特殊符号是有好处的,那就是不会产生歧义,使用这种方式表达的特殊符号只保留长相,失去其特殊含义,不会被计算机或程序识别。
还有就是刚刚举的那个例子是内部实体声明,接下来要讲的是外部实体声明。
外部实体声明的格式为<!ENTITY qq system"uri/url">会将url所代表的内容赋值给实体qq。
这会导致一定的安全隐患,如果此处的url可控的话,页面显示实体&qq;时会自动将内容替换。就可以用来读取系统文件,这就是xxe注入漏洞的由来
3.漏洞危害:
1.有回显的情况下,可以用来读取敏感文件
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///etc/passwd"> ]> <x>&f;</x>
2.没有回显的情况可以将读取的文件发送到攻击者的vps
3.少数情况可以执行命令,不过我不会
4.挖掘
执行操作时抓包数据,如果是以xml形式传递数据则进行进一步测试
如果可以引用外部实体声明,进行下一步
使用协议读取信息成功则存在该漏洞
4.漏洞利用
5.修复建议
禁用外部实体声明