写在前面:合法学习边界
本文讲解反序列化漏洞的原理与防御。不要对真实系统构造恶意序列化数据。所有验证只能在自建靶场或明确授权的测试环境中进行。
一、序列化是干什么的
程序里的对象只存在于内存中,离开进程就没法保存或传输。序列化就是把对象转成字节或字符串,反序列化就是把它们变回对象。
典型用途:
| |
序列化本身不是坏事,问题出在反序列化时是否信任了来源。
二、为什么反序列化会危险
反序列化不是简单“读回数据”,很多语言在反序列化时会执行类构造、魔术方法甚至任意类方法。
如果攻击者能控制反序列化的内容,就可能:
| |
常见的危险场景集中在:
| |
一句关键的话:反序列化等于在“加载代码路径”,不是加载数据。
三、哪些入口最容易被利用
| |
尤其要注意:某些系统把对象序列化后 Base64 放进 Cookie,如果密钥泄露或逻辑校验缺失,等于把“执行入口”交给攻击者。
影响与危害
反序列化漏洞能造成:
| |
风险等级:严重。它往往能直接绕过大部分输入校验。
四、防御思路
1. 别反序列化不可信数据
能用 JSON、纯数据格式就用它们,能少用原生反序列化就少用。
2. 校验与签名
| |
3. 白名单类过滤
明确允许哪些类可以反序列化,而不是黑名单。黑名单永远追不上新 gadget。
4. 隔离与最小权限
| |
5. 审计
关注异常反序列化请求、非常规类名、异常异常栈。
修复
| |
五、报告中的正确写法
示例:
| |
报告要写清“入口、是否可验证、影响、修复优先级”,而不是只写“存在反序列化风险”。
六、小结
反序列化的本质是“加载代码路径”。它比参数注入更危险,因为它能绕过很多输入校验。把“反序列化 = 执行入口”记在心里,才会谨慎对待每一个序列化来源。