PHP序列化

说到PHP反序列化,首先要了解什么是序列化
PHP里面有关序列化的两个函数:
serialize:序列化 :把一个对象转成字符串形式, 可以用于保存
unserialize: 反序列化:把serialize序列化后的字符串变成一个对象
看如下代码

  
class User  
{ 
    public $age = 0;  
    public $name = '';  
    public function PrintData()  
    {  
        echo 'User ' . $this->name . ' is ' . $this->age  
             . ' years old. 
'
; } } $usr = new User(); $usr->age = 20; $usr->name = 'John'; $usr->PrintData(); echo serialize($usr); ?>

先运行一下代码
在这里插入图片描述
输出了User这个类序列化后的字符
下面说下这个序列化的字母的意思
O:类的缩写
4:类名User的长度为4
User:类名
2:两个成员变量
s :成员变量的类型string
3:age的长度为三
age:变量的名字
i:成员变量的类型int
20:为成员变量赋的值

后面的部分以此类推

首先了解一下php中的魔术方法:
php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。
这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。
为了更好的理解magic方法是如何工作的,在2.php中增加了三个magic方法,__construct, __destruct和__toString。
可以看出,__construct在对象创建时调用,__destruct在php脚本结束时调用,__toString在对象被当作一个字符串使用时调用。

__construct   当一个对象创建时被调用,
__destruct   当一个对象销毁时被调用,
__toString   当一个对象被当作一个字符串被调用。
__wakeup()   使用unserialize时触发
__sleep()    使用serialize时触发
__destruct()    对象被销毁时触发
__call()    在对象上下文中调用不可访问的方法时触发
__callStatic()    在静态上下文中调用不可访问的方法时触发
__get()    用于从不可访问的属性读取数据
__set()    用于将数据写入不可访问的属性
__isset()    在不可访问的属性上调用isset()empty()触发
__unset()     在不可访问的属性上使用unset()时触发
__toString()    把类当作字符串使用时触发,返回值需要为字符串
__invoke()   当脚本尝试将对象调用为函数时触发

PHP反序列化漏洞
PHP反序列化漏洞又称PHP对象注入,是因为程序对输入数据处理不当导致的
一、__wakeup( )绕过

(CVE-2016-7124)

反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。
影响版本:
PHP序列化_第1张图片
xctf上的一道简单的反序列化题构造?code=O:4:"xctf":9:{s:4:"flag";s:3:"111";}
就得到flag了
PHP序列化_第2张图片
未完待续。。。。。。。

你可能感兴趣的:(PHP序列化)