PHP 反序列化漏洞入门(零基础彻底看懂)
前言
PHP 反序列化漏洞是 Web 安全中非常经典的高阶漏洞,也是 CTF Web 题型、红蓝对抗、代码审计的高频考点。不同于上传、包含这类直观漏洞,反序列化漏洞属于代码逻辑漏洞,利用难度更高、隐蔽性更强,很多开发者与安全初学者难以理解其底层原理。
本文从零讲解 PHP 序列化与反序列化的原生机制、漏洞成因、魔术方法触发原理、基础利用方式、常见漏洞链与防御方案,避开晦涩源码,用通俗逻辑带你彻底入门 PHP 反序列化,适配学习、面试、代码审计、护网场景。
【法律声明】⚠️本文仅用于企业授权环境下安全自查与网络安全学习,禁止在未授权网站、服务器构造反序列化载荷、测试漏洞、执行恶意代码。未经授权入侵计算机系统属于违法犯罪行为,请严格遵守《网络安全法》《刑法》相关法律法规。
一、什么是序列化与反序列化
序列化和反序列化是 PHP 自带的数据处理机制,核心作用是实现对象数据的存储与网络传输。因为 PHP 对象无法直接存入数据库、写入文件、网络传输,所以需要通过序列化转为字符串,使用时再还原为对象。
1.1 序列化(serialize)
定义:通过serialize()函数,将 PHP 对象、数组转换为结构化字符串。
作用:持久化保存对象的属性、数据,方便存储和传输。
示例代码:
<?php class Test{ public $cmd = "whoami"; } $a = new Test(); echo serialize($a); ?>输出序列化字符串:
O:4:"Test":1:{s:3:"cmd";s:6:"whoami";}1.2 反序列化(unserialize)
定义:通过unserialize()函数,将序列化字符串还原为原始 PHP 对象。
作用:读取存储 / 传输的字符串,恢复对象数据,供程序调用。
示例代码:
<?php $str = 'O:4:"Test":1:{s:3:"cmd";s:6:"whoami";}'; $obj = unserialize($str); echo $obj->cmd; ?>1.3 核心特点
- 序列化只保存对象属性,不保存方法;
- 反序列化还原对象后,可正常调用类中的魔术方法、公有方法;
- 整个过程默认无过滤、无校验,这是漏洞产生的根本前提。
二、反序列化漏洞核心成因
2.1 漏洞本质
用户可控参数 + 直接传入 unserialize () + 存在可利用魔术方法 = 反序列化漏洞
三个必备条件:
- 程序接收用户传入的序列化字符串(GET/POST/Cookie 可控);
- 后端直接将参数带入
unserialize()函数,无过滤、无白名单校验; - 代码中存在可被触发的魔术方法,且方法内存在危险操作(命令执行、文件读写、代码执行、删除文件等)。
2.2 关键误区
反序列化漏洞不是 unserialize 函数直接执行代码!
它只是还原对象,真正触发恶意操作的是自动执行的魔术方法。
三、PHP 常用魔术方法(漏洞核心触发点)
魔术方法是 PHP 类中以__开头的内置方法,无需手动调用,满足条件自动触发,是反序列化漏洞利用的核心。
3.1 高频触发魔术方法
- __wakeup()
反序列化还原对象瞬间自动触发,最核心、最常用的利用入口。 - __destruct()
对象销毁、脚本执行结束时自动触发。 - __toString()
对象被当做字符串使用时触发。 - __call()
调用不存在的方法时触发。 - __get()
读取不存在 / 私有属性时触发。 - __set()
赋值不存在 / 私有属性时触发。
3.2 漏洞触发流程(最简完整链路)
- 攻击者构造恶意类,写入危险操作(system、file_put_contents 等);
- 序列化恶意类,生成恶意 payload 字符串;
- 传入目标站点可控参数,后端 unserialize 还原恶意对象;
- 自动触发__wakeup /__destruct 等魔术方法;
- 执行内置恶意代码,实现命令执行、写木马、文件删除等攻击。
四、最简漏洞演示(零基础看懂 Getshell)
4.1 漏洞源码(存在缺陷)
<?php class Demo{ public $code; // 反序列化自动触发 function __wakeup(){ system($this->code); } } // 用户完全可控参数 $str = $_GET['data']; unserialize($str); ?>4.2 攻击者构造恶意 Payload
恶意代码:执行system('whoami')
构造恶意类并序列化:
<?php class Demo{ public $code = "whoami"; } echo serialize(new Demo()); ?>生成 Payload:
O:4:"Demo":1:{s:4:"code";s:6:"whoami";}4.3 漏洞利用
访问链接:
shturl.cc/MH8ilSbmX8PUklJ:"Demo":1:{s:4:"code";s:6:"whoami";}结果:反序列化还原对象,自动触发__wakeup,执行系统命令,漏洞利用成功。
五、常见反序列化利用场景
5.1 命令执行
魔术方法内调用system()、exec()、passthru(),传入可控属性实现任意命令执行。
5.2 写入 Webshell
利用file_put_contents()写入一句话木马:
file_put_contents("shell.php","<?php @eval($_POST['cmd']);?>");5.3 任意文件读取 / 删除
利用file_get_contents()读取敏感配置文件,或unlink()删除网站文件。
5.4 原生类利用(无源码场景)
即使网站无自定义漏洞类,可利用 PHP原生内置类触发漏洞,常见:
- Error、Exception 原生类 XSS
- SoapClient 原生类 SSRF
- Phar 伪协议搭配反序列化漏洞
六、常见绕过与漏洞进阶知识点
6.1 __wakeup 绕过(CVE-2016-7124)
漏洞条件:PHP5 < 5.6.25 、 PHP7 < 7.0.10
原理:序列化字符串中声明的对象属性数量 大于 实际属性数量,会跳过__wakeup()执行,依旧触发__destruct(),实现绕过。
6.2 字符逃逸绕过
部分站点会对传入参数进行过滤、转义(过滤引号、反斜杠),攻击者可利用字符逃逸篡改序列化结构,覆盖属性,实现任意代码执行。
6.3 Phar 反序列化
结合之前讲解的 phar:// 伪协议,文件包含 + phar 文件触发无参数反序列化,是护网实战高频利用方式。
七、反序列化漏洞黑盒 / 白盒审计思路
7.1 白盒审计(代码审计)
- 全局搜索
unserialize()函数,查找用户可控传入点; - 追踪对应类,查看是否存在魔术方法;
- 检测魔术方法内是否存在危险函数:system、exec、file_put_contents、eval 等;
- 确认参数是否可控、无过滤。
7.2 黑盒测试
- 寻找 Cookie、GET、POST 参数存在序列化字符串特征
O:xx:; - 尝试构造简单 payload 测试是否触发执行;
- 测试参数过滤、魔术方法绕过方式。
八、蓝队防御加固方案
8.1 代码层核心防御
- 禁止用户可控数据直接进入 unserialize 函数,这是最根本防御;
- 采用白名单机制,校验反序列化的类名,禁止未知类反序列化;
- 过滤、检测序列化恶意特征,拦截恶意对象载荷。
8.2 PHP 配置加固
- 升级 PHP 至最新版本,修复 wakeup 绕过等历史漏洞;
- 禁用危险函数,限制命令执行、文件操作权限。
8.3 业务层防御
- 敏感数据不使用序列化传输,改用 JSON 格式传输;
- 开启 WAF,拦截序列化攻击特征
O:数字:、恶意魔术方法载荷。
九、新手核心知识点总结
- 序列化:对象转字符串;反序列化:字符串还原对象;
- 漏洞核心:可控输入 + unserialize + 危险魔术方法;
- 漏洞触发不靠 unserialize 直接执行,靠自动触发的魔术方法;
- 防御核心:杜绝用户可控参数直接反序列化,优先使用 JSON 传输数据。
总结
PHP 反序列化漏洞是 Web 安全从入门到进阶的分水岭,区别于上传、文件包含等显性漏洞,它属于逻辑型漏洞。核心不在于工具利用,而在于理解魔术方法的自动触发机制、构造恶意载荷、适配各类绕过方式。
掌握反序列化原理,不仅能应对 CTF 题型、面试考点,更能看懂实战中 Phar 反序列化、原生类利用、漏洞链组合攻击,是成为中高级安全工程师的必备核心能力。
【免责声明】本文仅用于网络安全学习、企业授权环境安全自查。任何未经授权构造反序列化载荷、利用漏洞执行恶意代码、入侵计算机系统的行为,均触犯相关法律法规,一切非法操作后果由使用者自行承担,作者不承担任何法律责任。
最后
网络安全需要学习那些知识
网络安全零基础入门学习路线&规划
初级
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。
网络安全工程师企业级学习路线
视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
一些我自己买的、其他平台白嫖不到的视频教程:
要学习网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。
机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!
这份完整版的学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】