XXE漏洞(XML外部实体注入漏洞)
一、XML基础知识
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
(1)元素
(2)属性
(3)实体
(4)PCDATA
(5)CDATA
下面是每个构建模块的简要描述。
1,元素
元素是 XML以及HTML文档的主要构建模块,元素可包含文本、其他元素或者是空的。
实例:
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
这里定义了 note元素中,有四个子元素 to,from,heading,body
上面这个 DTD 就定义了 XML 的根元素是 note,然后跟元素下面有一些子元素。那么 XML 到时候必须像下面这么写。
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
一个内部实体声明
实例
DTD 实例:
XML 实例:
&writer;©right;
注释: 一个实体由三部分构成: 一个&, 一个实体名称, 以及一个分号 (。
一个外部实体声明
实例
DTD实例:
XML实例:
&writer;©right;
二、XXE漏洞原理
XXE漏洞就是服务器接受从客户端发送来的xml格式数据时,xml数据中恶意的引用了外部实体,将它的值绑定为服务器的目标文件,这样在服务器返回给我们解析后的值时,就会把目标文件的内容返回给我们,我们就读取了敏感文件。
有了xml实体,关键字’SYSTEM’ 会令XML解析器从URL中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容。
三、XXE漏洞实例
靶场实战
本地搭建好的靶场
可以正常输出
接下来我们开始构造payload,目的明确,通过payload输出我们想要看到的文件的内容,于是这样构造:
]>
&f;
题目地址:http://web.jarvisoj.com:9882/
请设法获得目标机器/home/ctf/flag.txt中的flag值。
发现点击go后,是以json的形式发送了数据,只是发送了几个特定的值
这题的提示是查看flag文件,那我们就利用XXE漏洞来获取flag目录得到我们需要的flag
另外我们在构建之前需要更改Content-Type:application/xml 使其以XML格式传递
然后传入xml代码(抓包后发送给Repeater):
]>
&xxe;
我们发现其中有ctf文件夹 那我们尝试打开其中的flag文件
]>
&xxe;
这个时候我们就可以得知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))