XXE漏洞(XML外部实体注入漏洞)

XXE漏洞(XML外部实体注入漏洞)

一、XML基础知识

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
(1)元素
(2)属性
(3)实体
(4)PCDATA
(5)CDATA
下面是每个构建模块的简要描述。
1,元素
元素是 XML以及HTML文档的主要构建模块,元素可包含文本、其他元素或者是空的。
实例:

body text in between some message in between 〈价格〉18.00〈/价格〉

2,属性
属性可提供有关元素的额外信息
实例:
〈价格 货币单位=“人民币”〉18.00〈/价格〉

3,实体
实体是用来定义普通文本的变量,实体是对数据的引用。

4,PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。

5,CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。

XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制的。

DTD 可以在 XML 文档内声明,也可以外部引用。

内部声明DTD

引用外部DTD

XXE漏洞(XML外部实体注入漏洞)_第1张图片XXE漏洞(XML外部实体注入漏洞)_第2张图片

这里定义了 note元素中,有四个子元素 to,from,heading,body
XXE漏洞(XML外部实体注入漏洞)_第3张图片

上面这个 DTD 就定义了 XML 的根元素是 note,然后跟元素下面有一些子元素。那么 XML 到时候必须像下面这么写。

XXE漏洞(XML外部实体注入漏洞)_第4张图片

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
一个内部实体声明

实例
DTD 实例:

XML 实例:
&writer;©right;
注释: 一个实体由三部分构成: 一个&, 一个实体名称, 以及一个分号 (。

一个外部实体声明

实例
DTD实例:

XML实例:
&writer;©right;
二、XXE漏洞原理

XXE漏洞就是服务器接受从客户端发送来的xml格式数据时,xml数据中恶意的引用了外部实体,将它的值绑定为服务器的目标文件,这样在服务器返回给我们解析后的值时,就会把目标文件的内容返回给我们,我们就读取了敏感文件。

有了xml实体,关键字’SYSTEM’ 会令XML解析器从URL中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容。

XXE漏洞(XML外部实体注入漏洞)_第5张图片

三、XXE漏洞实例

靶场实战
本地搭建好的靶场

XXE漏洞(XML外部实体注入漏洞)_第6张图片

打开XXE漏洞
XXE漏洞(XML外部实体注入漏洞)_第7张图片
XXE漏洞(XML外部实体注入漏洞)_第8张图片

现在可以构造一个简单的payload
XXE漏洞(XML外部实体注入漏洞)_第9张图片

看一下能不能正常输出
XXE漏洞(XML外部实体注入漏洞)_第10张图片

可以正常输出
接下来我们开始构造payload,目的明确,通过payload输出我们想要看到的文件的内容,于是这样构造:

XXE漏洞(XML外部实体注入漏洞)_第11张图片

]>
&f;

XXE漏洞(XML外部实体注入漏洞)_第12张图片

题目地址:http://web.jarvisoj.com:9882/

请设法获得目标机器/home/ctf/flag.txt中的flag值。

XXE漏洞(XML外部实体注入漏洞)_第13张图片

使用burp抓包看一下
XXE漏洞(XML外部实体注入漏洞)_第14张图片

发现点击go后,是以json的形式发送了数据,只是发送了几个特定的值

这题的提示是查看flag文件,那我们就利用XXE漏洞来获取flag目录得到我们需要的flag

另外我们在构建之前需要更改Content-Type:application/xml 使其以XML格式传递

然后传入xml代码(抓包后发送给Repeater):

]>

&xxe;

XXE漏洞(XML外部实体注入漏洞)_第15张图片

我们发现其中有ctf文件夹 那我们尝试打开其中的flag文件

]>

&xxe;

XXE漏洞(XML外部实体注入漏洞)_第16张图片

这个时候我们就可以得知flag的值

四、XXE漏洞的防御

使用开发语言提供的禁用外部实体的方法。

1.PHP:

libxml_disable_entity_loader(true);

2.JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

3.Python:

from lxml import etree

xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

你可能感兴趣的:(初级编码,XXE漏洞,信息安全,安全漏洞)