- 类别:
bytecode别名:— 优先级:— - 作者:ReaJason
- 依赖:无第三方依赖或未在注解中声明
- 实现:
Gadget
生成面向 Apusic V9 的命令回显字节码。Gadget 本体只负责把 header 写入模板类,真正的行为在 ApusicEchoBytecode 的静态初始化中完成。
- 入口
tags:Bytecode、Echo、END - 衔接
nextTags:无 excludes:无
关键构造逻辑如下,摘自本条对应的 CFR 反编译源码:
public byte[] getObject() throws Exception {
JavassistHelper javassistHelper = new JavassistHelper(ApusicEchoBytecode.class);
javassistHelper.modifyStringField("header", this.header);
return javassistHelper.getBytecode();
}
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
chain.doCreate(context);
return this.getObject();
}getObject() 以 ApusicEchoBytecode 为模板创建 JavassistHelper,只改写一个静态字段 header,返回修改后的 class 字节码。invoke() 调用 chain.doCreate(context) 对齐链构建约定,然后把这段字节码交给上游字节码载体。
模板类加载后从当前线程的 threadLocals.table 里寻找类名包含 InvocationContext 的对象,再取 top.request / top.response。它用配置的请求头读取命令,通过 ProcessBuilder 按 Windows 或类 Unix 分支执行,并把标准输出写回响应 writer。
触发条件不是普通方法调用,而是模板类被定义并初始化;因此它通常作为 Bytecode 标签的链尾 sink,被 BytecodeConvert、TemplatesImpl、Spring XML 等载体继续包装。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
header |
请求头 key | 执行命令的 Header 头 | "X-Authorization" |
— |
- 依赖条件:无第三方依赖或未在注解中声明。
- 依赖 Apusic 请求上下文对象仍保存在当前线程
ThreadLocal中;如果目标线程模型或字段名变化,反射取InvocationContext/top/request/response会失败并被静默吞掉。 END标签说明它可以作为链尾构件;如果没有上游包装器触发其返回对象,单独构造不会自动执行。
关注内存中新定义类名、对 threadLocals.table / InvocationContext / getHeader / ProcessBuilder 的组合反射,以及异常响应中出现命令输出。
自由构件,未直接出现在预设链中。
- 机器可读元数据:
index/gadgets.json。 - 完整反编译源码:。