admin管理员组

文章数量:1574511

什么是反序列化?

有些时候我们需要把应用程序中的数据以另一种形式进行表达,以便于将数据存储起来,并在未来某个时间点再次使用,或者便于通过网络传输给接收方。这一过程我们把它叫做序列化。典型的例子是,用户数据被序列化后存储到数据库中,另一个例子是在Stateless架构下,用户登陆后的身份数据被序列化存储到了浏览器中。


反序列化和序列化是两个正好相反的过程。当我们要再次使用这些数据的时候,应用程序读取序列化之后的数据,并将其恢复成应用程序中的数据。例如服务器端从Redis中读出一个键值对,其内容是JSON格式的字符串,代表了某个用户的个人资料,并将其恢复成应用程序可使用的数据。
反序列化有什么安全问题?
尽管反序列化最严重可导致远程代码执行(RCE,Remote Code Execution),但最常见的反序列化安全问题却是通过修改序列化之后的数据字段,从而进行提权或越权操作。
举例来说,服务器端为了能快速横向扩展而被设计成了后端无服务状态架构,这也就意味着用户登陆后,其身份信息(例如用户ID,姓名,角色,登陆时间戳等)被保存到了浏览器cookie当中,在后续的请求里将会被自动发往服务器。

图:用户登陆后,服务器将用户身份信息存储在浏览器cookie中

存储于cookie中的这份数据的格式是应用程序自定义的,但攻击者通过探索尝试后发现,修改其中的某个字段就能将用户从普通用户修改为管理员。
存储于cookie中的原始数据:
Cookie: 3844998|AliceM|y|27|NU|active|null|201809
经过修改后的数据
Cookie: 3844998|AliceM|y|27|ADMIN|active|null|201809
由于缺乏对数据完整性的校验,服务器端在收到被修改过的这段数据后

本文标签: 不安全序列化InsecureDeserialization