本文介绍: 编写PHP代码实现序列化的时候魔法函数自动调用计算器。将字符串序列化对象。将对象序列化字符串。可能会有小bug,问题不大。注:比较简陋,仅供参考。接收传参执行系统命令
注:比较简陋,仅供参考。

编写PHP代码实现序列化的时候魔法函数自动调用计算器

PHP反序列化

serialize(); 将对象序列化成字符串

unserialize(); 将字符串序列化回对象

创建

class Stu{
public $name;
public $age;
public $sex;
public $score;
}

创建对象

$stu1 = new Stu();
$stu1->name = "zs";
$stu1->age = 22;
$stu1->sex = true;
var_dump($stu1);
echo "<br /&gt;";
echo serialize($stu1);


序列

字符串转换对象

O:object

序列

以 __ 开头的函数,是PHP 中的魔术方法

类中的魔术方法,在特定情况下会自动调用。即使魔术方法类中没有定义,也是真实存在的。

__construct() 在创建对象自动调用

__destruct() 在销毁对象自动调用

__wakeup() unserialize()时会自动调用这个函数

__sleep() serialize()时会自动调用这个函数

PHP反序列化举例

可能会有小bug,问题不大

漏洞逻辑

执行序列语句 $stu1 = unserialize($stu1); 时,系统自动调用 stu() 类中的 __wakeup() 方法__wakeup() 方法调用函数a(),函数 a() 调用函数 b(),函数 b() 接收传参执行系统命令

<?php
// 定义函数 a()
function a(){
    // 调用函数 b()
    b();
}
// 定义函数 b()
function b(){
// 方法一:
    // 如果参数 cmd 的值为 zs 则执行 system 打开计算器
    /if(@$_GET['cmd']=='zs'){
    /    system("calc");
    /}
// 方法二:可以执行其他系统命令
    // 如果参数 cmd 的值为 calc 则打开计算器
    $cmd=$_GET['cmd'];
    @system($cmd);
}
// 创建 stu 类
class Stu{
    // 定义属性
    public $name;
    public $age;
    public $sex;
    public $score;
    // 定义方法,当执行 unserialize() 反序列化函数时自动调用 __wakeup() 方法
    public function __wakeup(){
        a();
    }
    }

    // 创建对象
    $stu1 = new Stu();
    // 对象赋值
    $stu1->name = "zs";
    $stu1->age = 22;
    $stu1->sex = true;
    // var_dump($stu1);
    // 序列
    $stu1 = serialize($stu1);
    // var_dump($stu1);

    // 反序列
    echo "<br />";
    $stu1 = unserialize($stu1);
    // var_dump($stu1);

?>

验证

原文地址:https://blog.csdn.net/2301_79118231/article/details/134558512

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_6829.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注