unserialize反序列化漏洞

发布于 2022-03-16  708 次阅读



序列化

序列化 (serialize)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。【将状态信息保存为字符串】

说人话就是把当前的状态保存下来 (游戏的存档)

反序列化

序列化就是将对象的状态信息转为字符串储存起来,那么反序列化就是再将这个状态信息拿出来使用。(重新再转化为对象或者其他的)【将字符串转化为状态信息】

说人话就是通过保存下来的信息恢复到当初的状态 (游戏的读档)

注意:序列化和反序列化也是有主体 - Class 类 (A类的序列化内容不能给B类用)

类 -> 是一个较大范围 是一个抽象的概念
方法 -> 函数[类里面的函数]
对象 -> 具体化的对象

类 -> 实例化 -> 对象

> 类和函数一样,都是为了满足某种功能而存在的

PHP魔术方法

魔术方法是php中特有的一种方法,是能够自动触发的函数。

__construct():当对象创建(nwe)时会自动调用。但在unserialize()时是不会自动调用的。(构造函数)__destruct():当对象被销毁时会自动调用。(析构函数)__wakeup() :如前所提,unserialize()时会被调用
__wakeup //使用unserialize时触发
__sleep() //使用serialize时触发
__toString() //把类当作字符串使用时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发

曾经写过一篇笔记。传送口

靶场实操

靶场源码

image-20220314192638006
e2d4f7dcc43ee1db7f69e76303d0105ca:1:{i:0;O:6:"readme":1:{s:6:"source";s:8:"flag.php";}}
e2d4f7dcc43ee1db7f69e76303d0105ca%3A1%3A%7Bi%3A0%3BO%3A6%3A%22readme%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D
image-20220314193229380
image-20220314193245801

得到flag