千家信息网

PHP反序列化的原理

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"PHP反序列化的原理",在日常操作中,相信很多人在PHP反序列化的原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PHP反序列化的原理"的疑惑有所帮
千家信息网最后更新 2026年10月31日PHP反序列化的原理

这篇文章主要介绍"PHP反序列化的原理",在日常操作中,相信很多人在PHP反序列化的原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PHP反序列化的原理"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

首先看一张图

PHP反序列化 原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象
反序列化分为有类和无类
我们先来看序列化数据也就是序列化字符串
先上图

我们看看上面那张图
s:8:"chixigua"s
s代表字符串,8代表长度"chixigua"代表值
在无类中他调用了unserialize()将字符串还原为对象没有进行过滤我们可以观察其代码而构造payload进行sql注入,代码执行,getshell,目录遍历等等,主要看他的代码,他的代码有sql语句接收序列化字符串这样会产生反序列化sql注入其他漏洞也是如此,主要看代码来辨别危害
反序列化也是我们面试的必考题,所以还是很重要的
在思维导图我们提到有类在有类的情况我们会设计到各种魔术方法
我们首先来介绍一下各种魔术方法
__construct()
具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
__destruct()
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
也就是说进行反序列化时,完成的就是从字符串创建新对象的过程,刚开始就会调用__construct(),而对象被销毁时,例如程序退出时,就会调用__destruct()
触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:
参考:官方文档魔法方法部分
__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
接下来我们先看一段魔术方法php代码

首先先分析一下代码创建了一个类
里面写了3个魔术方法
我们看结果首先输出了'调用了构造函数',为什么在魔术方法里的这串代码执行了呢?这是因为触发了他的魔术方法,因为我们将一个类进行了实体化,也就是新建了一个对象,触发了__construct()方法里的代码,接下来又输出了'调用了苏醒函数'在反序列话函数执行的时候会先检测__wakeup()方法有该方法这会先执行这个方法里的代码

详细参考这张图

可以玩玩去年网鼎的青龙杯里的反序列化题我把解题思路写下来
网鼎杯青龙组php反序列化题

首先ctf命名及代码函数unserialize判断反序列化知识点第一:获取flag存储flag.php第二:两个魔术方法__destruct __construct第三:传输str参数数据后触发destruct,存在is_valid过滤第四:__destruct中会调用process,其中op=1写入及op=2读取第五:涉及对象FileHandler,变量op及filename,content,进行构造输出

**

涉及:反序列化魔术方法调用,弱类型绕过,ascii绕过使用该类对flag进行读取,这里面能利用的只有__destruct函数(析构函数)。__destruct函数对$this->op进行了===判断并内容在2字符串时会赋值为1,process函数中使用==对$this->op进行判断(为2的情况下才能读取内容),因此这里存在弱类型比较,可以使用数字2或字符串' 2'绕过判断。is_valid函数还对序列化字符串进行了校验,因为成员被protected修饰,因此序列化字符串中会出现ascii为0的字符。经过测试,在PHP7.2+的环境中,使用public修饰成员并序列化,反序列化后成员也会被public覆盖修饰。个人博客

到此,关于"PHP反序列化的原理"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

序列 方法 对象 函数 字符 代码 字符串 魔术 原理 属性 数据 学习 接下来 也就是 代表 过程 输出 上下 上下文 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网龙头 金融科技创新监管互联网金融 麻工互联网科技 极限挑战互联网科技 唐信互联网科技 大连 融贸通互联网科技 互联网科技网站 科技类的互联网平台 成都玖崟互联网科技有限公司乐商圈怎么样 哈尔滨新华互联网科技学院 剑昆互联网络科技有限公司临桂 移动互联网科技股 和信科技工业互联网 河南住房之家互联网科技 江苏苏星互联网科技有限公司 半导体是互联网高科技吗 安徽零酒互联网科技有限公司 科技互联网专业工作会议发言稿 优雇互联网科技有限公司 互联网企业和网络科技有限公司 互联网科技企业 猫创互联网科技 温州喔噻互联网科技有限公司 互联网公司科技股 企晟互联网信息科技有限公司 合肥互联网科技公司公章图片 富国互联网科技002692 广州燕处互联网科技有限公司 易租星互联网科技有限公司 互联网 科技节活动 微视频大赛
0