反序列化漏洞

序列化和反序列化

序列化是将复杂的数据结构(例如对象及其字段)转换为“更扁平”格式的过程,该格式可以作为字节顺序流发送和接收。序列化数据使其更容易:

将复杂数据写入进程间内存,文件或数据库

例如,通过网络,在应用程序的不同组件之间或在API调用中发送复杂的数据

至关重要的是,在序列化对象时,其状态也将保留。换句话说,将保留对象的属性及其分配的值。

反序列化是将字节流还原为原始对象的完整功能副本的过程,其状态与序列化时的状态完全相同。然后,网站的逻辑可以与此反序列化的对象进行交互,就像与任何其他对象进行交互一样。

许多编程语言为序列化提供本地的支持。对象的具体序列化方式取决于语言。某些语言将对象序列化为二进制格式,而其他语言则使用不同的字符串格式,同时具有不同程度的人类可读性。请注意,所有原始对象的属性都存储在序列化的数据流中,包括任何私有字段。为防止字段被序列化,必须在类声明中将其显式标记为“ transient”。

不安全的反序列化

不安全的反序列化是指网站对用户可控制的数据进行反序列化时,攻击者能够操纵序列化的对象,以将有害数据传递到应用程序代码中。

甚至有可能用完全不同类的对象替换序列化的对象。更夸张的是,将对网站可用的任何类别的对象进行反序列化和实例化,而与预期的类别无关。因此,不安全的反序列化有时称为“对象注入”漏洞。

意外类的对象可能会导致异常。但是,到此时,损坏可能已经造成。许多基于反序列化的攻击是在反序列化完成之前完成的。这意味着即使网站自身的功能未直接与恶意对象进行交互,反序列化过程本身也可以发起攻击。因此,其逻辑基于强类型语言的网站也可能容易受到这些技术的攻击。

漏洞成因

  • 原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果
  • 反序列化漏洞并不是PHP特有,也存在于Java、Python等语言之中,但其原理基本相通

会出现不安全的反序列化,是因为人们普遍缺乏对用户可控制数据进行反序列化的危险程度的了解。理想情况下,绝对不应该对用户输入数据进行反序列化

由于通常认为反序列化对象是可信任的,因此也可能会出现漏洞。尤其是当使用具有二进制序列化格式的语言时,开发人员可能会认为用户无法有效读取或操纵数据。但是,尽管可能需要付出更多的努力,但攻击者仍有可能利用二进制序列化的对象,就象利用基于字符串的格式一样。

由于现代网站中存在大量依赖关系,因此基于反序列化的攻击也成为可能。一个典型的站点可能会实现许多不同的库,每个库也都有自己的依赖性。这会创建大量难以安全管理的类和方法。由于攻击者可以创建任何这些类的实例,因此很难预测可以对恶意数据调用哪些方法。如果攻击者能够将一系列意想不到的方法调用链接在一起,并将数据传递到与初始源完全无关的接收器,则尤其如此。因此,几乎不可能预料到恶意数据的流动并堵塞(修复)每个潜在的漏洞。

简而言之,反序列化不受信任的输入是不安全的。

漏洞影响

  • 不安全的反序列化,主要造成的危害是远程代码执行
  • 如果无法远程代码执行,也可能导致权限提升、任意文件读取、拒绝服务攻击等

不安全的反序列化的影响可能非常严重,因为它为大规模增加攻击面提供了切入点。它允许攻击者以有害的方式重用现有的应用程序代码,从而导致许多其他漏洞,通常是远程执行代码(RCE)。

即使在无法执行远程代码的情况下,不安全的反序列化也可能导致越权,任意文件访问和拒绝服务攻击。

防御方式

  • 应该尽量避免用户输入反序列化的参数
  • 如果确实需要对不受信任的数据源进行反序列化,需要确保数据未被篡改,比如使用数字签名来检查数据的完整性
  • 严格控制反序列化相关函数的参数,坚持用户所输入的信息都是不可靠的原则
  • 对于反序列化后的变量内容进行检查,以确定内容没有被污染
  • 做好代码审计相关工作,提高开发人员的安全意识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值