- 类别: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();
}
}逻辑非常直接:
getObject()用Class.forName取到私有内部类SimpleCache$StoreableCachingMap;- 通过
Reflections.newInstance(clazz, {String.class, int.class}, remoteFolder, 12)反射调用其双参构造器StoreableCachingMap(String folder, int cacheSize),第一个参数remoteFolder即写入目标目录,第二个参数12为缓存大小; invoke不依赖内层链(不调用chain.doCreate),直接返回该 map 对象——它本身是HashMap子类,因此可作为其它 Java 反序列化触发链(如HashMap.readObject → hash → key.hashCode,或equals触发)的末端载荷:当外层触发使其执行put/缓存持久化时,StoreableCachingMap会把条目按folder写盘,达成文件写入。
注意:本类只负责「构造出会写文件的 map」,真正的写盘触发依赖上游把它挂到某个会被反序列化调用的位置;写入内容/键值一般由上游或缓存机制决定。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
remoteFolder |
remoteFolder | 远程目标写入的目录(StoreableCachingMap 落盘的 folder) |
.(当前目录) |
任意路径字符串 |
- 依赖
org.aspectj:aspectjweaver:1.9.2(目标 classpath 需存在 aspectjweaver)。 - 原理:
SimpleCache$StoreableCachingMap是HashMap子类,缓存条目持久化时写入构造指定的folder,构成任意目录文件写入原语。 - 作为
ENDsink:自身不接下游,需由上游反序列化触发链驱动其写盘动作。
自由构件,未直接出现在预设链(usedInChains 为空)。可与 Java 原生反序列化的 HashMap/equals 型触发链自由组合,用于文件写入落地。
- 上游:能触发
HashMap/Map.put/equals的 Java 原生反序列化跳板(如HashMapEquals、HashTableEquals等同类触发器)。 - 同族:AspectJWeaver 相关 gadget(如
AspectJWeaver、SpringAopAspectjweaver)——同样围绕 aspectjweaver 的文件缓存/加载能力。 - 后续利用:写入的恶意 class/jsp/jar 再经其它机制加载执行(本条目仅完成「写入」一步)。