Aj链任意写文件后续带来的RCE深入分析
字数 1704 2025-08-29 08:30:12

AJ链任意写文件导致的RCE深入分析与利用

1. 漏洞背景与概述

本漏洞分析基于CISCN国赛半决赛华南赛区的ezjava题目环境,涉及AJ链(AspectJ相关链)通过任意文件写入实现RCE(远程代码执行)的技术细节。该环境为不出网环境,增加了利用难度。

2. 漏洞链分析

2.1 漏洞触发点

  • 题目中存在一个继承了序列化接口的jdbcBean
  • 数据库连接部分继承了DatasourceServiceImpl接口,调用了testDatasourceConnectionAble方法
  • 通过分析pom.xml依赖发现存在AJ(AspectJ)依赖

2.2 利用链构建

  1. JDBC触发readObject:利用JDBC连接触发readObject方法进入序列化流程
  2. 反射调用UserBean的readObject:通过反射调用UserBean中的readObject方法
  3. 触发a.put:完成AJ链后半段的触发

3. 出网环境下的利用方式

3.1 写入SO文件加载

3.2 写入恶意类加载

  1. 编写恶意类Evil.java并编译为.class文件
  2. 使用getBytes方法或命令行工具生成字节码
  3. 将生成的字节码放入AJ链的payload中
  4. 恶意类将被写入jre/classes目录下
  5. 直接调用类名即可触发执行

优点:相比写SO文件更简单,不需要调用太多工具

前提:需要知道jre/classes路径位置

4. 不出网环境下的利用方式

4.1 利用charsets.jar包

  1. Windows环境问题:Windows会自动加载charsets.jar,导致无法完成覆盖
  2. 解决方案
    • 解压charsets.jar(使用7z等工具)
    • 用IDEA打开项目
    • 保留必要的ExtendedCharsets类,删除其他类
    • 覆盖sun.nio.cs.ext.IBM33722等类
    • 重新打包为jar文件
  3. 部署方式
    • Windows:直接覆盖jre/lib/目录下的charsets.jar
    • Linux:同样覆盖charsets.jar

注意事项

  • Linux环境下需要使用目标环境的charsets.jar进行修改
  • 必须保留ExtendedCharsets.class
  • 修改后的jar包体积需要足够小以便写入

4.2 利用BCEL(JDK8u251以下版本)

适用条件

  • Java版本低于JDK8u251
  • 存在jre/classes目录

利用步骤

  1. 编写恶意类EvilEcho.java
  2. 编译后,将base64编码写入exp的payload
  3. 设置文件位置为%JAVA_HOME%jre/classes/
  4. 生成后利用反射调用
  5. 执行命令并获取回显

简单利用:直接通过jdbc文件读取方式读取flag

5. 技术细节与注意事项

5.1 文件写入限制

  • 在不出网环境下,写入文件大小受限
  • 需要精简恶意类或jar包体积
  • 保持最小功能集(如只保留必要的ExtendedCharsets类)

5.2 环境差异

  • Windows与Linux在charsets.jar加载行为上有差异
  • Windows会自动加载charsets.jar,可能导致覆盖失败
  • Linux需要精确匹配目标环境的jar版本

5.3 回显技术

  • 在不出网环境下,可通过BCEL实现命令执行回显
  • 也可通过文件读取方式直接获取flag等敏感信息

6. 防御建议

  1. 升级JDK到最新版本(特别是超过8u251)
  2. 限制序列化操作,特别是来自不可信源的序列化数据
  3. 实施严格的文件写入权限控制
  4. 对关键jar包进行签名验证,防止被篡改
  5. 在安全策略中限制JNI加载和自定义类加载器

7. 总结

AJ链通过任意文件写入实现RCE是一种强大的攻击技术,特别是在不出网环境下,攻击者需要创造性地利用系统已有资源(如charsets.jar)或低版本JDK特性(如BCEL)来实现攻击目的。防御方需要从多个层面进行防护,包括但不限于升级JDK、限制序列化、控制文件写入权限等。

AJ链任意写文件导致的RCE深入分析与利用 1. 漏洞背景与概述 本漏洞分析基于CISCN国赛半决赛华南赛区的ezjava题目环境,涉及AJ链(AspectJ相关链)通过任意文件写入实现RCE(远程代码执行)的技术细节。该环境为不出网环境,增加了利用难度。 2. 漏洞链分析 2.1 漏洞触发点 题目中存在一个继承了序列化接口的jdbcBean 数据库连接部分继承了DatasourceServiceImpl接口,调用了testDatasourceConnectionAble方法 通过分析pom.xml依赖发现存在AJ(AspectJ)依赖 2.2 利用链构建 JDBC触发readObject :利用JDBC连接触发readObject方法进入序列化流程 反射调用UserBean的readObject :通过反射调用UserBean中的readObject方法 触发a.put :完成AJ链后半段的触发 3. 出网环境下的利用方式 3.1 写入SO文件加载 写入恶意SO文件并通过JNI加载执行 相关参考文章: 阿里云先知社区文章 CSDN博客文章 kinsomnia博客 3.2 写入恶意类加载 编写恶意类Evil.java并编译为.class文件 使用getBytes方法或命令行工具生成字节码 将生成的字节码放入AJ链的payload中 恶意类将被写入jre/classes目录下 直接调用类名即可触发执行 优点 :相比写SO文件更简单,不需要调用太多工具 前提 :需要知道jre/classes路径位置 4. 不出网环境下的利用方式 4.1 利用charsets.jar包 Windows环境问题 :Windows会自动加载charsets.jar,导致无法完成覆盖 解决方案 : 解压charsets.jar(使用7z等工具) 用IDEA打开项目 保留必要的ExtendedCharsets类,删除其他类 覆盖sun.nio.cs.ext.IBM33722等类 重新打包为jar文件 部署方式 : Windows:直接覆盖jre/lib/目录下的charsets.jar Linux:同样覆盖charsets.jar 注意事项 : Linux环境下需要使用目标环境的charsets.jar进行修改 必须保留ExtendedCharsets.class 修改后的jar包体积需要足够小以便写入 4.2 利用BCEL(JDK8u251以下版本) 适用条件 : Java版本低于JDK8u251 存在jre/classes目录 利用步骤 : 编写恶意类EvilEcho.java 编译后,将base64编码写入exp的payload 设置文件位置为%JAVA_ HOME%jre/classes/ 生成后利用反射调用 执行命令并获取回显 简单利用 :直接通过jdbc文件读取方式读取flag 5. 技术细节与注意事项 5.1 文件写入限制 在不出网环境下,写入文件大小受限 需要精简恶意类或jar包体积 保持最小功能集(如只保留必要的ExtendedCharsets类) 5.2 环境差异 Windows与Linux在charsets.jar加载行为上有差异 Windows会自动加载charsets.jar,可能导致覆盖失败 Linux需要精确匹配目标环境的jar版本 5.3 回显技术 在不出网环境下,可通过BCEL实现命令执行回显 也可通过文件读取方式直接获取flag等敏感信息 6. 防御建议 升级JDK到最新版本(特别是超过8u251) 限制序列化操作,特别是来自不可信源的序列化数据 实施严格的文件写入权限控制 对关键jar包进行签名验证,防止被篡改 在安全策略中限制JNI加载和自定义类加载器 7. 总结 AJ链通过任意文件写入实现RCE是一种强大的攻击技术,特别是在不出网环境下,攻击者需要创造性地利用系统已有资源(如charsets.jar)或低版本JDK特性(如BCEL)来实现攻击目的。防御方需要从多个层面进行防护,包括但不限于升级JDK、限制序列化、控制文件写入权限等。