从一道java题学习 JRMP 绕过 JNDI
字数 1777 2025-08-29 22:41:02
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 调用链概览
JdkDynamicAopProxy#invoke() (第一次)
-> ReflectiveMethodInvocation#proceed()
-> AspectJAroundAdvice#invoke()
-> AbstractAspectJAdvice#invokeAdviceMethod()
-> 反射调用目标方法
2.2 关键方法分析
-
AbstractAspectJAdvice#invokeAdviceMethod()
- 调用
invokeAdviceMethodWithGivenArgs方法 - 包含反射调用逻辑
- 调用
-
AspectJAroundAdvice#invoke
- 继承自
AbstractAspectJAdvice - 调用父类的
invokeAdviceMethod()方法
- 继承自
-
ReflectiveMethodInvocation#proceed()
- 关键变量:
interceptorOrInterceptionAdvice需要为AspectJAroundAdvice类 interceptorsAndDynamicMethodMatchers变量在构造函数中赋值
- 关键变量:
-
JdkDynamicAopProxy#invoke()
- else分支调用
ReflectiveMethodInvocation#proceed() - 需要
chain变量不为空
- else分支调用
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链进行二次反序列化
- 使用ysoserial的
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网络连接
- 记录可疑的反序列化操作