天天看点

从0开始:php反序列化

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链来进行反序列化,从而达到攻击。

明天讲一下魔术方法