serialize(); 将对象序列化成字符串
unserialize(); 将字符串反序列化回对象
- class Stu{
- public $name;
- public $age;
- public $sex;
- public $score;
- }
- $stu1 = new Stu();
- $stu1->name = "zs";
- $stu1->age = 22;
- $stu1->sex = true;
- var_dump($stu1);
- echo "
"; - echo serialize($stu1);
-
字符串转换成对象
O:object
- 以 __ 开头的函数,是PHP 中的魔术方法。
-
- 类中的魔术方法,在特定情况下会自动调用。即使魔术方法在类中没有被定义,也是真实存在的。
-
- __construct() 在创建对象时自动调用
-
- __destruct() 在销毁对象时自动调用
-
- __wakeup() unserialize()时会自动调用这个函数
-
- __sleep() serialize()时会自动调用这个函数
可能会有小bug,问题不大
漏洞逻辑
当执行反序列化语句 $stu1 = unserialize($stu1); 时,系统会自动调用 stu() 类中的 __wakeup() 方法,__wakeup() 方法调用函数a(),函数 a() 调用函数 b(),函数 b() 接收传参,执行系统命令
- <?php
- // 定义函数 a()
- function a(){
- // 调用函数 b()
- b();
- }
- // 定义函数 b()
- function b(){
- // 方法一:
- // 如果参数 cmd 的值为 zs 则执行 system 打开计算器
- // if(@$_GET['cmd']=='zs'){
- // system("calc");
- // }
- // 方法二:可以执行其他系统命令
- // 如果参数 cmd 的值为 calc 则打开计算器
- $cmd=$_GET['cmd'];
- @system($cmd);
- }
- // 创建 stu 类
- class Stu{
- // 定义属性
- public $name;
- public $age;
- public $sex;
- public $score;
- // 定义方法,当执行 unserialize() 反序列化函数时自动调用 __wakeup() 方法
- public function __wakeup(){
- a();
- }
- }
-
- // 创建对象
- $stu1 = new Stu();
- // 对象赋值
- $stu1->name = "zs";
- $stu1->age = 22;
- $stu1->sex = true;
- // var_dump($stu1);
- // 序列化
- $stu1 = serialize($stu1);
- // var_dump($stu1);
-
- // 反序列化
- echo "
"; - $stu1 = unserialize($stu1);
- // var_dump($stu1);
-
- ?>
-
验证
