反序列化漏洞
什么是序列化
将复杂的数据结构转换为可以作为有顺序的字节流发送、或者转化为更扁平的格式以方便接收。
序列化使如下操作更简单:
- 写入复杂的数据到进程间的内存、文件或者数据库
- 发送复杂的数据,例如在网络、应用程序的不同组件之间、在API中调用复杂数据
当一个对象被序列化的时候,它的状态也就成了一种“持久态”。即对象属性极其分配的值都被保留下来
。
什么是反序列化
反序列化是将此字节流恢复为原始对象的完整功能副本的过程,其状态与序列化时的状态完全相同。
之后网站的一些逻辑便可以与这个反序列化的对象进行交互。
许多编程语言都对反序列化有支持。而对象序列化的方法取决于语言的不同:有的转化为2进制,有的转化为不同的字符串格式。
所有的对象属性都储存在序列化的数据流中,为了防止被序列化,可以在类的声明中标记为transient
什么是反序列化漏洞?
反序列化漏洞是指用户可控的数据被网站反序列化。
攻击者能够操纵序列化对象,以便将有害数据传递到应用程序的代码当中。甚至可以用完全不同的类的对象替换序列化对象
许多基于反序列化的攻击是在反序列化完成之前完成的
不安全的反序列化通常是因为普遍缺乏对反序列化用户可控数据的危险程度的理解。理想情况下,用户输入根本不应该被反序列化。
然而,有时网站所有者认为他们是安全的,因为他们对反序列化数据实施了某种形式的额外检查。这种方法通常是无效的,因为几乎不可能实施验证或清理来解释所有可能发生的情况。这些检查也存在根本性的缺陷,因为它们依赖于在反序列化后检查数据,在许多情况下,这对于防止攻击为时已晚。
由于反序列化的对象通常被认为是值得信赖的,因此也可能会出现漏洞。尤其是在使用二进制序列化格式的语言时,开发人员可能会认为用户无法有效地读取或操作数据。然而,虽然这可能需要更多的努力,但攻击者利用二进制序列化对象的可能性就如同利用基于字符串的格式一样。
由于现代网站中存在大量依赖项,基于反序列化的攻击也成为可能。一个典型的站点可能会实现许多不同的库,每个库也有自己的依赖项。这会创建大量难以安全管理的类和方法。由于攻击者可以创建任何这些类的实例,因此很难预测可以对恶意数据调用哪些方法。如果攻击者能够将一系列意外的方法调用链接在一起,将数据传递到与初始源完全无关的接收器中,则尤其如此。因此,几乎不可能预测恶意数据的流动并堵住每一个潜在的漏洞。
简而言之,可以说不可能安全地反序列化不受信任的输入。
不安全的反序列化有什么影响?
不安全的反序列化的影响可能非常严重,因为它为大量增加的攻击面提供了一个切入点。它允许攻击者以有害的方式重用现有的应用程序代码,从而导致许多其他漏洞,通常是远程代码执行。
即使在无法远程执行代码的情况下,不安全的反序列化也会导致权限提升、任意文件访问和拒绝服务攻击。
本文来自博客园,作者:{Zeker62},转载请注明原文链接:https://www.cnblogs.com/Zeker62/p/15174467.html