前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP中对象的序列化和反序列化

PHP中对象的序列化和反序列化

作者头像
宣言言言
发布于 2019-12-18 08:41:07
发布于 2019-12-18 08:41:07
1.4K00
代码可运行
举报
文章被收录于专栏:宣言(Siam)博客宣言(Siam)博客
运行总次数:0
代码可运行

php的serialize函数和unserialize函数

serialize() 返回字符串,可以存储于任何地方。

serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。

这有利于存储或传递 PHP 的值,同时不丢失其类型和结构

在需要恢复的地方使用unserialize()函数即可

php类魔术方法中的__sleep和__wakeup

在众多的php类魔术方法中(另一篇文章有简单介绍 PHP类,魔术方法),有两个是跟序列化有关的。

__sleep() 在对象被调用serialize时隐式唤起,可以返回需要参与序列化的属性数组 __wakeup() 当调用unserialize恢复对象的时候,会被隐式唤起,可以做一些初始化工作

简单实战

假设,我们在cli模式的php程序,会根据调用命令解析到不同的类执行。

该类拥有以下3个属性,其中isDev,isCli应该根据运行入口、配置文件等状态而决定。

所以当我们在序列化该类的对象时,不应该包含这两个属性,而应该在wakeup的时候,动态取配置文件的值然后设置进去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Command{
    public $name;  // 命令名
    public $isDev; // 是否为开发环境
    public $isCli; // 是否为命令行运行

    public function run()
    {
        if ($this->isDev){
            echo "debug\n";
        }
        if (!$this->cli){
            echo "only cli\n";
        }
    }

    // 设置规定参与序列化的属性
    public function __sleep()
    {
        return ['name'];    
    }

    public function __wakeup()
    {
        // 从配置文件读取
        $config = file_get_content("siam.conf");
        $this->isDev = $config['dev'] ?? true;
        // 运行环境判断
        $this->isCli = true;
    }
}

实例化对象 并序列化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$class = new Command();
$class->isDev = true;
$class->isCli = true;
$str =  serialize($class);

var_dump(unserialize($str));
// 得到以下对象,isDev不会序列化原始的对象属性,而是通过wakeup重新定义
// object(Command)#3 (3) { ["name"]=> NULL ["isDev"]=> bool(false) ["isCli"]=> bool(true) }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.08.12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP反序列化漏洞
魔术方法是PHP面向对象中特有的特性。它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法)
Andromeda
2022/10/27
1K0
PHP反序列化漏洞
详解php反序列化
“所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。”
用户8824291
2021/07/13
7800
PHP的反序列化和POP链利用
POP面向属性编程,常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的“gadget”找到漏洞点。
Andromeda
2023/10/21
1.1K0
PHP的反序列化和POP链利用
从CTF中学习PHP反序列化的各种利用方式
为了方便数据存储,php通常会将数组等数据转换为序列化形式存储,那么什么是序列化呢?序列化其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。
Ms08067安全实验室
2022/09/26
3.4K0
web安全 -- php反序列化漏洞
序列化是将对象转换为字节流,在序列化期间,对象将当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象状态,重新创建该对象,序列化的目的是便于对象在内存、文件、数据库或者网络之间传递。
Gh0st1nTheShel
2022/01/24
8750
php反序列化漏洞简单总结
​ 这其实是为了解决 PHP 对象传递的一个问题,因为 PHP 文件在执行结束以后就会将对象销毁,那么如果下次有一个页面恰好要用到刚刚销毁的对象就会束手无策,总不能你永远不让它销毁,等着你吧,于是人们就想出了一种能长久保存对象的方法,这就是 PHP 的序列化,那当我们下次要用的时候只要反序列化一下就 ok 啦。
pankas
2022/08/10
7680
php反序列化漏洞简单总结
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
__sleep 与 __wakeup 序列化: 将一个对象转化成字符串 反序列化:将一个字符串转换成对象
Baige
2022/03/22
1.3K0
CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)
PHP反序列化漏洞说明
PHP程序为了保存和转储对象,提供了序列化的方法,序列化是为了在程序运行的过程中对对象进行转储而产生的。
Ms08067安全实验室
2020/01/02
7840
CTFshow刷题日记-WEB-反序列化(web254-278)PHP反序列化漏洞、pop链构造、PHP框架反序列化漏洞、python反序列化漏洞
只要 get 传参反序列化后的字符串有 ctfshow_i_love_36D 就可以
全栈程序员站长
2022/09/14
2K0
CTFshow刷题日记-WEB-反序列化(web254-278)PHP反序列化漏洞、pop链构造、PHP框架反序列化漏洞、python反序列化漏洞
初探序列化与反序列化
在写程序尤其是写网站的时候,经常会构造类,并且有时候会将实例化的类作为变量进行传输。
偏有宸机
2020/11/04
8340
初探序列化与反序列化
CTF竞赛 | PHP反序列化基础
通过序列化与反序列化我们可以很方便的在PHP中传递对象,下面小编给大家介绍反序列化的原理和一些常见的利用方式。
安全小王子
2021/02/24
1.3K0
CTF竞赛 | PHP反序列化基础
PHP反序列化漏洞
  在反序列化的过程中自动触发了某些魔术方法。未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致XSS、代码执行、文件写入、文件读取等不可控后果。
LuckySec
2022/11/02
5840
PHP反序列化漏洞
PHP反序列化深入理解
在PHP中右serialize()和unserialize()两个函数,php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
V站CEO-西顾
2018/06/25
9731
反序列化漏洞理论实战详解
反序列化漏洞是基于序列化和反序列化的操作,在反序列化——unserialize()时存在用户可控参数,而反序列化会自动调用一些魔术方法,如果魔术方法内存在一些敏感操作例如eval()函数,而且参数是通过反序列化产生的,那么用户就可以通过改变参数来执行敏感操作,这就是反序列化漏洞。
litbaizhang
2021/03/11
2.9K1
反序列化漏洞理论实战详解
php反序列化漏洞
类的概念:类是具有相同属性和操作的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述, 其内部包括属性和操作两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位, 它应该有一个类名并包括属性说明和操作说明两个主要部分。 简单点说类就是某一物件的模型 类的关键字 class 示例
宸寰客
2020/09/01
7750
php反序列化漏洞
PHP 魔术方法、序列化与对象复制
__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、 __wakeup()、__toString()、__invoke()、__set_state()、__clone() 和 __debugInfo()。
学院君
2020/07/21
1.9K0
PHP 魔术方法、序列化与对象复制
几种反序列化漏洞
xxe.xml 和 xxe.dtd 构造见我的 XXE 文章,XXE XML外部实体注入(https://www.cnblogs.com/Night-Tac/articles/16931091.html)
红队蓝军
2023/09/13
4990
CTFshow之web入门反序列化
PHP反序列化实际上已经开始是Web安全的进阶操作了,虽然在这个时代Web选手上分极其困难,PHP反序列化已经成为了基础…..
十二惊惶
2024/02/28
3860
PHP反序列化漏洞
序列化就是将一个对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。
用户2700375
2022/06/09
5190
PHP反序列化漏洞
经验分享 | PHP-反序列化(超细的)
ps:很多小伙伴都催更了,先跟朋友们道个歉,摸鱼太久了,哈哈哈,今天就整理一下大家遇到比较多的php反序列化,经常在ctf中看到,还有就是审计的时候也会需要,这里我就细讲一下,我建议大家自己复制源码去搭建运行,只有自己去好好理解,好好利用了才更好的把握,才能更快的找出pop链子,首先呢反序列化最重要的就是那些常见的魔法函数,很多小伙伴都不知道这个魔法函数是干啥的,今天我就一个一个,细致的讲讲一些常见的魔法函数,以及最后拿一些ctf题举例,刚开始需要耐心的看,谢谢大家的关注,我会更努力的。
F12sec
2022/09/29
2.3K0
经验分享 | PHP-反序列化(超细的)
相关推荐
PHP反序列化漏洞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验