【反序列化基本介绍】
一、php序列化和反序列化
序列化后的a代表数组Array,是数据类型(注意此处的 a 仅标识数据结构类型),2指的是里面包含的元素数量
1和3两个数字代表变量的长度,原代码里的变量a和变量cat长度分别为1和3
二、对象的反序列化和序列化
private
当遇到用private对变量命名时:
上面的例子中 name 本来应该是4位 ,但到了上面却变成了10位 ,我们看到name前面有两个空字节方框 还有一个user ,当用private对变量命名时,会在前面自动加上两个空字节和一个类名
protected
当遇到用protected对变量命名时name会变成7位,另个空字节中间加了一个*
这里值得注意的点是低版本php,我们在构造序列化时如果不加这些标识是会报错的,它本来是private变量我们把它当成public变量,会报错,但在7.2以上版本的php中它不会报错,如果没有加标识符 它也不会报错,就自动变成了public变量
三、__destruct和__wakeup
假设我们有条代码最终会执行 system($a->b)
我们只需要在序列化销毁的时候(__destruct )构造b=‘ls’
那么最终的会执行 system('ls')
四、php反序列化漏洞
上面是最简单的一个能造成php反序列化的一个点,下面看一个列子:
<?phpclass Fl