PHP反序列化——魔术方法

php里有这么三个函数:

__construct()/*这个函数在php创建对象的时候会自动调用*/

__destruct()/*这是php析构函数,当对象的所有引用都被删除或对象被显示销毁时会自动调用,简单来说(1)程序结束时;(2)调用unserialize()函数时*/

__wakeup()/*使用unserialize()函数时会调用*/

这三个函数是php的内部函数,但是一般在大型Web项目中都会重写这三个函数。

 

先说说什么是序列化:序列化就是将一个对象转变成了一个字符串以便后续的传递和使用,这个字符串保存了对象的属性(值)

看个例子

 

 这里就输出了te类的一个对象a序列化之后的字符串,即其属性

O:2:"te":1:{s:4:"test";s:4:"demo";}

变量类型:类名长度:类名:属性数量:{属性类型:属性名长度:属性名:属性值类型:属性值长度:属性值内容}

O是object对象,s是string字符串

 

反序列化unserialize()就是将一个序列化得到的字符串再转成其对应的对象;

 

对于上面说的三个魔术方法,这里举个例子说明

 

 

这样就很清楚了,在这些魔术方法重写时,如果存在开发人员疏忽未对用户输入的序列化字符串进行检测时,就可能导致攻击者可以控制反序列化过程,从而达到代码执行、文件操作等攻击行为,并且反序列化漏洞在java、python等面向对象语言里也是存在的。

posted @ 2020-07-21 21:00  Mr.J&  阅读(660)  评论(0)    收藏  举报