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