反序列化
漏洞描述
php反序列化
当程序使用unserialize()函数处理用户可控的序列化数据时,攻击者可以构造特殊的序列化字符串,在反序列化过程中触发PHP对象中的魔术方法(如__wakeup()、__destruct()等)或利用PHP特性(如SoapClient、Phar等)实现任意代码执行、文件操作等恶意行为
触发流程:恶意序列化数据 → 反序列化 → 执行魔术方法 → 触发调用链→ RCE/其他恶意操作
JAVA反序列化
Java反序列化漏洞的核心原理是:当程序反序列化不可信的输入数据时,攻击者可以构造特殊的序列化对象,在反序列化过程中触发Java对象中的危险方法调用链(Gadget Chain),最终实现任意代码执行或其他恶意操作。
触发流程:恶意序列化数据 → 反序列化 → 执行readObject() → 触发调用链→ RCE/其他恶意操作
漏洞例子
Shiro rememberMe反序列化漏洞
修复建议
- 避免反序列化不可信数据
 - 白名单验证
 - 及时更新依赖库
 - 对序列化数据进行数字签名验证
 - 使用Java Agent 监控危险方法调用
 
绕过手段
1. 白名单绕过技术
(1)利用未在防御名单中的Gadget链
- 不断发现新的可利用类组合
 - 如:利用
java.util.logging.Logger、javax.swing等JDK内置类 
(2)类加载技巧
- 通过
ClassLoader动态加载恶意类 - 如:
URLClassLoader加载远程类 
(3)内存马注入
- 不直接执行代码,而是注入内存webshell
 
2. JEP 290绕过
(1)利用数组类型绕过
(2)利用Proxy对象
- 通过动态代理隐藏真实类型
 
(3)反射调用
- 在允许的类中使用反射调用危险方法