反序列化漏洞-1

前言

鼓起很大的勇气写这篇博文,不想承认我一直以来对反序列化漏洞就是一知半解的事实。其实我一直对反序列化漏洞有个执念,就是在我java这门语言完全不懂的时候我就非要去研究java的各种反序列化,然后把自己逼到一个绝路,大概这个持续时间有一两个月,还是一头雾水。后来我慢慢读代码,不懂的百度or谷歌,也跟进学习,直到我有一天接触到php反序列化,哦,原来反序列化是这样。记得当时java里面的各种rmi,反射链,一直到我下了ysoserial工具,我都一脸懵逼。其实我写这篇文章的此刻,我仍然不是很懂,但是我为什么要写呢?因为我自己想学习,而打字比阅读更容易加深自己的记忆。

反序列化和序列化原理

首先,第一要点是需要理解序列化、反序列化是什么东西?我翻墙坏了所以百度了一下:
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

我来举个生动的例子,假如现在已经到2500年了,人类发明了空间穿梭机,原理是:如果你要去另外一个地方,先在本地将你的身体分解为一个个原子,然后目的地那里利用相同的原子将你重组(此处不要讨论我还是我吗之类的哲学问题),重组之后你就等于空间穿梭了。

类比:你作为一个对象,本地将你身体分解的动作就是序列化(将对象状态转化为字节序列或其他可以存储或传输的形式),目的地利用原子将身体还原的过程就是反序列化(将字节序列还原成对象)

为什么会出现序列化和反序列化这种东西?

按照上面的理解,人类世界出现空间穿梭机的原因就是因为它利于人类的出行,那计算机世界中一个道理,序列化和反序列化的存在也是因为便于数据存储和传输。
百度给的答案:
二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。

反序列化漏洞

不妨大胆的想想,如果在进行空间穿梭的过程中,有可以控制或改变你穿梭过程中的状态的人存在。是不是很可怕呢?
对于计算机而言,无非就是输入-shell-输出,参考下冯诺依曼模型如下:
在这里插入图片描述
在这个过程中,存在了我们可以控制的数据。这个也是无法避免的,比如说,我们的QQ,给对方发送信息的内容必须交由客户控制,这也是实现某些功能的必须条件。
序列化和反序列化示意图如下:
序列化反序列化示意图
在反序列化过程中,也就是对对象进行还原的过程中,如果程序对不可信的数据进行了反序列化处理,那么攻击者就可以控制此序列化数据,进行恶意代码的输入,控制此应用程序,并获得此应用程序所在的载体(操作系统)的权限。

未完待续,先整体把握下反序列化漏洞,后续跟进具体内容

发布了5 篇原创文章 · 获赞 7 · 访问量 1824

猜你喜欢

转载自blog.csdn.net/silencediors/article/details/102934244