反序列化漏洞

目录

1.序列化

2.反序列化

3.反序列化漏洞

4.常见魔法函数

5.反序列化的变换规则


1.序列化

将在内存状态下的对象(内存中不能保存数据,一旦停止数据全部清除),转化成字符串或其他形式写入到临时或持久性存储区,以便保存。

2.反序列化

将从序列化的形成的表示形式中提取数据到内存中,即把有序字符串或字节流恢复为对象的过程。

3.反序列化漏洞

反序列化个过程,会触发一些在类中的魔法函数,使得魔法函数再次被执行。反序列化漏洞之所以发生是在传给unserialize()的参数可控时,用户就可以注入精心构造的数据。当进行反序列化时就可能会触发对象的一些魔术方法,造成代码执行等危害。如下

<?php
class demo {
   private $pv= 'private';
   protected $pt = 'protected'; 
   public $pb= 'public';
   public function _wakeup($pv) {
      $this->pv=$pv;
   }
   public function get_pv(){
      return $this->pv;
   }   #上面是类
}
$object = new demo() ;   #形成一个对像
$object->set_pv ('newprivate') ; 
$data = serialize ($object) ;   //1句     #将缓存中的对象序列化,以便保存
echo $data;                          #输出序列化后形成的字符串
$object_de=unserialize ($data); //2句           #将这个字符串反序列化形成对象
?> 
//serialize()和unserialize()是实现序列化和反序列化的两个函数

$object_de=unserialize ($data); 这个反序列化的过程会触发一些类中的魔法函数。在上面的代码是

 public function _wakeup($pv) {
      $this->pv=$pv;
   }
   

只要对$data进行不同的赋值,那么进行换序列化后的数据就是我们空的的,例如我们控制反序列化后对象中$pv有特殊含有,那么这个pv被带入到public function _wakeup($pv)函数中就是实现特别的功能,如可以让信息泄露。

4.常见魔法函数

这些魔法函数必须定义在类的顶层

__sleep()	 	//使用serialize()时触发 
__destruct() 	//对象被销毁时触发,在脚本终止或对象引用计数为0时调用,通常会执行数据清除就或连接断开操作 
__call() 		//在对象上下文中调用不可访问的方法时触发 ,通常用于错误处理,防止脚本因为调用错误而终止执行
__callStatic() 	//在静态上下文中调用不可访问的方法时触发 
__get() 		//用于从不可访问的属性读取数据,通常用于设置和获取对象私有属性
__set() 		//用于将数据写入不可访问的属性,通常用于设置和获取对象私有属性
__isset() 		//在不可访问的属性上调用isset()或empty()触发 
__unset() 		//在不可访问的属性上使用unset()时触发 
__invoke() 		//当脚本尝试将对象调用为函数时触发
__clone()       //当把一个对象赋给另一个对象时自动调用
__wakeup()		//unserialize函数会检查是否存在wakeup方法,如果存在则先调用wakeup方法,做一些必要的初始化连数据库等操作
__construct() 	//PHP5允许在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法
__destruct()	  //PHP5引入析构函数的概念,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
__toString()	  //用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误

5.反序列化的变换规则

O:4:"demo":3:{s:8:"demopv";s:10:"newprivate";s:5:"*pt";s:9:"protected";s:2:"pb";s:6:"public";}
//O:表示这是一个对象
//4:对象名占4个字符
//"demo":对象名
//3:对象有三个属性
//一个s代表一个属性
//数字代表内容长度
//引号内容表示属性内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值