Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享)
靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场
课程地址:PHP反序列化漏洞学习_哔哩哔_bilibili
九、错误调用相关魔术方法
1.__call()
调用不存在的方法的名称和参数时触发魔术方法
<?php
class User{public function __call($arg1,$arg2){echo "$arg1,$arg2[0]";}
}
$test = new User();
$test -> callxxx('a'); //调用的方法callxxx()不存在,触发魔术方法call()
?>
触发时机:调用一个不存在的方法
功能:(无)
参数:2个参数传参$arg1,$arg2
返回值:调用的不存在的方法的名称和参数
触发call(),传参$arg1,$arg2(callxxx,a)
$arg1,调用不存在的方法的名称;$arg2,调用不存在的方法的参数;
2.__callStatic()
静态调用或调用成员变量时使用的方法不存在时触发魔术方法
<?php
class User{public function __callStatic($arg1,$arg2){echo "$arg1,$arg2[0]";}
}
$test = new User();
$test::callxxx('a'); //静态调用::时方法callxxx()不存在,触发魔术方法__callStatic
?>
触发时机:静态调用或调用成员常量时使用的方法不存在。
功能:(无)
参数:调用的不存在的方法$arg1.$arg2
返回值:调用的不存在的方法的名称和参数
触发callStatic(),传参$arg1,$arg2(callxxx,a)
$arg1,调用不存在的方法的名称;$arg2,调用不存在的方法的参数;
3.__get()
调用成员属性不存在时触发魔术方法
<?php
class User {public $var1;public function __get($arg1){echo $arg1;}
}
$test = new User();
$test ->var2; //调用的成员属性var2不存在
?>
触发时机:调用的成员属性不存在
功能:(无)
参数:传参$arg1
返回值:不存在的成员属性的名称
触发get(),把不存在的属性名称var2赋值给$arg1
4.__set()
给不存在的成员属性赋值时触发魔术方法
<?php
class User {public $var1;public function __set($arg1 ,$arg2){echo $arg1.','.$arg2;}
}
$test = new User();
$test ->var2 = 1; //给不存在的成员属性var2赋值为1
?>
触发时机:给不存在的成员属性赋值
功能:(无)
参数:传参$arg1,$arg2
返回值:不存在的成员属性的名称和赋的值
先触发get(),再触发set()
$arg1,不存在成员属性的名称;$arg2,不存在的成员属性var2赋的值
5.__isset()
对不可访问属性或不存在的属性使用isset()或empty()会触发魔术方法
<?php
class User {private $var;public function __isset($arg1){echo $arg1;}
}
$test = new User();
isset($test->var); //isset调用的成员属性var不可访问或不存在
?>
触发时机:对不可访问属性或不存在属性使用isset()或empty()时__isset()会被调用。
功能:(无)
参数:传参$arg1
返回值:不存在的成员属性的名称
触发inset(),返回$arg1,不存在或不可访问的成员属性的名称
isset()函数用于检测变量是否已经设置并且非空,如果非空返回true,否则返回false。
empty()函数用于检测一个变量是否为空,如果为空返回true,否则返回false。
6.__unset()
对不可访问属性或不存在的属性使用unset()会触发魔术方法
<?php
class User {private $var;public function __unset($arg1){echo $arg1;}
}
$test = new User();
unset($test->var); //unset调用的成员属性var不可访问或不存在
?>
触发时机:对不可访问属性或不存在属性使用unset()时__unset()会被调用。
功能:(无)
参数:传参$arg1
返回值:不存在的成员属性的名称
触发unset(),返回$arg1,不存在或不可访问的成员属性的名称
unset()函数用于销毁指定变量,释放内存。如果成功销毁变量,则返回true,否则返回false。
7.__clone()
当使用clone关键字考本完成一个对象后,新对象会自动调用魔术方法
<?php
class User {private $var;public function __clone(){echo "__clone test";}
}
$test = new User() ;
$newclass = clone($test) //使用colne()克隆对象完成后,触发魔术方法__clone()
?>
触发时机:当使用clone关键字拷贝完成一个对象后,新对象会自动调用定义的魔术方法__clone()
功能:(无)
参数:(无)
返回值:(无)
clone关键字用于创建一个对象的副本(即克隆一个对象)。
它是对象复制的一种方式,可以用来创建一个新的对象,而不是引用原始对象。通过使用clone,我们可以创建一个完全独立的对象,并且这个对象的属性值与原始对象相同。
汇总表格
__construct() | __destruct() | __sleep() | __wakeup() | |
---|---|---|---|---|
触发时机 | 实例化对象 | 对象引用完成或对象被销毁反序列化之后 | 序列化serialize()之前 | 反序列化unserialize()之前 |
功能 | 提前清理不必要内容 | 对象被序列化之前触发,返回需要被序列化存储的 | ||
参数 | ||||
返回值 | 需要被序列化存储的成员属性 | |||
__toString | __invoke() | __call() | __callStatic() | |
触发时机 | 对象被当成字符串调用(使用echo或者print) | 把对象当成函数调用 | 调用一个不存在的方法 | 静态调用不存在的方法 |
功能 | ||||
参数 | $arg1,$arg2 | $arg1,$arg2 | ||
返回值 | 调用的不存在的方法的名称和参数 | 调用的不存在的方法的名称和参数 | ||
__get() | __set() | __isset() | __unset() | |
触发时机 | 调用成员属性不存在 | 给不存在的成员属性赋值 | 对不可访问属性使用isset()或empty() | 对不可访问属性使用unset() |
功能 | ||||
参数 | $arg1 | $arg1,$arg2 | $arg1 | $arg1 |
返回值 | 不存在的成员属性的名称 | 不存在的成员属性的名称和赋的值 | 不存在的成员属性的名称 | 不存在的成员属性的名称 |
__clone() | ||||
触发机制 | 当使用colne关键字拷贝完成一个对象 |