面向对象基本概念
类:类是事物的抽象特点,封装了数据形式及数据操作;对象是类类型的变量,是类的实例。
内部构成:
成员变量(属性):类内部的变量,对外不可见,可通过成员函数访问,类实例化为对象后成为对象属性。
成员函数(方法):类内部定义的函数,可用于访问对象数据。
父类:被其他类继承的类,也可称为父类、基类、超类
子类:继承其他的类,也可称为派生类
类的结构
类:包含类名、成员变量(属性)、成员函数(方法)
class Class_Name{
成员变量声明
成员函数声明
}
类中调用变量:用$this->来调用
实例化和赋值:
class hero{
var $name;
var $sex;
function jineng($var1) {
echo $this->name;
echo $var1;
}
$cyj= new hero();
$cyj->name='chengyaojin';
$cyj->sex='man';
$cyj->jineng('zuofan');
print_r($cyj);
类的修饰符
成员属性:类中直接声明的变量,也可以称为成员变量。
可以在类中声明多个变量,即“对象”中可以有多个成员属性,每个变量都存储“对象”不同的属性信息。
访问权限修饰符:对属性的定义
public:公共的,在类的内部、子类、类的外部都可以使用,不受限制;
protected:受保护的,在类的内部、子类中可以使用,但不能在类的外部使用;
private:私有的,只能在类的内部使用,类的外部或者子类中都无法使用。
序列化
将对象的状态信息(属性)转换为可存储或传输的字符串形式,使用serialize()函数实现。
表达方式:
<?php
$a=null;
echo serialize($a);
?>
数组的反序列化:
<?php
$a = array('benben','dazhuang','laoliuʼ);
echo $a[0];
echo serialize($a);
?>
array(ʻbenbenʼ,ʼdazhuangʼ,ʼlaoliuʼ);
array:3参数数量:{i:0编号:s:6:"benben":i:1;s:8:"dazhuang";i:2;s:6:"laoliu";}
对象的序列化:
<?php
class test{
public $pub='benben';
function jineng(){
echo $this->pub;
}
}
$a = new test();
echo serialize($a);
?>
Oobject:4类名长度:"test"类名:1变量数量:{s:3变量名字长度:”pub”变量名字;s:6值的长度:"benben”变量值;}
注意:
private私有属性序列化时,变量名前加“%00类名%00”,%00test%00pub
protected保护属性,变量名前会加*号
反序列化基础
反序列化是序列化的逆过程,使用unserialize()函数将字符串还原为对象。

特点:
还原后的对象属性值由序列化字符串决定,与类的初始定义无关。
不触发类的成员方法;需要调用方法后才能触发。
注意%00需要用urlencode,urldecode加解密。
构造反序列化
O:4:"test":1:{s:1:"a";s:13:"system("id");";};
魔术方法
预定义好的,在特定情况下自动触发的行为方法
反序列化漏洞成因:
unserialize()接收的字符串可控,通过更改这个值得到所需代码,调用方法触发代码执行.
ctf常用方法如下
__construct:实例化对象被调用,用于初始化值
__destruct:删除对象或对象操作终止时被调用,用于垃圾回收,当对象销毁时会调用此方法
__sleep:serialize之前被调用,当类外部使用serialize会调用
__wakeup:当在类外使用unserialize时会调用
__invoke:以调用函数的方式调用一个对象时被调用
__tostring:对象类被当作字符串进行处理时触发
__call:调用类中不存在的方法时调用
__get:读取一个对象的属性时,若存在则返回属性值,不存在则调用
__set:设置一个对象的属性时,若存在直接赋值,不存在则调用
__isset:检测对象的某个属性是否存在时执行,对不可访问属性调用isset或empty时被调用
__unset:在不可访问的属性上使用unset时触发,销毁对象的某个属性时执行
作者:晨星安全团队---SD9ard3n