从两道题目浅谈PHP深浅拷贝

本文探讨PHP深浅拷贝的概念及其在反序列化题目中的应用,通过实例讲解对象引用与复制的区别,以及如何利用这些知识解决具体的安全挑战。

从两道题目浅谈PHP深浅拷贝


0x01 前言

最近才认认真真看完PHP,虽然还是有很多地方不会应用,因此想多看看有关PHP的题目,看到了两道和PHP深浅拷贝有关的题目,自己也把它搞懂吧。。

0x01 正文

题一:南邮ctf的PHP反序列化

<?php
class just4fun {
   
   
    var $enter;
    var $secret;
}

if (isset($_GET['pass'])) {
   
   
    $pass = $_GET['pass'];

    if(get_magic_quotes_gpc()){
   
   
        $pass=stripslashes($pass);
    }

    $o = unserialize($pass);

    if ($o) {
   
   
        $o->secret = "*";
        if ($o->secret === $o->enter)
            echo "Congratulation! Here is my secret: ".$o->secret;
        else 
            echo "Oh no... You can't fool me";
    }
    else echo "are you trolling?";
}
?>

题目意图很简单,就是先设置了对象的一个属性的值,如果另一个属性的值和这个设置好的值相等,则得到flag,而get_magic_quotes_gpc()$pass=stripslashes($pass)只是把加上的转义字符又给去掉,似乎对这个题没有什么影响。最初我以为$o->secret = "*"就是把这个属性的值设为*,其实是设置成了任意字符,那我们如何将这个满足$o->secret === $o->enter这里就要用到PHP深浅拷贝的知识。

我们举一个栗子:

<?php
class Example1
{
   
   
    public $name;

    public function __construct($name)
    {
   
   
        $this->name = $name;
    }
}

$ex1 = new Example('test1');// $ex1->name现在是:test1
$ex2 = $ex1;// $ex2->name现在是:test1

$ex2->name = 'test2';// 这样修改一下之后,$ex1->name与$ex2->name都变为了:test2

现在我们应该可以理解对象间引用的概念,他们就相当于是同一个类的同一个对象,PHP5默认通过引用传递对象,假设$obj1和$obj2是两个对象,使用$obj1=$obj2这样的方法复制出的对象是相互关联的,程序中想复制一个值与原来相同的对象,而不希望目标对象与源对象关联,应使用clone关键字。

$ex1 = new Example('test1');// $ex1->name现在是:test1
$ex2 = clone $ex1;//$ex2->name现在是:test1
$ex2->name 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值