Skip to content

Latest commit

 

History

History
58 lines (47 loc) · 3.98 KB

File metadata and controls

58 lines (47 loc) · 3.98 KB

指定目录文件写入文件(StoreableCachingMap)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖org.aspectj:aspectjweaver:1.9.2(thirdLib:aspectjweaver-1.9.2

作用

利用 aspectjweaver 内部类 org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap 实现任意目录文件写入StoreableCachingMap 继承自 HashMap,其被填充/持久化时会把缓存条目以文件形式落盘到构造时指定的 folder 目录。攻击者借此把内层链传来的字节(如恶意 class / jsp / jar)写到目标机的任意路径,是经典的「AspectJWeaver 文件写入」原语(常与 HashMap/equals 触发链、二次落盘执行组合)。

链接标签

  • 入口 tags
    • StoreableCachingMap —— 自身入口标签,标识本文件写入原语,供上游按此 tag 衔接。
    • END —— 链尾标记:本 gadget 是终点 sink(直接产出可落盘的对象),其后不再接其他 gadget。
  • 衔接 nextTags:无(作为 END,不向下衔接)。
  • excludes:无。

源码剖析

@GadgetTags(tags={"StoreableCachingMap", "END"})
public class StoreableCachingMap implements Gadget {
    @Param(name="remoteFolder", description="远程目标写入的目录")
    public String remoteFolder = ".";

    public Object getObject() throws Exception {
        Class<?> clazz = Class.forName("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");
        return Reflections.newInstance(clazz, new Class[]{String.class, Integer.TYPE}, this.remoteFolder, 12);
    }

    @Override
    public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        return this.getObject();
    }
}

逻辑非常直接:

  1. getObject()Class.forName 取到私有内部类 SimpleCache$StoreableCachingMap
  2. 通过 Reflections.newInstance(clazz, {String.class, int.class}, remoteFolder, 12) 反射调用其双参构造器 StoreableCachingMap(String folder, int cacheSize),第一个参数 remoteFolder 即写入目标目录,第二个参数 12 为缓存大小;
  3. invoke 不依赖内层链(不调用 chain.doCreate),直接返回该 map 对象——它本身是 HashMap 子类,因此可作为其它 Java 反序列化触发链(如 HashMap.readObject → hash → key.hashCode,或 equals 触发)的末端载荷:当外层触发使其执行 put/缓存持久化时,StoreableCachingMap 会把条目按 folder 写盘,达成文件写入。

注意:本类只负责「构造出会写文件的 map」,真正的写盘触发依赖上游把它挂到某个会被反序列化调用的位置;写入内容/键值一般由上游或缓存机制决定。

参数(@Param)

字段 名称 说明 默认 可选值
remoteFolder remoteFolder 远程目标写入的目录(StoreableCachingMap 落盘的 folder) .(当前目录) 任意路径字符串

适用版本与原理要点

  • 依赖 org.aspectj:aspectjweaver:1.9.2(目标 classpath 需存在 aspectjweaver)。
  • 原理:SimpleCache$StoreableCachingMapHashMap 子类,缓存条目持久化时写入构造指定的 folder,构成任意目录文件写入原语。
  • 作为 END sink:自身不接下游,需由上游反序列化触发链驱动其写盘动作。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。可与 Java 原生反序列化的 HashMap/equals 型触发链自由组合,用于文件写入落地。

关联

  • 上游:能触发 HashMap/Map.put/equals 的 Java 原生反序列化跳板(如 HashMapEqualsHashTableEquals 等同类触发器)。
  • 同族:AspectJWeaver 相关 gadget(如 AspectJWeaverSpringAopAspectjweaver)——同样围绕 aspectjweaver 的文件缓存/加载能力。
  • 后续利用:写入的恶意 class/jsp/jar 再经其它机制加载执行(本条目仅完成「写入」一步)。