在Web应用安全中,反序列化漏洞是一种非常常见的漏洞形式,这篇文章主要参考了PortSwigger,介绍了不安全的反序列化的概念,并通过一个简单易懂的实验说明了不安全的反序列化是如何危害到Web安全的。
概念与背景
序列化和反序列化
序列化是将复杂的数据结构(例如对象其字段)转换为“更扁平”的格式的过程,这种格式可以用于字节流发送和接收,使用序列化技术,我们可以将复杂的数据写入内存、文件或数据库,并且通过网络在应用程序的不同组件之间或在API调用中发送复杂的数据。在序列化对象时,其状态也将保留下来。换句话说,序列化将保留对象的属性及其分配的值。
很多编程语言都支持序列化操作,具体的序列化方式取决于不同的语言,某些语言将对象序列化为二进制格式,而其他语言则使用不同的字符串格式,并具有不同程度的可读性。需要注意的是,所有原始对象的属性都存储在序列化的数据流中,包括任何私有字段。在实际应用中,如果需要防止某些字段被序列化,必须在类声明中将其显式标记为“ transient”。在使用不同的编程语言时,序列化可能被称为marshalling(Ruby)或pickling(Python)。在本文中,这些术语与“序列化”同义。
不安全的反序列化
不安全的反序列化是指攻击者操纵用户可控制的数据,在其中插入有害数据,这部分数据被序列化后发送给网站,网站接着对其进行反序列化,有害数据就被传递到了应用程序代码中。
攻击者甚至有可能用不同类型的对象替换序列化的对象。如果网站不对序列化数据进行检查,那么任何类型的对象都会被反序列化和实例化。因此,不安全的反序列化也被称为“对象注入”漏洞。
许多基于反序列化的攻击在反序列化之前就已经完成,这意味着即使网站本身并未与恶意对象进行直接交互,反序列化过程本身也可以发起攻击,因此,逻辑上依赖于编程语言的网站也容易受到这种技术的攻击。