反序列化原理与实例讲解

博客地址:soliym.top

序列化与反序列化

序列化:把变量转换为课存储或课传输文本结构的过程

反序列化:在合适的时候把序列化后的文本结构转化为原来的变量

将变量对象持久化操作,让其离开内存保存在硬盘中,等到需要的时候,在从硬盘中加载变量对象到内存中,这样就可以大大节约内存地址

意义:序列化和反序列的结合可以轻松的存储和传输数据,我们可以把对象序列化为不同的格式,json、XML、二进制、SOAP等

使用序列化

1、将内存中的类写入文件或者数据库中

2、递归保存对象引用的每一个对象数据

3、分布式对象

4、同一对文件、对象、数据保存和传输

PHP的序列化和反序列化

PHP在序列化的函数为Serialize,将对象转换为字符串保存对象中的变量及变量值

php序列化一个对象会保存类型,对象的所有变量及值,但是不会保存方法

PHP的反序列化函数为unseralize,将序列化后的字符串转换为对象

PHP的魔法函数

__construct() //当⼀个对象创建时被调⽤

__destruct() //当对象被销毁是触发

__wakeup() //使⽤unserialize触发

__sleep() //使⽤serialize触发

__toString() //把类当做字符串使⽤时触发

__call() //在对象上下⽂中调⽤不可访问的⽅法时触发

__callStatic //在静态上下⽂中调⽤不可访问的⽅法时触发

__get() //⽤于从不可访问的属性读取数据

__set() //⽤于将数据写⼊不可访问的属性

__isset() //在不可访问的属性上调⽤isset()或者empty()触发

__unset() //在不可访问的属性上使⽤unset()是触发

__invoke() //当脚本尝试将对象⽤为函数时触发

由于序列化中不会传递方法,对象中的自定义函数我们没有办法直接利用,但是魔法函数是可以自动执行的,当类中调用了魔法函数时,魔法函数又自动触发执行的特点

反序列化漏洞实验

PHP反序列化漏洞,是在我们使⽤ unserialize() 进⾏反序列化的时候,如果反序列化对象中存在⼀

些我们可以利⽤的魔法函数且传⼊的变量可控,那么就可能触发这个魔法函数,来执⾏我们想要的过

程。

实验一:

搭建PHP页面

<?php 
class dome 
{ 
public $a='dome'; 
function __destruct() 
{ 
echo $this->a; 
echo '</br>'; 
} 
} 
$ob= new dome(); 
echo serialize($ob).'</br>'; 
$test= $_GET['id'] ; 
unserialize($test); 
?>

通过浏览器访问该页面

在url中构造注入参数

http://192.168.31.9/demo.php?id=O:4:%22dome%22:1:{s:1:%22a%22;s:4:%221234%22;}

结果:页面会显示我们输入的参数“1234”

但是有一个问题是?为什么输出的顺序的1234在前呢

当代码被执行的时候是从上往下的ÿ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值