1.为什么要反序列化:
将一个对象转换为字节数据,字节数据可以在WEB端传输,服务端接收后对其反序列化,以还原对象的状态。
简单来说就是序列化是为了让服务端接收对象,然后再将其反序列化为原来的状态。
2.主要函数:
`序列化:serialize`
反序列化:unserialize
3.可序列化的·数据类型
a-array
b-boolean
d-double
i-integer
s-non-escaped binary string
S-escaped binary string
c-custom object
o-class
n-null
4.简单的序列化展示
<?php
echo serialize('admin');
?>
//输出:s:5:"admin";
其中:s代表数据类型,5代表数据长度,引号内的·即为序列化的字符串,由此可见序列化后的字符每一个都有其特殊的含义。为此我们展开以下内容:序列化一个对象
<?php
class Xino{
public $name = "wuhu";
}
echo serialize(new xino);
?>
//输出:O:4:"Xino":1:{s:4:"name";s:4:"wuhu";}
//O对应CLASS ,4为CLASSNAME名字,1代表成员个数 ,括号对的即为成员的内容
5.私有属性被保护属性静态属性序列化后的特征
A.
private(私有属性)
举上面的例子,我们只修改属性为private
<?php
class Xino{
private $name = "wuhu";
}
echo serialize(new xino);
?>
//输出:O:4:"Xino":1:{s:10:"Xinoname";s:4:"wuhu";}
与上面不同之处在于成员变量名字前面加了一个CLASSNAME
但看到10,我们发现有两个不可见字符,对其urlencode
B。被保护属性
protected同样的:
<?php
class Xino{
protected $name = "wuhu";
}
echo serialize(new xino);
?>
//输出:O:4:"Xino":1:{s:7:"*name";s:4:"wuhu";}
//同样urlencode
//%00*%00
C。静态属性
static:
<?php
class Xino{
static $name = "wuhu";
}
echo serialize(new xino);
?>
//输出:
//O:4:"Xino":0:{}
静态属性比较特殊,序列化后没有任何属性,因为静态成员变量不可以被序列化和反序列化
D.总结
我们可以通过函数反序列化成员变量,但是不能反序列化对象的方法。
5.反序列化(unserialize)
说完序列化的基础,我们再看反序列化
<?php
$a = "xino";
$b = serialize($a);
var_dump(unserialize($b));
?>
//输出:string(4) "xino"
由此可见反序列化将序列化的数据还原了,对此,我们发现可以构造poc链来进行反序列化,从而达到攻击。
明天讲一下魔术方法