CMCTF2025--web
字数 1959 2025-09-01 11:26:17

CMCTF2025 Web题目解析与解题思路

1. pop之我又双叒叒叕叕重生了

题目类型

反序列化漏洞利用

解题思路

  1. 目标是通过反序列化执行A4类的fun()方法
  2. 构造对象链:A1 → A2 → A3 → A4
  3. 利用PHP魔术方法的自动调用机制:
    • A1的__wakeup()调用A2的get_flag()
    • A2的get_flag()尝试将$a2(A3对象)与字符串拼接,触发A3的__toString()
    • A3的__toString()调用A4的fun()
    • A4的fun()检查GET参数并输出flag

关键点

  • 理解PHP对象链的构造
  • 掌握__wakeup__toString等魔术方法的触发时机

2. busy_search

解题步骤

  1. 初始访问返回403,使用dirsearch扫描发现index.html
  2. 在浏览器开发者工具(F12)中:
    • 搜索{找到部分flag
    • 搜索--找到其他flag片段
  3. 将所有片段拼接得到完整flag

注意事项

  • 推荐使用Edge浏览器,Firefox可能无法搜索--
  • 仔细检查页面所有隐藏内容

3. 小猿口算签到重生版

题目机制

  1. 动态算术题系统:
    • 每1.5秒通过/generate接口获取新表达式
    • 表达式显示在ID为code的元素中
  2. 验证机制:
    • 用户输入发送到/verify接口
    • 验证通过返回flag

解题方法

  1. 分析发现服务端记录题目生成时间戳
  2. 前端修改时间无效,必须在1.5秒内完成计算并提交
  3. 编写自动化脚本:
    • 获取题目
    • 快速计算答案
    • 立即提交

关键点

  • 时间敏感型题目
  • 需要自动化处理快速响应

4. u_know?

第一关:shop.php

  1. 反序列化弱类型比较漏洞
  2. 利用==比较的特性,使onethingtwothingtrue
  3. 构造payload:
    // 反序列化中设置onething和twothing为b:1
    

第二关:kfc.php

  1. 下载压缩包分析反序列化代码
  2. 构造特定对象链触发漏洞
  3. 将两部分结果拼接后base64解码得到flag

关键点

  • PHP弱类型比较特性
  • 复杂反序列化链构造

5. 函数重生版

解题方法

  1. 识别为无参数RCE(远程代码执行)
  2. 使用payload:
    eval(end(current(get_defined_vars())));&b=system('cat /tmp/flag.sh');
    
  3. 通过get_defined_vars()获取变量,执行系统命令

6. give!me!money!

题目分析

  1. 三国杀主题题目,扫描发现index.rar源代码
  2. 关键参数:
    • id=d&money=114514
    • c参数需要匹配服务器生成的随机数shenhe

解题步骤

  1. shenhe基于服务器时间戳前7位作为种子生成
  2. 预测时间戳:
    • 从响应包获取时间信息
    • 提取前7位数字作为随机数种子
  3. 计算对应值作为c参数提交

7. lottery签到重生版

解题方法

  1. 使用Burp Suite爆破
  2. 在响应中搜索flag
  3. 简单签到类题目,无需复杂操作

8. can_u_escape

题目类型

反序列化字符串逃逸

解题思路

  1. 利用PHP字符串处理特性"挤掉"后面部分
  2. 使pass='escaping'
  3. 测试需要多少个"php"才能完成逃逸(测试结果为29个)
  4. 构造相应payload获取flag

9. ez_upload2

解题步骤

  1. 分析class.php源码:

    • phar不能出现在开头
    • 只允许数字、_;等字符
    • 使用phar伪协议绕过
  2. 文件上传绕过:

    • 上传图片文件
    • 使用gzip压缩绕过WAF正则
    • 修改文件头为PNG格式
  3. 执行命令:

    • 使用__halt_compiler()停止编译器执行
    • 先执行system(ls)查看目录
    • 使用highlight_file()读取flag文件

10. ez_upload

漏洞分析

  1. 白名单检查存在逻辑问题
  2. PHP数组处理特性:
    • end()取插入顺序的最后一项
    • count($file)-1取键值的最后一项
  3. 构造特殊数组:
    • filename[1]=php
    • filename[0]=png
    • 使end()得到png(通过检查)
    • count()得到php(实际执行)

关键点

  • 利用PHP数组处理顺序的特性
  • 精心构造上传文件名绕过检查

通用解题技巧

  1. 信息收集

    • 使用dirsearch等工具扫描目录
    • 检查页面源代码和开发者工具
    • 下载并分析提供的源代码
  2. 反序列化漏洞

    • 理解PHP魔术方法的触发时机
    • 构造对象链利用漏洞
    • 注意弱类型比较特性
  3. 文件上传绕过

    • 修改文件头绕过检查
    • 使用压缩改变文件特征
    • 利用服务器解析特性
  4. 自动化脚本

    • 对于时间敏感型题目编写自动化脚本
    • 使用Python requests库或Burp Suite自动化处理
  5. PHP特性利用

    • 掌握字符串处理、数组处理等特性
    • 了解伪协议的使用方法
    • 熟悉各种函数和魔术方法
CMCTF2025 Web题目解析与解题思路 1. pop之我又双叒叒叕叕重生了 题目类型 反序列化漏洞利用 解题思路 目标是通过反序列化执行A4类的fun()方法 构造对象链:A1 → A2 → A3 → A4 利用PHP魔术方法的自动调用机制: A1的 __wakeup() 调用A2的 get_flag() A2的 get_flag() 尝试将$a2(A3对象)与字符串拼接,触发A3的 __toString() A3的 __toString() 调用A4的 fun() A4的 fun() 检查GET参数并输出flag 关键点 理解PHP对象链的构造 掌握 __wakeup 、 __toString 等魔术方法的触发时机 2. busy_ search 解题步骤 初始访问返回403,使用dirsearch扫描发现index.html 在浏览器开发者工具(F12)中: 搜索 { 找到部分flag 搜索 -- 找到其他flag片段 将所有片段拼接得到完整flag 注意事项 推荐使用Edge浏览器,Firefox可能无法搜索 -- 仔细检查页面所有隐藏内容 3. 小猿口算签到重生版 题目机制 动态算术题系统: 每1.5秒通过 /generate 接口获取新表达式 表达式显示在ID为 code 的元素中 验证机制: 用户输入发送到 /verify 接口 验证通过返回flag 解题方法 分析发现服务端记录题目生成时间戳 前端修改时间无效,必须在1.5秒内完成计算并提交 编写自动化脚本: 获取题目 快速计算答案 立即提交 关键点 时间敏感型题目 需要自动化处理快速响应 4. u_ know? 第一关:shop.php 反序列化弱类型比较漏洞 利用 == 比较的特性,使 onething 和 twothing 为 true 构造payload: 第二关:kfc.php 下载压缩包分析反序列化代码 构造特定对象链触发漏洞 将两部分结果拼接后base64解码得到flag 关键点 PHP弱类型比较特性 复杂反序列化链构造 5. 函数重生版 解题方法 识别为无参数RCE(远程代码执行) 使用payload: 通过 get_defined_vars() 获取变量,执行系统命令 6. give!me!money ! 题目分析 三国杀主题题目,扫描发现index.rar源代码 关键参数: id=d&money=114514 c 参数需要匹配服务器生成的随机数 shenhe 解题步骤 shenhe 基于服务器时间戳前7位作为种子生成 预测时间戳: 从响应包获取时间信息 提取前7位数字作为随机数种子 计算对应值作为 c 参数提交 7. lottery签到重生版 解题方法 使用Burp Suite爆破 在响应中搜索flag 简单签到类题目,无需复杂操作 8. can_ u_ escape 题目类型 反序列化字符串逃逸 解题思路 利用PHP字符串处理特性"挤掉"后面部分 使 pass='escaping' 测试需要多少个"php"才能完成逃逸(测试结果为29个) 构造相应payload获取flag 9. ez_ upload2 解题步骤 分析class.php源码: phar 不能出现在开头 只允许数字、 _ 、 ; 等字符 使用phar伪协议绕过 文件上传绕过: 上传图片文件 使用gzip压缩绕过WAF正则 修改文件头为PNG格式 执行命令: 使用 __halt_compiler() 停止编译器执行 先执行 system(ls) 查看目录 使用 highlight_file() 读取flag文件 10. ez_ upload 漏洞分析 白名单检查存在逻辑问题 PHP数组处理特性: end() 取插入顺序的最后一项 count($file)-1 取键值的最后一项 构造特殊数组: filename[1]=php filename[0]=png 使 end() 得到png(通过检查) count() 得到php(实际执行) 关键点 利用PHP数组处理顺序的特性 精心构造上传文件名绕过检查 通用解题技巧 信息收集 : 使用dirsearch等工具扫描目录 检查页面源代码和开发者工具 下载并分析提供的源代码 反序列化漏洞 : 理解PHP魔术方法的触发时机 构造对象链利用漏洞 注意弱类型比较特性 文件上传绕过 : 修改文件头绕过检查 使用压缩改变文件特征 利用服务器解析特性 自动化脚本 : 对于时间敏感型题目编写自动化脚本 使用Python requests库或Burp Suite自动化处理 PHP特性利用 : 掌握字符串处理、数组处理等特性 了解伪协议的使用方法 熟悉各种函数和魔术方法