目录
1.xml 简单了解
1.1 xml声明
1.2文档类型定义
1.3文档元素
1.4代码详解
2.DTD两种使用方式
2.1内部声明
2.2外部声明
3.DTD实体
3.1内部实体声明引用
3.2外部实体声明引用
3.3参数实体声明引用
4.XXE漏洞原理
5.XXE漏洞利用
5.1读取本地文件
5.2读取系统文件
5.3内网IP探测
5.4内网端口探测
5.5无回显读取文件
6.如何检测XXE漏洞
6.1人工
6.2工具
7.如何防御XXE
7.1使用开发语言提供的禁用外部实体的方法
7.2过滤用户提交的XML数据
写这篇文章目的就是想认真理理XEE这个漏洞,因为在学习过程中,听过老师的一些课,看过很多文章解释,我觉得讲的都是很官方话或者专业用语,对于初学者理解很难,可能我理解能力不够哈。以下内容仅仅是我个人理解,以及我个人的比喻,比喻可以让你更好理解这个东西,这是我学习的一个方法,可是使的抽象的东西变得比较具体一些。
XXE这个漏洞的理解,首先我们了解xml文档,因为该漏洞就是由xml文档引起的
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
这个是大家搜索xml时候出现的专业解释,那我简单粗暴理解就是来传输数据的,不过有自己的格式,就跟文章一样,有标题,有正文,有前言,有目录等等。文章是汉字,xml是代码而已。那么xml的格式是什么样子呢,它比写文章简单,只有三个部分,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。接下来我们介绍这个三个部分干什么的。
就是一个说明,简单介绍自己的,版本信息咯,还有编码信息,一般简单,就像文章标题,反正都得有,就和我一样出门必须的化妆,不然不能见人,哈哈哈,开个玩笑。
这个就是我们的重点,也是漏洞产生的地方,它有一个简称叫DTD,功能已经说明了文档类型定义,它会定义文档会出现那些子元素、父元素、子元素数据类型、实体等等。!DOCTYPE note 这个note就是父元素,在下面的文档元素里面出现了
当你有个DTD的时候文档元素呈现就会很规范,那么在子元素中间的,比如John可以认为是xml文档的正文了。
]>
Tove
Jani
Reminder
Don't forget me this weekend
]>
George
John
Reminder
Don't forget the meeting!
George
John
Reminder
Don't forget the meeting!
note.dtd文件内容是
看到实体这两个词了,和我们漏洞有点关系了,很多人不知道实体具体代表的是啥,专业解释就是DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,也可以内部实体声明或外部实体引用,具体先看一个代码。
]>
&writer;&right;
实体总结就是产生一个变量 ,定义一个而变量,上述代码中 writer ,right称为实体名,大家可以理解就是一个变量名。“Bill Gates”,"School"这个就是实体内容,也就是变量值。那么这个过程说白了,就是在DTD里面产生了一个变量。将该变量名放入到元素标签中间,就相当于使用该变量了。这种称之为引用实体,和变量使用还是有一点区别,格式:&+实体名+;。具体可以看上面代码,上面代码是内部实体声明
]>
&writer;&right;
外部实体引用就是DTD里面的变量值不是直接在DTD里面给与了,而是需要更加url寻找,寻找之后才能获取变量值。外部实体引用关键词就是SYSTEM.会在system后面放入变量值的url。这里URL还可以使用其他协议,各个脚本支持协议如下。外部实体引用我称之为将外面的变量值引进来。这个过程如果处理不好就会引进坏人的。
参数实体的实体名前面是有一个%号的,那么引用参数实体的时候需要在dtd里面 其他实体引用在xml文档内。下面的write和right就是一个参数实体,她们的引用格式%+实体名+;。而且在DTD里面进行引用,如果你想在外面引用得有一个过渡。bb就是。
%write;
%right;
]>
&bb;
---------------------------------
en.dat里面内容是
现在我们再来说说XXE漏洞原理就好理解了,某些应用程序允许XML格式的数据输入和解析,因为支持了外部实体的引用,在引用过程中没有做好防范措施,引进了恶意代码,并成功执行,被攻击者进一步利用,那么就产生了危害。
读取到网站目录下aa.txt文件内容
]>
&xxe;
读取window系统文件
]>
&goodies;
读取linux系统文件
]>
&f;
使用pikachu靶场,如果你是才开始学习渗透的可以在本地搭建一下这个靶场,还有DVWA可以帮助自己对于漏洞的理,也可以在虚拟机里面使用docker镜像搭建靶场,
靶场搭建参考链接:web渗透靶场(pikachu,DVWA)本地搭建环境配置_dreamthe的博客-CSDN博客
这里我是开了一台虚拟机,开启了http服务。对其进行内网IP和端口探测 ,得到的数据进行base64编码,记得进行解码。可以利用bp软件进行重放,可以对于ip和端口进行遍历
]>
&goodies;
]>
&goodies;
将端口变成15就会得到如下内容,因为没有开放15端口。
如果页面没有任何显示的情况下,按照上面的思路读取文件是不行的,那么我们就反向链接,第一步将aa.txt文件内容存入file实体里面,第二步访问外部1.dtd,第三步将file里面内容发送给攻击者。
%dtd;
%send;
]>
其中1.dtd的内容如下
"
>
%all;
看数据包里的content-type值,比如text/xml ,application/xml.
修改content-type的值 看返回
看传输的数据是否是下面格式
这里就不多讲,工具可以自己搜搜。
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
关键词:
下一篇:文件上传漏洞攻击与防御总结_dreamthe的博客-CSDN博客