二、PHP序列化与反序列化

一、序列化与反序列化

1.基础

解释:序列化与反序列化的好处是可以轻松地存储和传输数据,使程序更具维护性

  1. 序列化(串行化):是将变量转换为可保存或传输的字符串的过程;
  2. 反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用;

例子:

class Dino{
    public $name = 'tom';
    public $flag = 'flag';
}
$a = new Dino();
$a = serialize($a);
print_r($a);//O:4:"Dino":2:{s:4:"name";s:3:"tom";s:4:"flag";s:4:"flag";}
//O:4:"Dino":2
//O:对象
//4:对象长度
//Dino:对象名
//2:属性个数

//s:4:"name";
//s:字符串类型
//4:该变量名长度
//name:变量名

//s:3:"tom";
//s:字符串类型
//3:变量对应内容长度
//name:变量对应内容

$b = array([1,2,3]);
$b = serialize($b);
echo $b;//a:1:{i:0;a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}}
$c=unserialize($b);
print_r($c);//输出如下
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)

2.反序列化中常见的魔术方法

__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()empty()时调用
__unset(),当对不可访问属性调用unset()时被调用
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息

二、序列化与反序列化漏洞

1. __wakeup绕过

解释:在PHP5 < 5.6.25、​ PHP7 < 7.0.10当中存在当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup 的执行

class Dino{
    public $name = 'tom';
    public $flag = 'flag';
    public  function __wakeup(){
        echo '__wakeup go';
    }
}
$a = new Dino();
$a = serialize($a);
$a = unserialize($a);//正常反序列化__wakeup被执行打印 '__wakeup go'
echo $a->name;

$b = unserialize('O:4:"Dino":5:{s:4:"name";s:3:"tom";s:4:"flag";s:4:"flag";}');
//上面此序列化利用漏洞导致__wakeup没有执行

你可能感兴趣的:(#,PHP安全,php,android,开发语言)