首页 > 编程语言 >PHP序列化与反序列化

PHP序列化与反序列化

时间:2023-06-27 21:25:07浏览次数:45  
标签:PHP 对象 调用 字符串 格式 序列化

PHP反序列化漏洞

序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令。

序列化与反序列化

seriallization 序列化:将对象转化为便于传输的格式,常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串。

deseriallization 反序列化: 将序列化的数据恢复为对象的过程

序列化的需求:

以图书管理系统为例,

针对不同的老师,学生,有不同的权限,学生登记学号借书,原本可以借三本书,加入某些社团后,可以加到借五本书,不同的身份又有不同的权限

假设只有两种身份:1、学生;2、加入社团的学生;

学生加入社团后,需要借书,后台代码需要给加入社团的学生戴上一个标识,增加权限;后期的维护,如果学生有一些其他的操作,像退出了社团之类的,那需要把证明这个人身份的代码拿出来,找到证明他社团身份的代码后删掉,这只是单个人的管理,明显不合理。

以这个系统为例,放在PHP中需要创建数组来保存一个人的信息,放在其他的编程语言里,一个数组不能存放不同类型,由此需要类和对象

序列化

对象转换成字符串

方便传输

PHP反序列化

serialize(); 将对象序列化成字符串

unserialize(); 将字符串反序列化回对象

类与对象与序列化

往往通过一个对象来标识某一个人的身份

image

image

个人信息用数组格式保存的话,过于繁琐,不适合用来传输数据;对象更适合用来表示某一个人或事物,数据在互联网传输的时候会把对象的格式打乱。

为了方便数据在网络上传输,提出了一种新的格式,可以把代码或一些对格式要求特别严格的数据,转换为一种通用的数据

image

查看序列化后的数据格式

image

反序列化漏洞点:将数据反序列化出来后,无论对数据进行什么操作,都只是对当前的对象进行的操作,只能根据类内限制有的内容进行操作,如果类内没有漏洞的话,即使能改序列化的字符串,危害也不大;但是如果类内有存在一些恶意的东西的话,如PHP内的能够在特定情况下自动调用的一些魔术方法{__construct() 在创建对象时自动调用;__destruct() 在销毁对象时自动调用;__wakeup() unserialize()时会自动调用这个函数;__sleep() serialize()时会自动调用这个函数}就可能发生一些意想不到的事情。

魔术方法的作用:为了方便程序的开发,提前定义一些函数,如创建对象后预定义一些初始化信息。

举例:__sleep函数在没有被调用的时候自动进行了调用

image

PHP魔术方法调用

image

image

所以反序列化漏洞没有黑盒挖出来的,往往是通过代码审计出来的。

shiro漏洞:

shiro作为一个登录框,公司用到登录框的地方比较多,shiro框架序列化后的字符串使用对称加密算法加密,如果密钥泄露的话,信息就会泄露,但是存在默认的密钥,官方提供了默认密钥,运维人员在使用的时候如果疏忽没有修改默认密钥,攻击者可以尝试默认密钥获取信息

链式调用:

在正常的PHP框架中

image

序列化和反序列化本身没有问题,但是在执行序列化和反序列化的过程中,往往为了使格式更加美观,或者提前给数据进行了过滤处理,定义了大量代码,这些代码最终造成了恶意函数的执行

修改序列化后的数据目的:

为了满足一定的条件以后实现链式调用

标签:PHP,对象,调用,字符串,格式,序列化
From: https://www.cnblogs.com/2210z/p/17509933.html

相关文章

  • PHP 建站推荐十个免费的CMS内容管理系统
    个人想建站?就在下面10个选吧。选好一个,安心做内容就行了。这是sun的体会。选择哪个CMS并不重要,除了对搜索引擎的亲好外,个人的使用操作习惯和对所选CMS系统的熟悉程度有很大关系。这里为需要建站但又徘徊的朋友介绍10个免费PHP+MySql平台下的CMS内容管理系统,可能会对你的选择有指导......
  • PHP语言对接抖音快手小红书视频/图片去水印API接口的案例
    这篇文章主要介绍了PHP语言对接抖音快手小红书视频/图片去水印API接口的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。以下为PHP语言调用去水印接口的示例,展示GET请求方式的调用方式。示例代码中用到的Uid和Toke......
  • PHP代码加密实战过程 Swoole Loader
    帮一个客户处理一个小程序bug修复,前面不知道客户是直接购买一个倒闭的公司产品,还是破解版本的。其中一些核心工具类代码进行了加密,通过排查就找到了SwooleCompiler 今天演示下如何进行代码加密:大致步骤如下:注册 SwooleCompiler 账号地址:Swoole-Compiler-最佳PHP......
  • 代购源码,淘宝代购系统源码,代购程序,代购系统源码PHP前端源码参数说明
    代购业务场景:代购业务近年兴起的一种购物模式,是帮国外客户购买中国商品。主要通过外贸代购模式,把淘宝、天猫等电商平台的全站商品通过API接入到你的网站上,瞬间就可以架设一个有数亿产品的大型网上商城,而且可以把这些中文的商品全部自动翻译成各国语言,能让国外客户看懂,直接在网站......
  • PHP 基础知识
    目录PHP基础 2PHP代码标记 2PHP注释 2PHP语句分隔符 2PHP变量 3常量 3数据类型 4流程控制 6文件 7函数 9闭包 11常用系统函数 12错误处理 13错误显示设置 15字符串类型 17字符串相关函数 19数组 21遍历数组 22数组的相关函数 25PHP基础PHP是一种运行在服务器端的脚本语言,可以嵌入......
  • 【web开发】PHP其他常用字符串格式及常用加密函数
    前言前两篇文章中我们介绍了日常开发中常用到的字符串格式化函数,本文接着带大家继续了解PHP其他字符串格式化函数及加密函数,字符串的格式化处理函数还有很多,只要是想得到所需要格式化的字符串,都可以调用PHP中的提供的系统内置函数处理即可,很少需要自己定义字符的格式化处理函......
  • PHP 常量的说明和使用
    常量类似变量,但是常量一旦被定义就无法更改或撤销定义。PHP常量常量是单个值的标识符(名称)。在脚本中无法改变该值。有效的常量名以字符或下划线开头(常量名称前面没有$符号)。注释:与变量不同,常量贯穿整个脚本是自动全局的。设置PHP常量如需设置常量,请使用define()函数-它使......
  • 第四章 PHP创建与解析XML
    demo1.php<?php $_a=5; //单引号 $_string1='Thisis$_aaString!'; //双引号 $_string2="Thisis$_aaString!";// echo$_string1;// echo$_string2; //复杂式,多行,特殊字符,单引号,双引号,变量。 //<<<<aaaa表示字符串开始aaaa;不是字符串的结束 $_str......
  • PHP 多行字符串的赋值方法
    <?php//PHP多行字符串的赋值方法//<<<string里面的string是可以随机其他的标记 $article=<<<string<!DOCTYPEhtml><htmllang="zh-cn"><head><metacharset="UTF-8"><metaname="viewport"content=&......
  • PHP 堆 栈 数据段 代码段 存储的理解
    代码段、数据段、堆栈段,这是一个概念堆、栈、全局区、常量区,这是另一个概念函数代码存放在代码段。声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间。栈:基本数据类型局部变量(这两种甚至可以直接认为一块空间叫a,里面存着8)类的引用(指向堆空间段)堆:new出来的......