CTF_Web:反序列化学习笔记(一)php中的类与对象

0x00 前言

前期第一次遇到反序列化这方面题目的时候,也看了不少资料,都是前辈们写的总结,但是都是直接从在ctf中的运用开始的,自己在这段时间整理的过程中,发现对于php类与对象了解不是很多,导致在看一些题目、或值前辈的总结时都比较困难,下面参考php文档,结合自己对php类与对象的理解先把反序列化的基础知识做一下整理。

0x01 php类与对象

class

在php手册中这样介绍:

每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
类名可以是任何非 PHP保留字 的合法标签。在这一点中与变量定义相同,避免歧义。一个合法类名以字母或下划线开头,后面跟着若干字母,数字或下划线。以正则表达式表示为: ^[a-zA-Z_x80-xff][a-zA-Z0-9_x80-xff]*$。一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。

<?php class SimpleClass {     // 声明属性     public $var = 'a default value';      // 声明方法     public function displayVar() {         echo $this->var;     } } ?> 

当一个方法在类定义内部被调用时,有一个可用的伪变量 $this$this是一个到当前对象的引用。此时所有类内的$this都表示当前这个类,访问的对象与方法也是当前类的。例如 $this->var;

new

对定义的类进行创建对应的实例,必须使用new方法,new方法在创建一个实例时,不管以构造函数还是直接传入的方式,其必须为类内的属性赋初始值。当没有参数要传递给类的构造函数,类名后的括号则可以省略掉。
例如对于上面的类:

<?php $instance = new SimpleClass(); // 也可以这样做: $className = 'SimpleClass'; $instance = new $className(); // new SimpleClass() //或不加括号 $instance = new $className; ?> 

变量与方法

在php中类的属性和方法存在于不同的“命名空间”中,也就是说一个类的属性和方法可以使用同样的名字。 在类中访问属性和调用方法使用同样的操作符,具体是访问一个属性还是调用一个方法,取决于你的上下文,即用法是变量访问还是函数调用。
例如:

<?php class Foo {     public $bar = 'property';      public function bar() {         return 'method';     } }  $obj = new Foo(); echo $obj->bar, PHP_EOL, $obj->bar(), PHP_EOL;//第一个访问类属性成员bar,第二个则访问类方法bar()。 

属性

类的变量成员叫做“属性”,属性声明是由关键字 publicprotected或者private开头,然后跟一个普通的变量声明来组成。属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的