目录
什么是反序列化漏洞?
序列化 serialize
反序列化 unserialize
常见魔法函数
反序列化漏洞防御
反序列化又叫对象注入,漏洞产生是程序在处理对象、魔术函数以及序列化问题时所导致的 。当传给unserialize()
的参数可控时,可以通过传入一个精心构造的序列化字符串,从而控制对象内部的变量甚至是函数。
对象的状态信息转换为可以存储或传输的形式的过程
序列化期间,对象将当前的状态写入到临时或持久型的存储区,将状态信息保存为字符串。
序列化只序列化对象,不序列化方法
class S{public $test="pikachu";}$s=new S(); //创建一个对象serialize($s); //把这个对象进行序列化序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}O:代表object1:代表对象名字长度为一个字符S:对象的名称1:代表对象里面有一个变量s:数据类型4:变量名称的长度test:变量名称s:数据类型7:变量值的长度pikachu:变量值
将序列化后的字符串还原成对象
反序列化的数据本质上来说时没有危害的,用户可控数据进行反序列化是存在危害的,反序列化的危害关键在于可控不可控
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");echo $u->test; //得到的结果为pikachu
__construct()当一个对象创建时被调用__destruct()当一个对象销毁时被调用__toString()当一个对象被当作一个字符串使用__sleep() 在对象在被序列化之前运行__wakeup将在序列化之后立即被调用如何绕过 __wakeup()
当 序列化的字符串中的 属性值 个数 大于 属性个数 就会导致反序列化异常,从而绕过 __wakeup()
不要把用户的输入或者是用户可控的参数直接放进反序列化的操作中去
上一篇:Vue项目创建