Skip to content

Latest commit

 

History

History
54 lines (45 loc) · 3.79 KB

File metadata and controls

54 lines (45 loc) · 3.79 KB

自定义字节码-本地文件(FileSteamFromUploadFile)

  • 类别:bytecode 别名:— 优先级:200
  • 作者:Ar3h
  • 依赖:无(内部使用 org.apache.shiro.lang.codec.Base64 工具类做解码)

作用

从用户上传/本地文件读入一段字节码(工具已将文件内容转为 base64 字符串存入字段),解码后作为链尾字节码 sink 的 byte[] 产物返回。用于「自定义字节码」场景:让攻击者把自己编译好的恶意类直接塞进链中,增强工具拓展性。

链接标签

  • 入口 tagsFileSteamConvertTagBytecodeEND —— 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 后门里 JDK java.util.Base64 不同,仅是实现选择。
  • 本身不做任何字段改写或类编译,产出的字节码完全由用户提供,因此可承载任意自定义恶意类(内存马、回显、自写命令执行类等)。

参数(@Param)

字段 名称 说明 默认 可选值
base64String local file 本地/上传文件,工具读取后以 base64 存入,运行时解码为原始字节码 文件(ParamType.File

适用版本与原理要点

  • 与具体依赖/版本无关:它只是「把一段外部字节码接入链」的通用适配器,价值在于扩展性——用户可离线编译任意类后直接投放。
  • 优先级 200(较高数值),在工具排序中偏后,属于高级/自定义用途而非默认推荐。
  • 作为 byte[] sink,需由上游转换器(BytecodeConvertTemplatesImpl 等)触发加载才会真正执行。

所属预设链

自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。典型用法:[BytecodeConvert, FileSteamFromUploadFile],其中文件内容为攻击者自备的类字节码。

关联