CC依赖-TransformedList触发Invoker利用链
字数 1296 2025-08-22 12:23:06

CC依赖-TransformedList触发Invoker利用链技术分析

1. 题目背景分析

题目提供了一个基于Blade框架的反序列化漏洞场景,主要特点包括:

  • 存在/challenge路由的反序列化入口
  • 使用N1ghtObjectInputStream类进行反序列化
  • 存在CC依赖但常见调用链被禁用
  • 需要绕过黑名单限制

2. 关键依赖分析

题目环境包含Apache Commons Collections (CC)依赖,但以下关键类被禁用:

  • ChainedTransformer被禁用
  • 常见CC利用链被拦截

3. 利用链构造原理

3.1 核心利用点

利用TransformedList触发InvokerTransformer调用链:

  1. LazyList.get()触发点

    • 当调用LazyList.get(0)时,由于值为null,会进入if分支
    • 调用this.factory.create()方法
    • 实际调用传入的ConstantFactory对象的create方法
  2. InvokerTransformer.transform()调用

    • 返回的对象被传入set方法
    • 最终传入InvokerTransformer.transform
    • 完成反射调用

3.2 绕过限制技术

由于ChainedTransformer被禁用,需要:

  1. 直接利用InvokerTransformer进行二次反序列化
  2. 构造能够触发TemplatesImpl字节码加载的payload

4. 利用方法详解

方法一:注册路由内存马

  1. 获取上下文

    com.hellokaton.blade.mvc.WebContext
    
  2. 注册路由关键类

    com.hellokaton.blade.server.RouteMethodHandler
    
  3. 注册路由步骤

    • 通过@Path注解标记
    • 添加到routeMatcherstaticMapping
  4. 完整Payload示例

    // 伪代码展示思路
    RouteMatcher routeMatcher = WebContext.get().routeMatcher();
    routeMatcher.addRoute(new Route("/evil", new Exp("cmd"), "GET"));
    

方法二:Netty内存马注入

  1. 利用Netty特性

    • 每次请求触发ServerBootstrap初始化
    • 修改ServerBootstrapAcceptorchildHandler
  2. 关键步骤

    • 反射修改childHandler
    • 实现handler持久化
  3. 示例代码

    // ServerBootstrapInterceptor.java
    // 转换为字节码后base64编码嵌入payload
    

方法三:RouteMatcher内存马

  1. 利用类

    com.hellokaton.blade.mvc.route.RouteMatcher
    
  2. 实现思路

    • 获取当前上下文
    • 添加并注册新路由
    • 注入恶意处理器

5. 完整利用流程

  1. 生成Payload

    • 构造能够触发TemplatesImpl加载的CC+RMIPayload
    • 写入文件后通过POST二进制内容发送
  2. 执行流程

    反序列化触发 → LazyList.get() → ConstantFactory.create() → 
    InvokerTransformer.transform() → 二次反序列化/内存马注入
    
  3. 不出网利用

    • 通过内存马实现持续控制
    • 注册新路由执行命令

6. 防御建议

  1. 输入验证

    • 严格校验反序列化输入
    • 使用白名单机制
  2. 依赖管理

    • 升级CC库版本
    • 移除不必要的序列化功能
  3. 运行时防护

    • 监控可疑的类加载行为
    • 限制反射调用权限

7. 总结

该利用链展示了如何通过CC的TransformedListInvokerTransformer在受限环境下实现二次反序列化和内存马注入,特别适用于:

  • 存在CC依赖但常见链被拦截的环境
  • Blade等非Spring框架的应用
  • 不出网场景下的持久化控制
CC依赖-TransformedList触发Invoker利用链技术分析 1. 题目背景分析 题目提供了一个基于Blade框架的反序列化漏洞场景,主要特点包括: 存在 /challenge 路由的反序列化入口 使用 N1ghtObjectInputStream 类进行反序列化 存在CC依赖但常见调用链被禁用 需要绕过黑名单限制 2. 关键依赖分析 题目环境包含Apache Commons Collections (CC)依赖,但以下关键类被禁用: ChainedTransformer 被禁用 常见CC利用链被拦截 3. 利用链构造原理 3.1 核心利用点 利用 TransformedList 触发 InvokerTransformer 调用链: LazyList.get()触发点 : 当调用 LazyList.get(0) 时,由于值为null,会进入if分支 调用 this.factory.create() 方法 实际调用传入的 ConstantFactory 对象的create方法 InvokerTransformer.transform()调用 : 返回的对象被传入set方法 最终传入 InvokerTransformer.transform 完成反射调用 3.2 绕过限制技术 由于 ChainedTransformer 被禁用,需要: 直接利用 InvokerTransformer 进行二次反序列化 构造能够触发TemplatesImpl字节码加载的payload 4. 利用方法详解 方法一:注册路由内存马 获取上下文 : 注册路由关键类 : 注册路由步骤 : 通过 @Path 注解标记 添加到 routeMatcher 和 staticMapping 完整Payload示例 : 方法二:Netty内存马注入 利用Netty特性 : 每次请求触发 ServerBootstrap 初始化 修改 ServerBootstrapAcceptor 的 childHandler 关键步骤 : 反射修改 childHandler 实现handler持久化 示例代码 : 方法三:RouteMatcher内存马 利用类 : 实现思路 : 获取当前上下文 添加并注册新路由 注入恶意处理器 5. 完整利用流程 生成Payload : 构造能够触发 TemplatesImpl 加载的CC+RMIPayload 写入文件后通过POST二进制内容发送 执行流程 : 不出网利用 : 通过内存马实现持续控制 注册新路由执行命令 6. 防御建议 输入验证 : 严格校验反序列化输入 使用白名单机制 依赖管理 : 升级CC库版本 移除不必要的序列化功能 运行时防护 : 监控可疑的类加载行为 限制反射调用权限 7. 总结 该利用链展示了如何通过CC的 TransformedList 和 InvokerTransformer 在受限环境下实现二次反序列化和内存马注入,特别适用于: 存在CC依赖但常见链被拦截的环境 Blade等非Spring框架的应用 不出网场景下的持久化控制