反序列化原理与风险

理解序列化与反序列化的用途、为什么反序列化会成为 RCE 入口、常见语言与场景,以及签名、白名单、最小化解析等防御方法。

写在前面:合法学习边界

本文讲解反序列化漏洞的原理与防御。不要对真实系统构造恶意序列化数据。所有验证只能在自建靶场或明确授权的测试环境中进行。

一、序列化是干什么的

程序里的对象只存在于内存中,离开进程就没法保存或传输。序列化就是把对象转成字节或字符串,反序列化就是把它们变回对象。

典型用途:

1
2
3
把对象存进数据库、缓存
对象在网络间传递
前后端交换复杂数据

序列化本身不是坏事,问题出在反序列化时是否信任了来源

二、为什么反序列化会危险

反序列化不是简单“读回数据”,很多语言在反序列化时会执行类构造、魔术方法甚至任意类方法。

如果攻击者能控制反序列化的内容,就可能:

1
2
3
4
触发危险方法链
读写任意文件
执行系统命令
造成 RCE

常见的危险场景集中在:

1
2
3
4
Java 的 readObject / ysoserial 链
Python 的 pickle
PHP 的 unserialize + 魔术方法
Ruby 的 Marshal.load

一句关键的话:反序列化等于在“加载代码路径”,不是加载数据

三、哪些入口最容易被利用

1
2
3
4
接收序列化数据的接口
加密 Cookie 里存了对象
消息队列、缓存里传对象
日志或报告功能解析对象

尤其要注意:某些系统把对象序列化后 Base64 放进 Cookie,如果密钥泄露或逻辑校验缺失,等于把“执行入口”交给攻击者。

影响与危害

反序列化漏洞能造成:

1
2
3
4
远程代码执行(RCE)
任意文件读写
服务器被完全控制
内网横向移动

风险等级:严重。它往往能直接绕过大部分输入校验。

四、防御思路

1. 别反序列化不可信数据

能用 JSON、纯数据格式就用它们,能少用原生反序列化就少用。

2. 校验与签名

1
2
3
对序列化内容加签名/HMAC
校验版本和类型白名单
拒绝未知类

3. 白名单类过滤

明确允许哪些类可以反序列化,而不是黑名单。黑名单永远追不上新 gadget。

4. 隔离与最小权限

1
2
3
反序列化进程用最小权限运行
沙箱或独立环境解析
限制文件系统、网络访问

5. 审计

关注异常反序列化请求、非常规类名、异常异常栈。

修复

1
2
3
4
5
不使用原生反序列化处理不可信数据
对序列化内容加签名/HMAC
反序列化做类白名单
以最小权限、隔离环境运行解析进程
修复后复测:构造对象不再执行

五、报告中的正确写法

示例:

1
2
3
发现:Cookie 中存放 Base64 编码的序列化对象,反序列化未做类白名单校验,存在可利用链。
风险:攻击者可能构造恶意对象导致命令执行。
建议:改用不可执行数据格式;对数据加签名;反序列化做类白名单;以最小权限运行。

报告要写清“入口、是否可验证、影响、修复优先级”,而不是只写“存在反序列化风险”。

六、小结

反序列化的本质是“加载代码路径”。它比参数注入更危险,因为它能绕过很多输入校验。把“反序列化 = 执行入口”记在心里,才会谨慎对待每一个序列化来源。