php

PHP的序列化和反序列化入门

2023-11-27

serialize()       //将一个对象转换成一个字符串

unserialize()   //将字符串还原成一个对象

通过 序列化 与 反序列化 我们可以很方便的在PHP中进行对象的传递。本质上反序列化是没有危害的。但是如果用户对数据可控那就可以利用反序列化构造payload攻击


<?php

highlight_file(__FILE__);

class sunset{

    public $flag='flag{asdadasd}';

    public $name='makabaka';

    public $age='18';

}

 

$ctfer=new sunset(); //实例化一个对象

echo serialize($ctfer);

?>

返回结果

O:6:"sunset":3:{s:4:"flag";s:14:"flag{asdadasd}";s:4:"name";s:8:"makabaka";s:3:"age";s:2:"18";}


O代表对象,这里是序列化的一个对象,要序列化数组的就用A

6表示的是类的长度

sunset表示对是类名

3表示类里面有3个属性也称为变量

s表示字符串的长度这里的flag表示属性

比如s:4:"flag" 这里表示的是 flag属性名(变量名)为4个字符串长度 字符串 属性长度 属性值


什么是反序列化

这里是把上面序列化之后返回的数据进行反序列化

php序列化和反序列化.png


$str='O:6:"sunset":3:{s:4:"flag";s:14:"flag{asdadasd}";s:4:"name";s:8:"makabaka";s:3:"age";s:2:"18";}';

$a=unserialize($str);

var_dump($a);