博客地址: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在前呢
当代码被执行的时候是从上往下的ÿ