Web渗透—PHP反序列化????????课程学习分享(课程非本人制作,仅提供学习分享)
靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场
调用不存在的方法的名称和参数时触发魔术方法
<?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,调用不存在的方法的参数;
静态调用或调用成员变量时使用的方法不存在时触发魔术方法
<?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,调用不存在的方法的参数;
调用成员属性不存在时触发魔术方法
<?php
class?User?{
public?$var1;
public?function?__get($arg1){
echo??$arg1;
}
}
$test?=?new?User();
$test?->var2; //调用的成员属性var2不存在
?>
触发时机:调用的成员属性不存在
功能:(无)
参数:传参$arg1
返回值:不存在的成员属性的名称
触发get(),把不存在的属性名称var2赋值给$arg1
给不存在的成员属性赋值时触发魔术方法
<?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赋的值
对不可访问属性或不存在的属性使用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。
对不可访问属性或不存在的属性使用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。
当使用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关键字拷贝完成一个对象 |