一,php面向对象。
1.面向对象:
以“对象”伪中心的编程思想,把要解决的问题分解成对象,简单理解为套用模版,注重结果。
2.面向过程:
以“整体事件”为中心的编程思想,把解决问题的步骤分析出来,用函数依次实现,注重过程。
3.类:
将数据和数据上的操作封装在一起
内部构成:成员变量(属性)+成员函数(方法)
注:属性在外部是不可以直接看到的,但是可以访问。
(1)创建一个类
其中var的作用是声明变量
$this为预定义
(2)new
new的作用是讲之前定义的类实体化,类里先定义了,才能在后面赋值
注意,之前的声明变量并不会执行出任何内容,包括上面的echo,因为上面定义的变量里面没有任何内容。只有将类实例化成对象,并给参数赋值,再打印输出,才会有值输出。
4.类的修饰符
分为三类。用了修饰符以后,可调用范围会改变,详情如下,可省略,默认为是public
私有属性(privade)只有父类可以用
5.继承:
继承性是子类自动共享父类数据和方法的机制,如上hero2对父类hero的继承可以表达出身高
二.序列化基础知识
1.什么是序列化?
序列化是将对象或数组转化为方便存储、传输的字符串,php使用serialize()函数将对象序列化; 序列化只作用于对象的成员属性,不序列化成员方法
2.反序列化值
各类型值的serialize序列化:
空字符 null -> N; 空
整型 123 -> i:123; int
浮点型 1.5 -> d:1.5; double
boolean型 true -> b:1;
boolean型 false -> b:0;
字符串 “haha” -> s:4:"haha"; string型6个单位长
3.数组,对应规则如下。
4.对象序列化
只作用于对象的成员属性(变量),不序列化成员方法(函数),
在如下代码比较中,我们可以看得到,对象pub的内容benben被输出,但是方法(函数)却没有任何改变。
5.私有属性的序列化
会在变量前加上%00(占一个位)+类名+%00,这里的%00不是空格,而是null空。
在下面的示例中,在原变量名pub之前加上了类名test,表面上看只有7个字符,但是实际加上了两个%00,就使得长度变为了9
假若你将内容用url编码输出,你就可以看到他的真实样子,在test前后都有%00
6.保护属性的序列化
会在变量名前加上%00*%00
7.成员属性调用对象过程及序列化(pop链序列化)
对象的成员属性是另一个对象,序列化值出现嵌套。
三,反序列化
1.反序列化后的内容是一个对象。
如下代码展示序列化
整个过程是:对象通过序列化变为字符串,而反序列化让字符串变为对象。
2.反序列化生成的对象的值,与原来的类的预定义无关,而是由反序列化的值提供。
在上面的示例中,$c输出的值没有按序列化的值(xxxxxx)输出,而是以反序列化的值hellow提供,因此,在输出的$c中,$c的值为hellow。
3.反序列化不能触发类里的成员方法,如果想用,需要调用(除魔术方法外)。
在下面的示例中,我们调用了之前的成员方法,使得$c的输出 输出username的内容,但是在反序列化之后,username的内容改变了(上一条的原因)因此,最后输出的内容就是hellow
附:为什么会有反序列化漏洞?
因为在反序列化过程中unserialize()的值可控,通过更改这个值,得到需要的代码
8.反序列化漏洞的利用
eg1:
三.魔术方法
四.pop链的构造思路知识——构造代码写poc代码
五.反序列化逃逸
六.session反序列化漏洞
七.phar反序列化
[SWPUCTF 2021 新生赛]ez_unserialize
1.打开题目,只有一张动图,源码里也没有什么
2.用御剑扫一下,依次访问,在robot.txt中找到一个c145s.php
3.再次访问,出现真正的题目,是一串代码,意思是满足admin=admin&passwd=ctf,触发__destruct()函数,就可以得到flag