跳到主要内容

反序列化

漏洞描述

php反序列化

当程序使用unserialize()函数处理用户可控的序列化数据时,攻击者可以构造特殊的序列化字符串,在反序列化过程中触发PHP对象中的魔术方法(如__wakeup()__destruct()等)或利用PHP特性(如SoapClient、Phar等)实现任意代码执行、文件操作等恶意行为

触发流程:恶意序列化数据 → 反序列化 → 执行魔术方法 → 触发调用链→ RCE/其他恶意操作

JAVA反序列化

Java反序列化漏洞的核心原理是:当程序反序列化不可信的输入数据时,攻击者可以构造特殊的序列化对象,在反序列化过程中触发Java对象中的危险方法调用链(Gadget Chain),最终实现任意代码执行或其他恶意操作。

触发流程:恶意序列化数据 → 反序列化 → 执行readObject() → 触发调用链→ RCE/其他恶意操作

漏洞例子

Shiro rememberMe反序列化漏洞

修复建议

  1. 避免反序列化不可信数据
  2. 白名单验证
  3. 及时更新依赖库
  4. 对序列化数据进行数字签名验证
  5. 使用Java Agent监控危险方法调用

绕过手段

1. 白名单绕过技术

(1)利用未在防御名单中的Gadget链

  • 不断发现新的可利用类组合
  • 如:利用java.util.logging.Loggerjavax.swing等JDK内置类

(2)类加载技巧

  • 通过ClassLoader动态加载恶意类
  • 如:URLClassLoader加载远程类

(3)内存马注入

  • 不直接执行代码,而是注入内存webshell

2. JEP 290绕过

(1)利用数组类型绕过

(2)利用Proxy对象

  • 通过动态代理隐藏真实类型

(3)反射调用

  • 在允许的类中使用反射调用危险方法