本篇文章主要是了解一下网络安全的反序列化的漏洞,反序列化漏洞与其他的基础漏洞不太一样,反序列化漏洞不是因为反序列化直接产生的,而是因为反序列化而连带的一些方法与函数的使用而产生出来的。首先带大家了解一下什么是序列化与反序列化。
序列化和反序列话的作用是保证数据在互联网上完整、高效的传输。
因为互联网上传输使用的几乎都是HTTP协议,如果在客户端输入的代码没有进过处理直接发送过去是很容易被打乱或者丢失的。而避免这种情况就产生了序列化和反序列化。我们首先需要在客户端发送前先将代码转换成某种数据格式,然后再发送给服务端,服务端在将数据格式转换为代码,这样的代码就会更加的稳定。
由客户端将代码转换为数据格式的操作就叫做序列化,而到了服务端再将这段数据格式转换为代码就叫做反序列化操作。
序列化的模样如下:
我们在代码层面来看一下:
下面用的是php代码,哈哈有些乱,将就着看,大致就是我写了两个值,一个是对象、一个是变量,然后将这两个值序列化。最后又把第二个序列化的值,也就是变量stu2的值进行反序列化了。
序列化就是将代码转换成一行字符串,那么反序列化就是正好相反,将一行字符串转换为代码咯。
这样,我们大致对序列化和反序列有一个印象。
然后再说一说php的反序列化漏洞,我们接着php的对象往下讲,本文不再对类和对象详细说明了,不清楚的可以先了解一下类和对象才可以看明白反序列化漏洞。
在php的类使用中,开发者加入了__开头的魔术方法,也就是函数,类中的魔术方法,在特定情况下会自动调用。即使魔术方法在类中没有被定义,也是真实存在的。
__construct() 在创建对象时自动调用 (两个小下划线)
__destruct() 在销毁对象时自动调用
__wakeup() unserialize()时会自动调用这个函数
__sleep() serialize()时会自动调用这个函数
也就是说上述的函数只要在类中出现,满足了对应的条件就会自动执行
反序列化漏洞就是因为反序列化过程中,对象的魔术方法会自动调用,魔术方法本身又调用了别的方法,最终呈现一种链式调用,直到执行任意(恶意)的代码或者命令
代码显示如下:
总结:
什么是反序列化漏洞?
序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令
而我们在练习中,想要得到想要的命令,就需要在客户端序列化之后修改他们的数据
修改序列化后的数据,目的是什么?
为了满足一定的条件以后实现链式调用