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 利用链构建
- JDBC触发readObject:利用JDBC连接触发readObject方法进入序列化流程
- 反射调用UserBean的readObject:通过反射调用UserBean中的readObject方法
- 触发a.put:完成AJ链后半段的触发
3. 出网环境下的利用方式
3.1 写入SO文件加载
- 写入恶意SO文件并通过JNI加载执行
- 相关参考文章:
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、限制序列化、控制文件写入权限等。