- 1 序列化与反序列化基础
- 2 漏洞基本原理
- 3 Java 反射
- 4 DNSURL gadget 分析
- 1 背景介绍
- 2 CommonsCollections 1 Gadget 分析
- 3 CommonsCollections 6 Gadget 分析
- 4 CommonsCollections 2&&4 Gadget 分析
- JDK 7U21 Gadget
- 1 原理
- 2 构造
- 3 调用链
- 4 总结
- 1 Java 动态加载字节码
- 2 CommonsCollections 3 Gadget 分析
- 3 CommonsCollections 5 Gadget 分析
- 4 CommonsCollections 7 Gadget 分析
- 反序列化攻击涉及到的相关协议
- 1 RMI
- 2 JNDI
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
2 漏洞基本原理
2.1 序列化
序列化后的数据开头包含两字节的魔术数字: ACED
。接下来是两字节的版本号 0005
的数据。此外还包含了类名、成员变量的类型和个数等。
序列化的数据流以魔术数字和版本号开头,这个值是在调用 ObjectOutputStream
序列化时,由 writeStreamHeader
方法写入:
protected void writeStreamHeader() throws IOException {
//STREAM_MAGIC (2 bytes) 0xACED
bout.writeShort(STREAM_MAGIC);
//STREAM_VERSION (2 bytes) 5
bout.writeShort(STREAM_VERSION);
}
2.2 反序列化
Java 程序中类 ObjectInputStream
的 readObject
方法用来将数据流反序列化为对象。
readObject()
方法在反序列化漏洞中它起到了关键作用。如果 readObject()
方法被重写,反序列化该类时调用便是重写后的 readObject()
方法。如果该方法书写不当的话就有可能引发恶意代码的执行。
如:
public class Evil implements Serializable {
public String cmd;
private void readObject(java.io.ObjectInputStream stream) throws Exception {
stream.defaultReadObject();
Runtime.getRuntime().exec(cmd);
}
但是,实际中反序列化漏洞的构造比较复杂,而且需要借助 Java 的一些特性,如 Java 的反射。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论