反序列化与 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 反序列化漏洞。

核心思路:

  1. Shiro 的 RememberMe Cookie 中保存序列化数据。
  2. 数据经过 AES 加密。
  3. 旧版本默认密钥泄露或使用固定密钥。
  4. 攻击者用已知密钥加密恶意序列化 payload。
  5. 服务端解密后反序列化,触发利用链,造成命令执行。

面试保守回答

1
2
3
4
5
反序列化漏洞我了解基础原理。它的核心是程序反序列化了用户可控的不可信数据,攻击者构造特殊对象,在反序列化过程中触发魔术方法或利用链,造成代码执行等问题。

PHP 中常见是 unserialize 配合 __wakeup、__destruct 等魔术方法和 POP 链;Java 中常见是 readObject 和依赖库 gadget 链。

Shiro-550 我了解是 Apache Shiro RememberMe 相关的 Java 反序列化漏洞,攻击者利用已知 AES 密钥构造恶意 RememberMe Cookie,服务端解密后反序列化触发利用链,可能造成命令执行。

修复方案

  • 不反序列化不可信数据。
  • 使用 JSON 等更安全的数据格式。
  • 对可反序列化类做白名单限制。
  • 升级组件版本。
  • 修改 Shiro 默认密钥。
  • 禁用 RememberMe 或加强 Cookie 安全。
  • 部署依赖库漏洞检测。