从一道java题学习 JRMP 绕过 JNDI
字数 1777 2025-08-29 22:41:02

JRMP绕过JNDI限制的Java反序列化攻击技术分析

1. 题目背景分析

题目名称为justDeserialize,主要考察Java反序列化漏洞利用技术,特别关注在JDK 11环境下如何绕过JNDI限制。

1.1 漏洞点分析

  • 存在反序列化漏洞的路由:/read
  • 存在两层WAF防护:
    1. 明文检测:可通过utf8-over编码绕过
    2. 重写resolveClass方法的黑名单检测:需要避免使用黑名单中的类

1.2 环境信息

  • JDK版本:11
  • 关键依赖:
    • spring-aop
    • aspectjweaver

2. Spring-AOP反序列化链分析

2.1 调用链概览

JdkDynamicAopProxy#invoke() (第一次)
-> ReflectiveMethodInvocation#proceed()
-> AspectJAroundAdvice#invoke()
-> AbstractAspectJAdvice#invokeAdviceMethod()
-> 反射调用目标方法

2.2 关键方法分析

  1. AbstractAspectJAdvice#invokeAdviceMethod()

    • 调用invokeAdviceMethodWithGivenArgs方法
    • 包含反射调用逻辑
  2. AspectJAroundAdvice#invoke

    • 继承自AbstractAspectJAdvice
    • 调用父类的invokeAdviceMethod()方法
  3. ReflectiveMethodInvocation#proceed()

    • 关键变量:interceptorOrInterceptionAdvice需要为AspectJAroundAdvice
    • interceptorsAndDynamicMethodMatchers变量在构造函数中赋值
  4. JdkDynamicAopProxy#invoke()

    • else分支调用ReflectiveMethodInvocation#proceed()
    • 需要chain变量不为空

2.3 代理层设计

  • 需要让advice变量同时满足:
    1. Advice类型
    2. 实现MethodInterceptor接口
  • 解决方案:使用JdkDynamicAopProxy类对AspectJAroundAdvice进行代理

2.4 最终利用

  • 第一次触发代理类的compare方法
  • 最终调用无参方法:JdbcRowSetImpl#getDatabaseMetaData实现JNDI注入

3. JRMP绕过JNDI限制

3.1 背景

  • JDK 11环境下trustSerialData通常为true,但题目中设置为false
  • 类似JDK 21下的JNDI注入绕过技术

3.2 关键技术点

  1. StreamRemoteCall#executeCall()

    • 包含反序列化调用
    • 本质是JRMP协议处理
    • lookup过程中被调用
  2. 利用方法

    • 使用ysoserial的JRMPListener模块
    • 自定义JRMPListener,利用spring-aop链进行二次反序列化

3.3 攻击步骤

  1. 开启JRMP监听服务
  2. 构造特定的序列化payload
  3. 触发反序列化漏洞
  4. 通过JRMP协议二次加载恶意类

4. 完整攻击流程

  1. 绕过第一层WAF

    • 使用utf8-over编码绕过明文检测
  2. 绕过第二层WAF

    • 避免使用黑名单中的类
    • 选择spring-aopaspectjweaver依赖中的可用类
  3. 构造Spring-AOP链

    • 创建代理链:JdkDynamicAopProxy -> AspectJAroundAdvice
    • 设置反射调用目标为JdbcRowSetImpl#getDatabaseMetaData
  4. JRMP绕过

    • 启动JRMP监听服务
    • 通过第一次反序列化触发JRMP连接
    • 通过JRMP协议传输真正的攻击payload
  5. 命令执行

    • 最终通过反射调用实现任意命令执行

5. 防御建议

  1. 修复方案

    • 升级JDK到最新版本
    • 禁用不必要的反序列化功能
    • 实现严格的白名单机制
  2. 缓解措施

    • 设置jdk.jndi.object.factoriesFilter过滤非信任的JNDI对象
    • 配置jdk.jndi.rmi.object.trustURLCodebase为false
    • 设置jdk.jndi.ldap.object.trustURLCodebase为false
  3. 监控措施

    • 监控异常的JRMP网络连接
    • 记录可疑的反序列化操作

6. 参考资源

  1. GSBP0的博客分析
  2. Vidar-Team技术文档
  3. Potatowo的赛事分析
JRMP绕过JNDI限制的Java反序列化攻击技术分析 1. 题目背景分析 题目名称为 justDeserialize ,主要考察Java反序列化漏洞利用技术,特别关注在JDK 11环境下如何绕过JNDI限制。 1.1 漏洞点分析 存在反序列化漏洞的路由: /read 存在两层WAF防护: 明文检测:可通过utf8-over编码绕过 重写 resolveClass 方法的黑名单检测:需要避免使用黑名单中的类 1.2 环境信息 JDK版本:11 关键依赖: spring-aop aspectjweaver 2. Spring-AOP反序列化链分析 2.1 调用链概览 2.2 关键方法分析 AbstractAspectJAdvice#invokeAdviceMethod() 调用 invokeAdviceMethodWithGivenArgs 方法 包含反射调用逻辑 AspectJAroundAdvice#invoke 继承自 AbstractAspectJAdvice 调用父类的 invokeAdviceMethod() 方法 ReflectiveMethodInvocation#proceed() 关键变量: interceptorOrInterceptionAdvice 需要为 AspectJAroundAdvice 类 interceptorsAndDynamicMethodMatchers 变量在构造函数中赋值 JdkDynamicAopProxy#invoke() else分支调用 ReflectiveMethodInvocation#proceed() 需要 chain 变量不为空 2.3 代理层设计 需要让 advice 变量同时满足: Advice 类型 实现 MethodInterceptor 接口 解决方案:使用 JdkDynamicAopProxy 类对 AspectJAroundAdvice 进行代理 2.4 最终利用 第一次触发代理类的 compare 方法 最终调用无参方法: JdbcRowSetImpl#getDatabaseMetaData 实现JNDI注入 3. JRMP绕过JNDI限制 3.1 背景 JDK 11环境下 trustSerialData 通常为true,但题目中设置为false 类似JDK 21下的JNDI注入绕过技术 3.2 关键技术点 StreamRemoteCall#executeCall() 包含反序列化调用 本质是JRMP协议处理 在 lookup 过程中被调用 利用方法 使用ysoserial的 JRMPListener 模块 自定义 JRMPListener ,利用spring-aop链进行二次反序列化 3.3 攻击步骤 开启JRMP监听服务 构造特定的序列化payload 触发反序列化漏洞 通过JRMP协议二次加载恶意类 4. 完整攻击流程 绕过第一层WAF 使用utf8-over编码绕过明文检测 绕过第二层WAF 避免使用黑名单中的类 选择 spring-aop 和 aspectjweaver 依赖中的可用类 构造Spring-AOP链 创建代理链: JdkDynamicAopProxy -> AspectJAroundAdvice 设置反射调用目标为 JdbcRowSetImpl#getDatabaseMetaData JRMP绕过 启动JRMP监听服务 通过第一次反序列化触发JRMP连接 通过JRMP协议传输真正的攻击payload 命令执行 最终通过反射调用实现任意命令执行 5. 防御建议 修复方案 升级JDK到最新版本 禁用不必要的反序列化功能 实现严格的白名单机制 缓解措施 设置 jdk.jndi.object.factoriesFilter 过滤非信任的JNDI对象 配置 jdk.jndi.rmi.object.trustURLCodebase 为false 设置 jdk.jndi.ldap.object.trustURLCodebase 为false 监控措施 监控异常的JRMP网络连接 记录可疑的反序列化操作 6. 参考资源 GSBP0的博客分析 Vidar-Team技术文档 Potatowo的赛事分析