WEB渗透—PHP反序列化(五)

发布时间:2023年12月19日

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关键字拷贝完成一个对象
文章来源:https://blog.csdn.net/haosha__demingzi/article/details/134557209
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。