PHP序列化和反序列化漏洞学习

news2024/11/23 10:55:21

目录

PHP基础知识:

类的结构:

序列化

反序列化

魔术方法

字符串逃逸


PHP基础知识:

类的结构:

 常见访问权限修饰符:

  • public:公共的,在类的内部、子类中或者类的外部都可以使用,不受限制;
  • protected:受保护的,在类的内部、子类中可以使用,但不能在类的外部使用;
  • private:私有的,只能在类的内部使用,在类的外部或者子类中都无法使用。

访问权限符对变量和函数都有效

序列化

序列化作用:序列化就是将对象的状态信息(属性)转换为可以存储或传输的形式过程。

<?php
$n = NULL;
echo (serialize($n)) . "<br>";  
$i = 123;
echo(serialize($i))."<br>";
$s = "php是世界上最好的语言";
echo (serialize($s)) . "<br>";
$f=12.23;
echo(serialize($f))."<br>";
$a = ["abc", "def", "ghi"];
echo (serialize($a)) . "<br>";
?>

 

<?php
class car{
    public $price=12345.56;
    public $color = "black";
    public $style = "越野";
    function run(){
        echo ("车启动");
    }
}
$o=new car();
echo (serialize($o)) . "<br>";//O:3:"car":3:{s:5:"price";d:12345.56;s:5:"color";s:5:"black";s:5:"style";s:6:"越野";}
?>

O:3:"car":3:{s:5:"price";d:12345.56;s:5:"color";s:5:"black";s:5:"style";s:6:"越野";}

object:类名长度:类名:变量个数:{对每个变量名和变量值进行序列化}

这是上面的public 类型变量进行序列化的格式;对于private类型的是变量序列化时,在变量名前面加一个“空类名空”;protected类型的是加一个“空*空”(这里说的都是对于变量名。与变量值没有关系)

在正常序列化之后这个空是看不出来的,我们可以对其urlencode编码之后可以看到%00就是我们所说的空。

反序列化

反序列化就是将序列化后的参数还原成实例化的对象,经过反序列化后的内容为一个对象。

反序列化生成的对象里的值,由反序列化里的值提供;与原有类预定义的值无关;反序列化不触发类的成员方法;需要调用方法后才能触发。

<?php
class car{
    public $price=12345.56;
    protected $color = "black ";
    private $style = "越野";
    function run(){
        echo ("车启动");
    }
}
$o=new car();
$d = serialize($o);
echo $d. "<br>";
$s = 'O:3:"car":3:{s:5:"price";d:12345.56;s:8:"%00*%00color";s:6:"black ";s:10:"%00car%00style";s:6:"越野";}';
var_dump(unserialize(urldecode($s)));//urldecode就是参数进行url解码
/**
 * vardump就是输出变量的详细信息,包括类型值等等
 */
?>

 反序列化漏洞的成因:反序列化过程中,unserialize()接受的值(字符串)可控;通过更高这个值(字符串),得到所需要的代码,即生成的对象的属性值。

魔术方法

魔术方法就是一个预先定义好的,在特定情况下自动触发的行为方法。

魔术方法前提:魔术方法所在的类(或对象)被调用

  • __construct()函数

这是一个构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法。

  • __destruct函数

这是一个析构函数,在对象的所有引用被删除或者当对象被显示销毁执行的魔术方法。

注意:在实例化对象后,代码运行完全销毁,会触发析构函数__destruct();反序列化得到的是对象,用完之后会销毁,触发析构函数。

  • __sleep()函数

序列化serialize()函数会检查类中是否存在一个魔术方法__sleep()。如果存在,该方法会先被调用,然后执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组;如果该方法未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误。

触发时机:序列化之前

功能:确定要序列化的成员变量

class car{
    public $price=12345.56;
    protected $color = "black ";
    private $style = "越野";
    function run(){
        echo ("车启动");
    }
    public function __sleep(){
        return NULL;
    }
}
$o=new car();
$d = serialize($o);
echo $d. "<br>";

结果:

  • __wakeup()函数

unserialize()会检查是否存在一个__wakeup()方法。如果存在,则会先调用__wakeup()方法,预先准备对象需要的资源。

预先准对象资源,返回void,常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。

  • __toString()函数

这个魔术方法是表达式错误触发

触发时机:把对象当成字符串调用

对于一个new出来的对象,可以使用print_r或者var_dump;如果使用echo或者print只能调用字符串的方式去调用对象,此时就会触发toString()。

  • __invoke()函数

触发时机:把对象当成函数调用

输出语句区别

  • __clone()函数

触发时机:当使用clone关键字拷贝完成一个对象后,新对象会自动调用定义的魔术方法__clone()。

 

  • __isset()函数

触发时机:对不可访问属性使用isset()或empty()时,__isset()会被调用。

参数:传参$arg1

返回值:不存在的成员属性的名称

isset()函数和empty()区别

  • __unset()函数

触发时机:对不可访问或者不存在属性使用unset()时

参数:传参$arg1

返回值:不存在的成员属性的名称

unset()

  • __set()函数

触发时机:给不存在的成员属性赋值

参数:传递$arg1,$arg2

返回值:不存在的成员属性的名称和赋的值

  • __get()函数

触发时机:调用的成员属性不存在

参数:传递$arg1

返回值:不存在的成员属性的名称

  • __call()函数

触发时机:调用一个不存在的方法

参数:2个参数传参$arg1,$arg2

返回值:调用的不存在的方法的名称和参数

  • __callstatic()函数

触发时机:静态调用或调用成员常量时使用的方法不存在

参数:2个参数传参$arg1,$arg2

返回值:调用的不存在的方法的名称和参数

字符串逃逸

属性逃逸:一般在数据先经过一次serialize再经过unserialize,在这个中间反序列化的字符串变多或者变少的时候有可能存在反序列化属性逃逸。

上面我们所说的反序列化的结果是由字符串决定,并不是绝对的,我们要注意下面这种情况。

<?php
class A{
    var $a="A";
    var $b="hanhui";
    var $c = "han";
    var $d = "hui1";
}
echo(serialize(new A()))."<br>";
$b='O:1:"A":2:{s:1:"a";s:1:"A";s:2:"b1";s:6:"hanhui";}';
var_dump(unserialize($b))
?>

 在这种场景下,我们反序列化不仅会把字符串的反序列化,还会包含原类中所有的成员属性;如果字符串中有变量名,则对应的值会按字符串中的,否则会按原对象中的值决定。

原理:字符串逃逸就是在反序列化时候会按照变量个数和字符串个数进行反序列化,所以通过改变这些值从而达到我们的目的。

知识点:

wakeup魔术方法绕过:如果产生__wakeup方法,调用unserialize()方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实属性个数时,则会跳过__wakeup()的执行。

上述漏洞只有在PHP5<5.6.25和 PHP7<7.0.10中。

还有一个就是绕过正则表达式:当类名字符个数不允许是数字时候,在类名字符个数前面加一个+;然后进行url编码。

引用:就是保证两个值的值相同,可以使用$a=&$b。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GO】 K8s 管理系统项目[API部分--Daemonset]

K8s 管理系统项目[API部分–Daemonset] 1. 接口实现 service/dataselector.go // daemonCell type daemonSetCell appsv1.DaemonSetfunc(d daemonSetCell) GetCreation() time.Time {return d.CreationTimestamp.Time }func(d daemonSetCell) GetName() string {return d.Na…

高性能的Java IDE——IntelliJ IDEA v2022.3全新发布

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

怎样在电脑上录制ppt课件?如何录制课件讲解视频

怎样在电脑上录制ppt课件&#xff1f;在当前的环境下&#xff0c;大部分学生都是在家进行上网课&#xff0c;本文就给大家分享几款非常简单实用的录制教学视频的工具。 一、PPT录屏 在windows系统中有个常用软件就是ppt&#xff0c;ppt也能够录屏&#xff0c;只是我们大家都忽…

postgresql数据库流复制

primary和standby在同一服务器的不同目录下。 primary: /var/postgre/data standby: /var/postgre/data1 1. 加账号 (也可以使用postgres账号) [postgresv-vlxsz-devdb01 data]$ psql psql (14.1) Type "help" for help. postgres# create role replica with r…

自动化制药设备中PLC如何进行远程监控?有何应用场景

随着科学技术水平的不断提高&#xff0c;制药设备也逐步走向自动化。自动化制药设备实现到精确的位置定位&#xff0c;实时的过程监控&#xff0c;快速的网络通讯&#xff0c;在到现场的每个动作的执行&#xff0c;具备高效率的生产特点。PLC作为现在工业设备控制系统的核心&am…

php-fpm 的状态查看和php-fpm 调优随笔

php-fpm status 配置 1. 找到php-fpm的配置文件&#xff0c;将 pm.status_path /status 注释去掉 重启php-fpm 2. 在nginx 中配置一个server块或者配置一个location 3. 最后通过curl 或者 http 请求可以看到php-fpm 的状态 可以带着参数访问&#xff0c;json、xml、html fu…

Android -- 每日一问:在项目中使用AsyncTask会有什么问题吗?

经典回答 那我们考查 AsyncTask 会问些什么呢&#xff1f;得先问问会不会用吧&#xff0c;看看知不知道有 onProgressUpdate 方法。 其次问一下是怎么理解 AsyncTask 的机制&#xff0c;有没有看过它的源代码&#xff1f; 这个问题主要看对方是否对 Android 的东西有好奇心&am…

夜天之书 #69 企业开源该选什么软件许可证?

开源软件和自由软件的概念与其许可证紧密绑定。通常&#xff0c;开源软件被定义为使用 OSI 认可的&#xff0c;即符合开源定义[1]的许可证来分发的软件&#xff0c;而自由软件被定义成使用 GPL 或说 Copyleft 式许可证分发的软件。尽管今天人们最关心的可能是软件的生产过程即如…

通过展开序列ISTA(SISTA)算法创建的递归神经网络(RNN)(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 递归神经网络&#xff08;recursive neural network&#xff09;是具有树状阶层结构且网络节点按其连接顺序对输入信息进行递归…

element表格去除border边框同时有竖直方向的边框

为什么要去除boder边框&#xff0c;原因是boder的边框与页面的背景色相同&#xff0c;然后显得表格内凹了一个像素 要实现的需求是表格去除border边框同时添加竖直方向的边框 但是如果不添加boder属性&#xff0c;表格则没有竖直方向的边框 这种下无内凹&#xff0c;但是显得…

ICV:上半年全球市场规模达20.4亿美元,超声波雷达仍具有竞争力!

全球前沿科技咨询机构ICV近期发布了全球车载超声波雷达的市场分析报告。ICV在报告中指出&#xff0c;在当前的自动驾驶发展阶段&#xff0c;超声波雷达在一众传感器中仍具有较强竞争力&#xff0c;其中APA类型超声波雷达的渗透率上升空间很大。2022年上半年中国的超声波雷达市场…

kettle - get请求

文章目录前言kettle - get请求前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! kettle - get请…

学Python爬虫好找工作吗?要学到什么程度?

Python的火爆&#xff0c;同时也带动了Python爬虫岗位的的极大需求。可能有些人想问了&#xff0c;学Python爬虫真的好找工作吗&#xff1f;要学到什么程度&#xff1f;根据各大招聘网站的数据反馈&#xff0c;目前市场上对Python爬虫工程师的需求比较大。但是这并不意味着学习…

【Redis技术专题】「高可用技术基础」一同分析一下Redis高可用的“基石”之主从架构的本质原理解析

&#x1f4d5;技术箴言 当心中有更高的山峰去攀登&#xff0c;就不会在意脚下的泥沼。 &#x1f4d5;前提概要 Redis高可用的方案包括&#xff1a;持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群&#xff08;Cluster&#xff09;。 &#x1f4d5;&#x1f…

分布式注册服务中心etcd在云原生引擎中的实践

作者&#xff1a;王雷 etcd是什么 etcd是云原生架构中重要的基础组件&#xff0c;由CNCF孵化托管。ETCD是用于共享配置和服务发现的分布式&#xff0c;一致性的KV存储系统&#xff0c;是CoreOS公司发起的一个开源项目&#xff0c;授权协议为Apache。etcd 基于Go语言实现&…

vivo 推荐业务 x DeepRec:全链路优化实践

作者&#xff1a; vivo - 人工智能推荐团队&#xff1a;何鑫、李恒、周健、黄金宝 背景 vivo 人工智能推荐算法团队在深耕业务同时&#xff0c;也在积极探索适用于搜索/广告/推荐大规模性稀疏性算法训练框架。分别探索了 tensornet/XDL/tfra 等框架及组件&#xff0c;这些框…

docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例

在上一篇&#xff0c;学会了3主3从的Redis集群搭建。那么接下来&#xff0c;我们就来学习Redis集群主从容错切换迁移案例 本次案例从模拟两个场景 1&#xff1a;数据读写存储 a&#xff1a;一个新key数据来了&#xff0c;是否会按照预设的进入槽中&#xff1f;集群是否生效 …

黄病毒蛋白酶底物,113866-14-1,Boc-GRR-AMC

Boc-GRR-AMC被拟南芥的II型半胱氨酸蛋白酶Atmc4和Atmc9切割。Boc GRR AMC的储备溶液最好在DMSO中制备。 A substrate for flavivirus proteases such as West Nile virus protease, yellow fever virus NS3 protease, and dengue virus NS2B-NS3 protease.Boc-GRR-AMC is cleav…

JSP ssh排放登记管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 排放登记管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

抗疫逆行者网页作业 感动人物HTML网页代码成品 网页作业带JS下拉菜单 最美逆行者网页模板 致敬疫情感动人物网页设计制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…