序列化及其反序列化

序列化是将对象压缩到一个字符串的方法,便于在网络中传输。

Success is the sum of small efforts,repeated day in and day out.

David LevithanWide Awake

序列化概念

序列化时将一个对象压缩成一个字符串的方法,对象是类的实例化。 Private表示私有属性;Protected表示受保护的属性;Public表示公有属性。

参数说明:

1:表明这是一个对象

2:表明这个对象名称长度为8

3:对象名称,和对象名称长度要符合

4:对象具有3个属性

大括号中为对象属性,格式如下:

S:属性名称长度:属性名称;S:属性值长度:属性值



注意:私有属性为将属性名称变为—类名+属性名

也就是说通过判断属性名称和属性名称长度可以判断该属性是否为私有属性,如果不一致就为私有属性

不同类型对象进行序列化的结果如下:

值为字符串的变量:s:字符串长度:字符串

值为整数的变量:i:整数值

序列化方法

__construct() //创建对象是触发
__destory() //对象别销毁时触发
__sleep() //用于删除不必要属性,返回需要序列化存储的属性---该方法会在serialize序列化函数执行前执行------------可以指定序列化时返回对象中什么属性
__wakeup() //预先准备资源,用于反序列化操作中重新建立数据库或执行其他初始化操作。
__toString() //当将类作为字符串显示时如何回应,例如echo ‘hello’.$对象名----可以自定义设置对象别当成字符串时如何显示

反序列化

将序列化的类字符串重新生成类

A.绕过__wakeup方法

CVE-2016-7124漏洞,当序列化字符串中表示对象属性个数的值大于正式的属性个数时会跳过__wakeup的执行。
构造序列化对象:O:5:"SoFun":1:{S:7:"\00*\00file";s:8:"flag.php";}
绕过__wakeup:O:5:"SoFun":2:{S:7:"\00*\00file";s:8:"flag.php";}
因为file是protect属性,所以需要加上\00*\00,再base64编码

B.Sessions反序列化漏洞

PHP在session存取时会有一个序列化和反序列化的过程。具有以下三种序列化引擎:
1.php_binary引擎-----将session序列化为“属性名+属性类型(此处为字符串s):属性值长度:属性值”
2.php引擎-----序列化为“属性名 | 属性类型:属性值长度:属性值”
3.php_serialize引擎-----直接使用普通序列化的方式