PHP反序列化,基本都是围绕着serialize(),unserialize()这两个函数。序列化说通俗点就是把一个对象变成可以传输的字符串。反序列化就是把字符串转变为对象。
为了更好的理解序列化,以序列化Json为例。
json_encode()
json_decode()
输出结果
所以在这里,将数组序列化成json格式的字串的目的就是为了方便传输。可以看见,这里json格式来保存数据主要是使用键值对的形式。
如何把一个对象序列化。
假设,写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果让这个class一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。当写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就可以把这个对象序列化了,存成一个字符串,当要用的时候再调用出来就好了。
例子:
漏洞的产生
PHP魔术方法:魔法函数一般是以_开头,通常会应为某些条件而触发。
__construct() 当一个对象创建时被调用
__destruct() 当一个对象销毁时被调用
__toString() 当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup() 将在序列化之后立即被调用
以上为主要关注的魔术方法,如果服务器能够接收反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法里,就会造成漏洞。