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类可用于构造反序列化链:
OracleCachedRowSetOracleFilteredRowSetOracleJoinRowSetOracleWebRowSet
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包制作
- 实现
initializeEventListeners方法 - 添加MANIFEST.MF文件,位置和内容如下:
位置:src/main/resources/META-INF/MANIFEST.MF
内容:Manifest-Version: 1.0
3.2.2 项目配置
- 修改项目JDK版本为Java 17
- 设置编译参数
- 设置运行参数
3.2.3 服务端启动
需要同时启动三个服务:
RMIServerXMLServerJarServer
设置反序列化链的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环境下的各种利用技术和绕过方案,重点分析了模块化系统的应对策略和新型攻击链的发掘方法。