从两道题目浅谈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

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

被折叠的 条评论
为什么被折叠?



