- 类别:bytecode 别名:— 优先级:200
- 作者:Ar3h
- 依赖:无(内部使用
org.apache.shiro.lang.codec.Base64工具类做解码)
从用户上传/本地文件读入一段字节码(工具已将文件内容转为 base64 字符串存入字段),解码后作为链尾字节码 sink 的 byte[] 产物返回。用于「自定义字节码」场景:让攻击者把自己编译好的恶意类直接塞进链中,增强工具拓展性。
- 入口
tags:FileSteamConvertTag、Bytecode、END——Bytecode承接上游字节码转换器;FileSteamConvertTag标识「文件流转换」这一来源类别;END表示终端 sink。 - 衔接
nextTags:空 —— 终点,不再包裹内层对象。 excludes:无。
逻辑极简,核心是把配置好的 base64 字符串解码回原始字节码:
@GadgetTags(tags={"FileSteamConvertTag", "Bytecode", "END"})
public class FileSteamFromUploadFile implements Gadget {
@Param(name="local file", type=ParamType.File)
public String base64String; // ParamType.File:界面为文件选择,内容以 base64 存入
public byte[] getObject(GadgetContext context) throws Exception {
return Base64.decode(this.base64String); // shiro 的 Base64 → 还原为原始 class 字节
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
chain.doCreate(context); // END gadget:内层为空
return this.getObject(context);
}
}关键点:
@Param(type=ParamType.File):这是与 BytecodeFromUploadFile 相似的「文件入口」参数。工具在读取用户选择的文件后,把文件字节内容转成 base64 文本填入base64String字段;本 gadget 运行时再用Base64.decode还原为byte[]。- 使用的是 Shiro 的
org.apache.shiro.lang.codec.Base64(工具自带依赖),与前面 Fastjson 后门里 JDKjava.util.Base64不同,仅是实现选择。 - 本身不做任何字段改写或类编译,产出的字节码完全由用户提供,因此可承载任意自定义恶意类(内存马、回显、自写命令执行类等)。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
base64String |
local file | 本地/上传文件,工具读取后以 base64 存入,运行时解码为原始字节码 | 无 | 文件(ParamType.File) |
- 与具体依赖/版本无关:它只是「把一段外部字节码接入链」的通用适配器,价值在于扩展性——用户可离线编译任意类后直接投放。
- 优先级 200(较高数值),在工具排序中偏后,属于高级/自定义用途而非默认推荐。
- 作为
byte[]sink,需由上游转换器(BytecodeConvert→TemplatesImpl等)触发加载才会真正执行。
自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。典型用法:[BytecodeConvert, FileSteamFromUploadFile],其中文件内容为攻击者自备的类字节码。
- 上游(承接
Bytecode):BytecodeConvert。 - 同族字节码来源:BytecodeFromBase64、BytecodeFromHex、BytecodeFromLocalFile、BytecodeFromUploadFile —— 均为向链中注入自定义字节码的不同入口方式;本 gadget 侧重「文件流」来源。
- 对照:内置逻辑的 sink 如 Exec、FastJsonbBackDoor 由工具生成固定载荷,本 gadget 则由用户完全自定义。