不安全的反序列化 (Insecure Deserialization)
序列化 (Serialization) 是将某些对象转换为稍后可以恢复的数据格式的过程。人们经常序列化对象以便将其保存到存储中,或作为通信的一部分发送。反序列化 (Deserialization) 是该过程的反向操作——从某种格式的数据结构中提取数据,并将其重建为对象。 —— OWASP
摘要 (Summary)
反序列化标识符 (Deserialization Identifier)
检查以下在其他章节中的子部分:
- Java 反序列化:ysoserial, ...
- PHP (对象注入):phpggc, ...
- Ruby:通用 RCE gadget, ...
- Python:pickle, PyYAML, ...
- .NET:ysoserial.net, ...
| 对象类型 | 头部 (十六进制) | 头部 (Base64) | 指标 (Indicators) |
|---|---|---|---|
| .NET ViewState | FF 01 |
/w |
通常出现在 HTML 表单周围的隐藏输入中 |
| BinaryFormatter | 0001 0000 00FF FFFF FF01 |
AAEAAAD |
对 Base64 编码解码后,检查是否存在长的 FF FF FF FF 序列。 |
| Java 序列化数据 | AC ED |
rO |
对 Base64 编码解码后,检查前几个字节。 |
| PHP 序列化数据 | 4F 3A |
Tz |
前缀如 O:, a:, s:, i:, b: 以及长度指示符。 |
| Python Pickle | 80 04 95 |
gASV |
文本:操作码如 (lp0, S'Test'。 |
| Ruby Marshal | 04 08 |
BAgK |
对 Base64 编码解码后,检查开头是否存在 \x04\x08。 |
POP Gadget (POP Gadgets)
POP (Property Oriented Programming,面向属性编程) Gadget 是由应用程序类实现的一段代码,可以在反序列化过程中被调用。
POP gadget 特性:
- 可被序列化
- 具有公开/可访问的属性
- 实现了特定的易受攻击的方法
- 具有访问其他“可调用”类的权限
实验环境 (Labs)
- PortSwigger - 修改序列化对象
- PortSwigger - 修改序列化数据类型
- PortSwigger - 使用应用程序功能利用不安全的反序列化
- PortSwigger - PHP 中的任意对象注入
- PortSwigger - 使用 Apache Commons 利用 Java 反序列化
- PortSwigger - 使用预构建的 Gadget 链利用 PHP 反序列化
- PortSwigger - 使用已记录的 Gadget 链利用 Ruby 反序列化
- PortSwigger - 为 Java 反序列化开发自定义 Gadget 链
- PortSwigger - 为 PHP 反序列化开发自定义 Gadget 链
- PortSwigger - 使用 PHAR 反序列化部署自定义 Gadget 链
- NickstaDB - DeserLab