2025软件系统安全赛初赛Java
字数 2239 2025-09-23 19:27:38

Java 反序列化漏洞利用与绕过技术专题解析

1. 反序列化链挖掘分析

1.1 环境背景

  • 2025软件系统安全赛初赛Java环境
  • Java版本:Java 17
  • 关键文件:DBController.java、User.java、Utils.java

1.2 漏洞分析

环境中存在getConnection方法,但其URL从配置文件读取,无法直接利用JDBC反序列化漏洞。环境中存在ojdbc依赖,提供了Oracle JDBC反序列化攻击面。

1.3 可利用类

以下Oracle类可用于构造反序列化链:

  • OracleCachedRowSet
  • OracleFilteredRowSet
  • OracleJoinRowSet
  • OracleWebRowSet

1.4 攻击限制与绕过

OracleCachedRowSet.getConnectionInternal中存在validateJNDIName检测,必须使用RMI方式进行攻击。

1.5 Payload构造关键

  • OracleCachedRowSet寻找合适的接口代理:通过逐个尝试实现的接口,最终确定使用RowSetInternal接口
  • 出口处理:可使用XString类,存在Xalan依赖时提供六种不同打法
  • 原生JDK的XString需要添加编译参数:--add-exports java.xml/com.sun.org.apache.xpath.internal.objects=ALL-UNNAMED

2. Java 17模块化问题处理

2.1 模块化基础处理

  • 对所有自定义类进行patchModule操作
  • 将偏移修改为Object.class的偏移以避免模块化限制

2.2 IDEA配置参数

编译时参数设置位置:

Settings → Build, Execution, Deployment → Compiler → Java Compiler → Additional command line parameters

运行时参数设置位置:

Run/Debug Configurations → Modify options → Add VM options

2.3 模块化相关参数详解

--add-exports参数

  • 用途:当直接调用JDK 17内部API创建类或使用静态方法时使用
  • 格式:--add-exports $MODULE/$PACKAGE=ALL-UNNAMED
  • 作用:将指定模块的包导出给所有未命名模块

--add-opens参数

  • 用途:解决反射访问报错问题(反射是运行时多态,不受--add-exports影响)
  • 格式:--add-opens $MODULE/$PACKAGE=ALL-UNNAMED
  • 注意:patchModule对反射限制无绕过作用

--add-modules参数

  • 用途:将可选、非必要模块添加到当前模块的模块图
  • 使用场景:仅在出现相关报错提示时使用

3. JNDI注入攻击技术

3.1 Java 17下的限制

  • TemplatesImpl相关利用链在Java 17中完全失效
  • 环境中存在tomcat-jdbc但缺少相关数据库依赖
  • tomcat-embed-core-10.3.31存在,但原生JNDI注入最高只支持10.1.0-M14

3.2 组合攻击方案

使用batik低版本和tomcat-el组合进行攻击:

3.2.1 恶意Jar包制作

  1. 实现initializeEventListeners方法
  2. 添加MANIFEST.MF文件,位置和内容如下:
位置:src/main/resources/META-INF/MANIFEST.MF
内容:Manifest-Version: 1.0

3.2.2 项目配置

  • 修改项目JDK版本为Java 17
  • 设置编译参数
  • 设置运行参数

3.2.3 服务端启动

需要同时启动三个服务:

  1. RMIServer
  2. XMLServer
  3. JarServer

设置反序列化链的JNDI路径为:rmi://127.0.0.1:1097/remoteobj

3.3 攻击原理分析

  • Spring中beanfactory通过调用属性对应的setter方法进行自动注入
  • setURI方法调用loadSVGDocument进行解析
  • BaseScriptingEnvironment.loadScripts方法的loadScript中包含关键执行逻辑

3.4 Jar包构造的两种方式

  1. 继承自ScriptHandler并重写run方法
  2. 继承自EventListenerInitializer并重写initializeEventListeners方法

4. 其他攻击向量

4.1 Jackson+LdapAttribute反序列化

  • 利用链:Jackson + LdapAttribute反序列化
  • 需要自行编写LDAP服务器
  • 构建时VM options配置要求

4.2 YAML反序列化

  • 理论上可打通但测试未成功
  • 版本可能存在兼容性问题

5. Jackson新时代利用链

5.1 简化方案

最新研究发现可直接使用Jackson链实现通杀,无需复杂绕过:

参考文章:https://xz.aliyun.com/news/18701

5.2 优势

  • 避免复杂的模块化配置
  • 绕过Java 17的安全限制
  • 提供更稳定的攻击路径

6. 实践注意事项

6.1 环境配置

  • 确保所有依赖包版本兼容
  • 正确配置编译和运行时参数
  • 多次尝试以提高成功率

6.2 攻击调试

  • 注意错误信息分析
  • 合理使用调试工具
  • 关注Java 17特有的安全报错

6.3 防御建议

  • 及时更新依赖库版本
  • 配置Java安全策略
  • 对反序列化操作进行严格校验

本教学文档涵盖了Java反序列化漏洞在Java 17环境下的各种利用技术和绕过方案,重点分析了模块化系统的应对策略和新型攻击链的发掘方法。

Java 反序列化漏洞利用与绕过技术专题解析 1. 反序列化链挖掘分析 1.1 环境背景 2025软件系统安全赛初赛Java环境 Java版本:Java 17 关键文件:DBController.java、User.java、Utils.java 1.2 漏洞分析 环境中存在 getConnection 方法,但其URL从配置文件读取,无法直接利用JDBC反序列化漏洞。环境中存在ojdbc依赖,提供了Oracle JDBC反序列化攻击面。 1.3 可利用类 以下Oracle类可用于构造反序列化链: OracleCachedRowSet OracleFilteredRowSet OracleJoinRowSet OracleWebRowSet 1.4 攻击限制与绕过 OracleCachedRowSet.getConnectionInternal 中存在 validateJNDIName 检测,必须使用RMI方式进行攻击。 1.5 Payload构造关键 为 OracleCachedRowSet 寻找合适的接口代理:通过逐个尝试实现的接口,最终确定使用 RowSetInternal 接口 出口处理:可使用 XString 类,存在Xalan依赖时提供六种不同打法 原生JDK的 XString 需要添加编译参数: --add-exports java.xml/com.sun.org.apache.xpath.internal.objects=ALL-UNNAMED 2. Java 17模块化问题处理 2.1 模块化基础处理 对所有自定义类进行 patchModule 操作 将偏移修改为 Object.class 的偏移以避免模块化限制 2.2 IDEA配置参数 编译时参数设置位置: 运行时参数设置位置: 2.3 模块化相关参数详解 --add-exports参数 用途:当直接调用JDK 17内部API创建类或使用静态方法时使用 格式: --add-exports $MODULE/$PACKAGE=ALL-UNNAMED 作用:将指定模块的包导出给所有未命名模块 --add-opens参数 用途:解决反射访问报错问题(反射是运行时多态,不受--add-exports影响) 格式: --add-opens $MODULE/$PACKAGE=ALL-UNNAMED 注意: patchModule 对反射限制无绕过作用 --add-modules参数 用途:将可选、非必要模块添加到当前模块的模块图 使用场景:仅在出现相关报错提示时使用 3. JNDI注入攻击技术 3.1 Java 17下的限制 TemplatesImpl 相关利用链在Java 17中完全失效 环境中存在 tomcat-jdbc 但缺少相关数据库依赖 tomcat-embed-core-10.3.31 存在,但原生JNDI注入最高只支持10.1.0-M14 3.2 组合攻击方案 使用batik低版本和tomcat-el组合进行攻击: 3.2.1 恶意Jar包制作 实现 initializeEventListeners 方法 添加MANIFEST.MF文件,位置和内容如下: 3.2.2 项目配置 修改项目JDK版本为Java 17 设置编译参数 设置运行参数 3.2.3 服务端启动 需要同时启动三个服务: RMIServer XMLServer JarServer 设置反序列化链的JNDI路径为: rmi://127.0.0.1:1097/remoteobj 3.3 攻击原理分析 Spring中 beanfactory 通过调用属性对应的setter方法进行自动注入 setURI 方法调用 loadSVGDocument 进行解析 在 BaseScriptingEnvironment.loadScripts 方法的 loadScript 中包含关键执行逻辑 3.4 Jar包构造的两种方式 继承自 ScriptHandler 并重写 run 方法 继承自 EventListenerInitializer 并重写 initializeEventListeners 方法 4. 其他攻击向量 4.1 Jackson+LdapAttribute反序列化 利用链: Jackson + LdapAttribute 反序列化 需要自行编写LDAP服务器 构建时VM options配置要求 4.2 YAML反序列化 理论上可打通但测试未成功 版本可能存在兼容性问题 5. Jackson新时代利用链 5.1 简化方案 最新研究发现可直接使用Jackson链实现通杀,无需复杂绕过: 参考文章:https://xz.aliyun.com/news/18701 5.2 优势 避免复杂的模块化配置 绕过Java 17的安全限制 提供更稳定的攻击路径 6. 实践注意事项 6.1 环境配置 确保所有依赖包版本兼容 正确配置编译和运行时参数 多次尝试以提高成功率 6.2 攻击调试 注意错误信息分析 合理使用调试工具 关注Java 17特有的安全报错 6.3 防御建议 及时更新依赖库版本 配置Java安全策略 对反序列化操作进行严格校验 本教学文档涵盖了Java反序列化漏洞在Java 17环境下的各种利用技术和绕过方案,重点分析了模块化系统的应对策略和新型攻击链的发掘方法。