反序列化漏洞
一、php面向对象
学习自bilibili的up主橙子科技工作室,讲的很好,有需要可自行查找
1、php面向对象基础知识
面向过程编程: 1.强调的是功能行为,以函数为最小单位,考虑怎样去做; 2.易于实现,执行效率高; 3.可维护性比较差,可扩展性差。
面向对象编程: 1.强调的是事物对象,以类/对象为最小单位,考虑谁来做; 2.易于扩展,可维护性和可扩展性都比较好; 3.执行效率低; 4.面向对象具有继承、封装、多态等特性,能够更好地应对需求的变化。
总的来说,面向过程的编程思想是以过程或者功能作为切入点进行编程,侧重于描述步骤和流程,因此一般适用于简单的小型项目。而面向对象编程是以对象为中心进行编程,将数据和操作封装在一起,更加适用于大型复杂项目。
类里的方法调用类里面的某个属性时要用
$this->
2、序列化基础知识
(1)、序列化的作用
方便存储和传输
将对象或者数组转化为可储存/传输的字符串。
(2)、序列化之后的表达方式/格式
(3)、对象序列化的详细讲解
只序列化成员变量,不序列化成员函数
序列化的时候进行url编码,
序列化的对象一实例化了另一个对象二,最后序列化出来的结果会是
序列化的对象包含了序列化的对象
3、反序列化
(1)、反序列化的特性
1.反序列化之后的内容为一个对象;
2.反序列化生成的对象里的值,由反序列化里的值提供;与原有类预定义的值无关;
3.反序列化不触发类的成员方法;需要调用方法后才能触发;
(2)、反序列化的作用
代码演示:
4、反序列化漏洞
(1)、魔术方法
什么是魔术方法
一个预定义好的,在特定情况下自动触发的行为方法。
魔术方法的作用
反序列化漏洞的成因:
反序列化过程中,unserialize()接收的值(字符串)可控;
通过更改这个值(字符串),得到所需要的代码;
通过调用方法,触发代码执行。
魔术方法在特定条件下自动调用相关方法,最终导致触发代码。
_construct()
实例化对象时触发
_destruct()
两次触发,在实例化对象时和反序列化时
_sleep()
序列化serialize()函数会检查类中是否存在一个魔术方法_sleep()如果存在,该方法会先被调用,然后才执行序列化操作。
此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。
如果该方法未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误。
触发时机:serialize之前
_wakeup()
和sleep()相反,触发时机在反序列化之前
unserialize()会检查是否存在一个_wakeup()方法。
如果存在,则会先调用_wakeup()方法,预先准备对象需要的资源。
预先准备对象资源,返回void,常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。
_tostring()
表达方式错误导致魔术方法被触发
把对象当成字符串输出时会触发
常用于构造POP链
_invoke()
把对象当成函数调用时触发
_call()
_callStatic()
_get()
_set()
_isset()
_unset()
_clone()