反序列化渗透与防御之PHP

目录

一.PHP的类与对象

1.类

2.对象

二.序列化与反序列化

1.序列化

1.1什么是序列化

1.2序列化格式

2.反序列化

三.Magic函数

1.常用的Magic函数

2.__sleep()函数的补充说明

四.反序列化漏洞利用

1.参数可控

2.存在Magic方法

3.涉及成员变量

五.__wakeup()函数的绕过

六.反序列化漏洞防御


一.PHP的类与对象

在讲序列化与反序列化之前,我们可以先了解一下PHP的类与对象。(熟悉PHP的可以直接跳过)

1.类

定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

<?php
    class Person{
/*成员变量*/
        public $name;//公有
        var $weight;//如果用var来定义,则默认为公有
        private $age;//私有
        protected $sex;//受保护
/*成员函数*/
        //构造函数:用来在创建对象时初始化对象(与new运算符搭配使用)
        function __construct($n,$w,$a,$s){
            $this->name=$n;
            $this->weight=$w;
            $this->age=$a;
            $this->sex=$s;
        }
        //析构函数:当对象结束其生命周期时,系统会自动调用
        function __destruct(){
            print "销毁";
        }
        function SetAge($a){
            $this->age=$a;
        }
        function getAge(){
            echo $this->age;
        }
}
?>

2.对象

是类的实例。

/*对象的创建*/
$person=new Person("张三",60,20,"男");//用new运算符来实例化该类的对象
/*调用成员函数*/
$person->setAge(18);
$person->getAge();

二.序列化与反序列化

1.序列化

1.1什么是序列化

序列化是将对象的状态信息转化为可以存储或传输的形式的过程。简单讲,就是将数据转化成一种可逆的数据结构。

序列化的作用就是便于传输对象和用作缓存。

在PHP中,使用serialize()函数进行序列化。

1.2序列化格式

(以下使用的对象均为上述的例子)

<?php
$str1="abcd";//字符型
$str2=20;//整型
$str3=true;//boolean
$str4=null;//null
$str5=array("index1"=>"value1","index2"=>"value2");//数组
$str6=new Person("张三",60,20,"男");//对象
/*序列化*/
$str11=serialize($str1);
$str22=serialize($str2);
$str33=serialize($str3);
$str44=serialize($str4);
$str55=serialize($str5);
$str66=serialize($str6);
echo $str11."</br>";
echo $str22."</br>";
echo $str33."</br>";
echo $str44."</br>";
echo $str55."</br>";
echo $str66."</br>";
?>

运行结果:

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值