前言
上一节我们学习到了 数组 这节我们将学习 面向对象 类 (属性 方法) 对象(对象的归类)魔术方法
偏实践多敲就能懂 :
1、面向对象
我们知道啊编程分为 面向对象的编程和面向过程的编程
那这两个是什么意思啊 --- 简单点说 就是我们敲代码开发一个程序 我们需要从数据库取出东西 呈现到前端页面 --- 面向过程就是 我们敲相同的代码(数据库连接)我们每换一个 程序就需要重新敲一遍 --- 而面向对象 就是我们在一个文件里 设置上一个类 需要调用的时候 直接调用这个封装的类(对象(object))就行了 不用 一遍一遍的去搞
不懂的可以看下边这个大佬的文章
什么是面向过程和面向对象,有什么区别?_面向对象和面向过程-CSDN博客
什么是类 和对象
我们 举个例子 类就是水果 而 对象就是苹果 香蕉
但是我们一开始不知道什么是香蕉啊 什么是苹果 啊 这就涉及到属性(定义的变量)
因为属性的不同我们才能区分
我们怎么区分的就是使用的 类的方法、PHP 面向对象 | 菜鸟教程
搞懂之后我们直接实践写一下
定义一个类 使用class 去定义 这边我们定义一个 fruit 水果
然后我们再给与属性 水果有什么属性啊 定义个大小 和名字吧
为什么用 public 定义呀 这个就涉及到 共有的(大家的大家都可以使用) 和私有的(我的)
解析:大家可能 不懂这个 -> 是干是什么的对吧 解析个 set_name吧 这个$this 我理解为预选的对象 对象的名字 是 name 这个name 其实就是我们输入的东西 这个方法就是跟我们互动 然后被调用
再解析一个 return 吧 这个 返回值就是 对象的名字 这下理解了吧 ->大家可以理解为 指向的
$this->name 对象指向的名字
哎呀这个太无聊了呀 提提兴趣 :
php序列化和反序列化
展示序列化 :
爱博士? 这不就是上边的面向对象(对象就是类实例化的结果)吗 那里的序列化啊
我们调用 一个函数 serialize(它可以吧我们的对象 转化为字符串) 那大家可能说了好好的对象转为字符串干什么呀 主要是我们的对象 new在外边 容易和类中断呀 那中断了对象不就什么也不是了 嘛
用一下这个函数:
然后再说一下 这个转换其实前边也了解了 就是 var_dump抓换数组的时候 是不是把数组当成和对象一样的形式输出了
那这个可以还原吗 这个需要使用 unserialize (反序列化 把字符串转变为对象)
我们还原一下试试
魔术方法
什么是魔术方法 : 这类就是 php本身自带的 当我们调用创建一些东西的时候就会 自动调用
就算我们没写(没写就会以默认值输出)(魔术方法简单点说就是为了更加完善 类 )PHP之十六个魔术方法详解 - The code - SegmentFault 思否
演示 __construct 和 __destruct
__construct(魔术方法都是以__开头) 这个的意思 简单点说 :就是我们创建变量的时候会给我们一个提示
__destruct 魔术方法 这个和上边相反 这个表示我们有属性被销毁的时候会默认进行
演示 :
反序列化漏洞
终于到漏洞了呀 你妹的呀 大家也可以看到 发现漏洞很简单吗? 不简单呀 你得需要有足够的知识储备呀 你得知道程序的逻辑呀
这边我们直接利用上边的演示 : 原理 就是序列化的魔术方法被更改 从而导致恶意代码被反序列化 -》
这边有个误区 就是我之后在调用新的对象 给新的值的时候 这个180 初始值 不会变呀 那这个函数实验不了 而destruct就可以 什么意思呢 就是destruct 是在序列化里最后输出的(这就保证了 初始值变化之后他的输出也变化) 而这个construct 是我们给之后后边的程序怎么干活 它鸟都不鸟一下
所以 反序列化很容易发生在 destruct 身上
那就好办了 我们如果拿到了这个源码 然后我们改一下 序列号对象的值再 反序列一下看看
我们运行一下
形成了 xss
实战:
pikachu 的反序列化
这里是这个漏洞
那我们把这个序列化给到这个pikachu 看看什么情况
返回了一个皮卡出 那就证实了呀 因为我们有源码 所以我们随便改值
后边那个 script忘记 写 / 闭合了
复制到皮卡出
直接X住了
这个漏洞的条件 : 1、 调用了面向对象 2、使用了会随着全局改变的魔术方法 3、我们得到了源码 4、使用了 unserilarize 返序列化