Java反序列化和JNDI注入漏洞案例实战

本文详细介绍了Java中的反序列化常见利用类,包括TemplatesImpl、ServiceLoader、ImageIO等,以及如何利用这些类进行代码执行。接着,文章讲解了CORBA的基础概念和RMI反序列化漏洞的原理,强调了JNDI注入攻击的流程和不同攻击向量。此外,还讨论了高版本JDK中的限制及其绕过方法,如Tomcat的BeanFactory和LDAP bypass。最后,文章分析了JNDI注入工具marshalsec的使用和工作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、反序列化常见利用类

利用类的作用:加载类或者执行命令。

// 类加载
(1)com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl(BeanComparator、EqualsBean/ToStringBean可以间接调用TemplatesImpl)
(2)java.util.ServiceLoader$LazyIterator / com.sun.xml.internal.ws.util.ServiceFinder$LazyIterator (配合BCEL)
// 反射调用
(3)javax.imageio.ImageIO$ContainsFilter
(4)java.beans.EventHandler
(5)com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$GetterSetterReflection
// 非JDK自带
(6)org.codehaus.groovy.runtime.MethodClosure
(7)org.codehaus.groovy.runtime.ConvertedClosure
(8)groovy.util.Expando

(1)TemplatesImpl

TemplatesImpl用于CommonsBeanutils、Fastjson,其调用链如下,核心在于得到恶意类的Class对象。然后执行newInstance()操作触发static代码块中的恶意代码。

Templates
<think>好的,我现在需要回答用户的问题:“java漏洞为什么需要攻击链?攻击链原理是什么?第一个答案是单一反序列化无法完成RCE,完善第一个答案,后面那个答案是什么”。首先,我要理解用户的问题。用户想知道在Java漏洞利用中为什么需要攻击链,攻击链的原理,并且用户提到之前的回答中,单一的反序列化漏洞无法完成远程代码执行(RCE),需要完善这个答案,然后询问后面的答案是什么。 首先,我需要明确几个关键点:Java漏洞中的攻击链是什么,为什么需要它,以及攻击链的工作原理。用户提到第一个答案指出单一的反序列化漏洞不足以实现RCE,所以需要解释攻击链如何弥补这一不足,然后给出后续的答案。 首先,我应该回顾一下反序列化漏洞的基本知识。反序列化漏洞通常出现在应用程序将不受信任的数据反序列化为对象时,攻击者可以构造恶意序列化数据,导致任意代码执行。但在实际情况中,单独的漏洞可能不足以直接实现RCE,因为可能受到环境限制,如安全管理器、类加载器的限制,或者缺乏可利用的gadget链(即一系列可被利用的类方法)。 因此,攻击链的概念就是组合多个漏洞或利用步骤,绕过安全机制,最终达成攻击目标。例如,攻击者可能需要利用反序列化漏洞触发某个类的方法,进而利用另一个库中的gadget来执行命令。这需要多个组件协同工作,形成攻击链。 接下来,我需要详细解释攻击链的原理,包括各个阶段的作用,比如如何通过反序列化触发漏洞,如何利用现有的类库(如commons-collections)中的gadget执行代码,以及如何绕过沙箱或安全限制。 然后,完善第一个答案,即为什么单一反序列化无法完成RCE,可能需要提到Java环境的默认安全设置、缺少必要的gadget类,或者目标类路径中没有可利用的类。例如,如果应用程序使用的库版本已经修复了相关的gadget,那么单独的反序列化漏洞就无法被利用,需要其他手段。 最后,用户问“后面那个答案是什么”,可能是指补充第一个答案后的另一个原因或攻击链的其他组成部分。因此,我需要明确在攻击链中除了反序列化漏洞外,还需要哪些其他因素,比如特定的gadget链、权限配置不当、或者网络层面的攻击步骤。 在整理这些信息时,要确保结构清晰,分点解释,同时结合实际例子(如经典的Apache Commons Collections漏洞)来说明攻击链的构建过程。此外,需要强调攻击链的复杂性以及防御措施,如及时更新库版本、使用安全配置等。</think>以下是对**Java漏洞攻击链**的深入解析,从**原理**到**实战**逐步说明: --- ### 一、**为什么需要攻击链?** Java漏洞(如反序列化)单独利用常受限于以下条件,需组合利用形成攻击链: 1. **安全沙箱限制** - Java默认启用安全管理器时,即使触发漏洞也无法直接执行系统命令(如`Runtime.exec()`被拦截) 2. **类加载器隔离** - Web容器(如Tomcat)的类加载机制可能阻止攻击者直接加载恶意类 3. **Gadget链缺失** - 目标环境中若无特定版本的依赖库(如`commons-collections 3.1`),反序列化无法触发危险方法调用 **典型案例**:2015年Apache Commons Collections反序列化漏洞(CVE-2015-4852)的利用,必须依赖特定版本的库中存在危险Gadget链。 --- ### 二、**攻击链的核心原理** 攻击链通过**多阶段漏洞组合**突破防御层,典型结构如下: 1. **触发点(Entry Point)** - 找到可注入恶意序列化数据的位置(如HTTP参数、RMI通信) 2. **Gadget链构造** - 利用类库中的**方法调用链**传递恶意操作(如`AnnotationInvocationHandler→TransformedMap→InvokerTransformer`) 3. **执行环境突破** - 绕过沙箱限制(如通过`TemplatesImpl`类加载字节码) 4. **载荷投递** - 最终执行系统命令(如反弹Shell)或内存马注入 --- ### 三、**反序列化攻击链的典型组成** #### 阶段1:触发反序列化漏洞 ```java // 恶意序列化数据注入点示例 ObjectInputStream ois = new ObjectInputStream(request.getInputStream()); ois.readObject(); // 触发反序列化 ``` #### 阶段2:Gadget链利用(以commons-collections为例) ```java // 构造Transformer链 Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}) }; ChainedTransformer chain = new ChainedTransformer(transformers); ``` #### 阶段3:绕过执行限制 - **内存马技术**:通过动态加载字节码(如`BCEL ClassLoader`)绕过文件写入检测 - **反射绕过**:利用`sun.reflect.ReflectionFactory`创建特权上下文 --- ### 四、**防御视角下的阻断策略** 1. **依赖库安全升级** - 升级已知危险库(如commons-collections 4.4+已修复漏洞) 2. **输入验证与过滤** ```java // 使用白名单校验反序列化类 ObjectInputFilter filter = ObjectInputFilter.Config.createFilter("!com.example.*;"); ois.setObjectInputFilter(filter); ``` 3. **安全配置强化** - 禁用不必要的RMI/JMX服务 - 设置Java安全策略文件限制高危操作 --- ### 五、**攻击链的进阶利用** 当基础Gadget链不可用时,攻击者可能组合以下技术: 1. **二次反序列化** - 通过`URLClassLoader`加载远程恶意类(需出网) 2. **JNDI注入配合** - 结合`LDAP/RMI`协议远程加载攻击载荷(如Log4j漏洞CVE-2021-44228) 3. **内存残留利用** - 利用Web容器卸载后未清理的类驻留内存执行代码 --- **总结**:Java漏洞攻击链的本质是**环境适应与逻辑串联**,防御者需针对每个环节部署检测与拦截(如RASP监控敏感方法调用)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wespten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值