免责申明
本文仅是用于学习检测自己搭建的靶场环境有关FastJson1反序列化漏洞的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《中华人民共和国网络安全法》及其所在国家地区相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 如您继续阅读该文章即表明您默认遵守该内容。
一、FastJson1介绍
1.1、FastJson简介
FastJson 是阿里巴巴公司使用 Java语言编写开源的高性能 JSON 库,主要是用于数据在 Json 和 Java Object之间相互转换。它没有用Java的序列化机制,而是他们自定义了一套序列化机制(JSON.toJSONString 和 JSON.parseObject/JSON.parse这个两个接口,分别实现序列化和反序列化)。
https://github.com/alibaba/fastjsonhttps://github.com/alibaba/fastjson
1.2、Fastjson反序列化漏洞原理
FastJson为了知道提交过来的数据是什么类型,特别增加了自动类型(autotype
)逻辑(即:每次都需要读取【@type】属性造成该漏洞;Fastjson反序列化的Gadget需要无参默认构造方法或者注解指定构造方法并添加相应参数。使用Feature.SupportNonPublicField才能打开非公有属性的反序列化处理,@type可以指定反序列化任意类调用其set,get,is方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值,由此攻击者可构造出一些恶意利用链)。
攻击者准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制的rmi服务器,JNDI接口向攻击者控制的web服务器远程加载恶意代码,执行构造函数形成RCE。
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
序号 | Java接口 | 说明 |
JNDI | JNDI 包含在 Java SE 平台中。要使用 JNDI,您必须具有 JNDI 类和一个或多个服务提供者。JDK 包括【LDAP、DNS、NIS、NDS、RMI、CORBA】命名/目录服务的服务提供商 搞懂JNDIhttps://fynch3r.github.io/%E6%90%9E%E6%87%82JNDI/ | |
1 | LDAP | 轻量级目录访问协议 |
2 |