反序列化与 Shiro-550
面试官想考什么
- 是否理解反序列化漏洞的本质。
- 是否区分 PHP、Java、.NET 等不同场景。
- 是否听过 Shiro-550 这类经典漏洞。
反序列化一句话定义
1 | 反序列化漏洞是程序反序列化不可信数据时,攻击者构造恶意对象,触发魔术方法或利用链,导致代码执行、命令执行或其他安全问题。 |
PHP 反序列化关键点
serialize()。unserialize()。- 魔术方法:
__construct__destruct__wakeup__toString__call
- POP 链:通过已有类的方法调用链触发危险操作。
Java 反序列化关键点
readObject()。- 序列化数据可控。
- classpath 中存在可利用 gadget 链。
- 常见工具:ysoserial。
Shiro-550 是什么
Apache Shiro 是 Java 安全框架。Shiro-550 通常指 Shiro RememberMe 反序列化漏洞。
核心思路:
- Shiro 的 RememberMe Cookie 中保存序列化数据。
- 数据经过 AES 加密。
- 旧版本默认密钥泄露或使用固定密钥。
- 攻击者用已知密钥加密恶意序列化 payload。
- 服务端解密后反序列化,触发利用链,造成命令执行。
面试保守回答
1 | 反序列化漏洞我了解基础原理。它的核心是程序反序列化了用户可控的不可信数据,攻击者构造特殊对象,在反序列化过程中触发魔术方法或利用链,造成代码执行等问题。 |
修复方案
- 不反序列化不可信数据。
- 使用 JSON 等更安全的数据格式。
- 对可反序列化类做白名单限制。
- 升级组件版本。
- 修改 Shiro 默认密钥。
- 禁用 RememberMe 或加强 Cookie 安全。
- 部署依赖库漏洞检测。