学校网站设计的目的,美工做任务网站,推广方案格式模板范文,网站关键词百度指数一#xff0c;php面向对象。
1.面向对象#xff1a;
以“对象”伪中心的编程思想#xff0c;把要解决的问题分解成对象#xff0c;简单理解为套用模版#xff0c;注重结果。
2.面向过程#xff1a;
以“整体事件”为中心的编程思想#xff0c;把解决问题的步骤分析出…一php面向对象。
1.面向对象
以“对象”伪中心的编程思想把要解决的问题分解成对象简单理解为套用模版注重结果。
2.面向过程
以“整体事件”为中心的编程思想把解决问题的步骤分析出来用函数依次实现注重过程。
3.类
将数据和数据上的操作封装在一起
内部构成成员变量属性成员函数方法
注属性在外部是不可以直接看到的但是可以访问。
1创建一个类
其中var的作用是声明变量
$this为预定义 2new
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 四.魔术方法
问1.什么是魔术方法
魔术方法是预先定义好的在特定情况下自动触发的行为方法
问2.魔术方法的作用
在反序列化过程中unserialize()的值可控通过更改这个值得到需要的代码通过调用方法触发代码执行。
1._construct()
构造函数在实例化一个对象的时候首先执行的方法实例化对象时触发构造函数_construct()
在如下示例中并没有调用方法而是由魔术方法触发的。 2.__destruct()
析构函数在对象的所有引用被删除或者当对象被显示销毁时执行的魔术方法。
在如下示例中
实例化对象结束以后代码完全销毁触发析构函数__destruct() 这是第一次触发 反序列化本身也是对象反序列化生成的对象在释放时触发构析函数这是第二次触发 附析构函数示例
在如下示例中我们构造了一个payload通过get传参使得代码触发构析函数构析函数再执行evaleval触发代码。 3.__sleep()
序列化serialize会检查是否存在一个__sleep()的魔术方法如果存在会先调用该魔术方法再进行序列化 这个函数可以用来清理对象冰饭换一个数组这个数组里面理包含有该被序列化的变量名如果没有返还任何内容则null被序列化并产生一个E_NOTICE级别的错误。
触发时机serialize之前
功能对象被序列化之前触发返还需要被序列化储存的成员属性删除不必要的属性。
参数成员属性
返还值:需要被序列化储存的成员属性
在一下示例中第12行_sleep 函数返还的变量是username和nickname在代码执行序列化之前检查了_sleep()函数发现过滤了password因此在序列化之后password就没有了。 4._weakup()
反序列化unserializezai在执行之前会检查是否有_weakup()如果有则先调用_weakup()预先准备对象需要的资源
作用预先准备对象资源返回void常用于反序列化中重新建立与数据库的链接或者执行其他初始化操作。
触发时机反序列化unserialize之前
如下示例
在输出中可以看到_weakup()将username的值a赋给了password并且展示出了类名User和password的属性private。在源代码中$user_ser没有将password和order赋值因为触发了_weakup(),在输出中就加上了password的值为aorder没有值就返回NULL。 五.pop链的构造思路知识——构造代码写poc代码
六.反序列化逃逸
七.session反序列化漏洞
八.phar反序列化 九题目示例
[SWPUCTF 2021 新生赛]ez_unserialize
1.打开题目只有一张动图源码里也没有什么 2.用御剑扫一下,依次访问在robot.txt中找到一个c145s.php 3.再次访问出现真正的题目是一串代码意思是满足adminadminpasswdctf触发__destruct()函数就可以得到flag