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调用链:
-
LazyList.get()触发点:
- 当调用
LazyList.get(0)时,由于值为null,会进入if分支 - 调用
this.factory.create()方法 - 实际调用传入的
ConstantFactory对象的create方法
- 当调用
-
InvokerTransformer.transform()调用:
- 返回的对象被传入set方法
- 最终传入
InvokerTransformer.transform - 完成反射调用
3.2 绕过限制技术
由于ChainedTransformer被禁用,需要:
- 直接利用
InvokerTransformer进行二次反序列化 - 构造能够触发TemplatesImpl字节码加载的payload
4. 利用方法详解
方法一:注册路由内存马
-
获取上下文:
com.hellokaton.blade.mvc.WebContext -
注册路由关键类:
com.hellokaton.blade.server.RouteMethodHandler -
注册路由步骤:
- 通过
@Path注解标记 - 添加到
routeMatcher和staticMapping
- 通过
-
完整Payload示例:
// 伪代码展示思路 RouteMatcher routeMatcher = WebContext.get().routeMatcher(); routeMatcher.addRoute(new Route("/evil", new Exp("cmd"), "GET"));
方法二:Netty内存马注入
-
利用Netty特性:
- 每次请求触发
ServerBootstrap初始化 - 修改
ServerBootstrapAcceptor的childHandler
- 每次请求触发
-
关键步骤:
- 反射修改
childHandler - 实现handler持久化
- 反射修改
-
示例代码:
// ServerBootstrapInterceptor.java // 转换为字节码后base64编码嵌入payload
方法三:RouteMatcher内存马
-
利用类:
com.hellokaton.blade.mvc.route.RouteMatcher -
实现思路:
- 获取当前上下文
- 添加并注册新路由
- 注入恶意处理器
5. 完整利用流程
-
生成Payload:
- 构造能够触发
TemplatesImpl加载的CC+RMIPayload - 写入文件后通过POST二进制内容发送
- 构造能够触发
-
执行流程:
反序列化触发 → LazyList.get() → ConstantFactory.create() → InvokerTransformer.transform() → 二次反序列化/内存马注入 -
不出网利用:
- 通过内存马实现持续控制
- 注册新路由执行命令
6. 防御建议
-
输入验证:
- 严格校验反序列化输入
- 使用白名单机制
-
依赖管理:
- 升级CC库版本
- 移除不必要的序列化功能
-
运行时防护:
- 监控可疑的类加载行为
- 限制反射调用权限
7. 总结
该利用链展示了如何通过CC的TransformedList和InvokerTransformer在受限环境下实现二次反序列化和内存马注入,特别适用于:
- 存在CC依赖但常见链被拦截的环境
- Blade等非Spring框架的应用
- 不出网场景下的持久化控制