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

Fastjson反序列化

时间:2023-07-17 21:26:19浏览次数:35  
标签:Fastjson fastjson rmi Java json 字符串 序列化

Fastjson反序列化漏洞

fastjson是阿里巴巴公司推出的一个用于快速处理json数据的java类库,这个库由于在传输json数据的时候,中间有一个标识,这个标识允许用户传入一个类名,因此攻击者可以传入他想要执行的类,通过执行这个类,调用rmi方法,去执行他部署的一个恶意方法

json

一种特殊的数据格式,和各种数据格式转化的时候,稳定且友好

完全独立于编程语言的文本格式来存储和表示数据,易于人阅读和编写。同时也易于机器解析和生成。任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。

fastjson(alibaba)

fastjson这个类库可以很快速的对json数据进行转化

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

Fastjson 可以操作任何 java对象

AutoType

想要把java对象转换为json字符串可以有两种选择:1.基于属性2.基于setter/getter

​ fastjson在把对象转换为字符串时就是通过遍历该类目所有的getter方法进行的。

​ 但是当一个类只有一个接口的时候在使用这个进行序列化的时候,就会将子类抹去只保留接口的类型,最后导致反序列化无法得到原始类型。

​ 那为了解决这个问题就是引进了autotype(在序列化时,把原始类型记录下来)。它使用的方法是SerializerFeature.WriteClassName进行标记的。

使用SerializerFeature.WriteClassName进行标记后,JSON字符串中多出了一个@type字段,标注了类对应的原始类型,方便在反序列化的时候定位到具体类型

​ 也正是因为引进了autotype才导致了漏洞!

漏洞原理

因为引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到type到内容,将json内容反序列化为java对象并调用这个类的setter方法。

那是不是可以利用这个特性,自己构造json字符串然后使用@Type标记指定一个自己想要使用的攻击类库。然后fastjson会自己构造的json字符串反序列化然后执行。

1.攻击者访问目标网站,通过burpsuite抓包,以json格式添加jdbcrowsetlmpl恶意类信息发送给目标机。

2.目标机对json反序列化时候,会加载执行攻击者构造的信息(访问rmi服务器),rmi给靶机下发命令。

\3. 靶机得到rmi的服务的相应,去执行dnslog类。

poc

image

1、 需要有一个恶意方法

2、 java源代码利用javac编译生成class后缀的文件

3、 攻击者需要有一个rmi的服务

4、 先用python启动一个web服务。8088

5、 利用marshalsec-0.0.3-SNAPSHOT-all.jar工具在9001端口启动一个rmi服务,这个rmi启动需要依赖web

rmi

RMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。

防护

image

image

神奇的L;

image

标签:Fastjson,fastjson,rmi,Java,json,字符串,序列化
From: https://www.cnblogs.com/2210z/p/17561227.html

相关文章

  • 【补充】Django自带的序列化组件
    【11.0补充】Django自带的序列化组件【一】准备数据fromdjango.dbimportmodels#Createyourmodelshere.classUser(models.Model):username=models.CharField(max_length=32,verbose_name="姓名")age=models.IntegerField(verbose_name="年龄")g......
  • redis序列化配置
    redis序列化配置@ConfigurationpublicclassRedisTemplateConfiguration{/***@paramredisConnectionFactory*@return*/@BeanpublicRedisTemplate<Object,Object>redisTemplate(RedisConnectionFactoryredisConnectionFactory){......
  • java序列化和反序列化
    感觉网上很多博客对这个的解释实在太官方了,也没说为什么一定要实现序列化接口。去看看rpc框架源码,或者java网络编程或者向磁盘进行序列化就知道了。首先这是个标记接口,就是用来告诉程序某某对象是可序列化对象,像dubbo框架,要传输对象就必须序列化。网络编程已经告诉你了,想要向另......
  • Json.NET反序列化漏洞生成Ysoserial攻击Payload
    Ysoserial.Net只提供序列化之后的Payload主体,具体执行的命令从外部输入,实现代码清单如下Stringpayload=@"{    '$type':'System.Windows.Data.ObjectDataProvider,PresentationFramework,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35',  ......
  • CTFer成长记录——CTF之Web专题·初识反序列化
    一、题目链接http://122.114.252.87:1110/index2.php前置知识:序列化与反序列化序列化是将变量转换成可保存或传输的字符串,实现函数是:serialize();反序列化是:将字符串转换成变量,是一个逆过程。实现的函数式:unserialize();序列化:上面的结果是对一个对象的打印,后面是序列化......
  • 畅捷通T+ GetStoreWarehouseByStore 反序列化分析
    漏洞描述畅捷通T+前台存在反序列化漏洞,攻击者可直接利用此漏洞执行任意命令影响版本T+13.0、T+16.0漏洞分析漏洞主要是因为ajaxPro组件存在CVE-2021-23758,但是这个漏洞有个要求是传输的参数类型必须是object通过反编译App_Code.dll的Ufida.T.CodeBehind._PriorityLevel中G......
  • jboss JMXInvokerServlet反序列化漏洞
    jmxinvokerservlet反序列化漏洞描述:JBOSS在/invoker/jmxinvokerservlet请求中读取了用户传入的对象,可利用apachecommonscollections中的gadget执行任意代码CommonCollectionGadget主要是由ConstantTransformer,InvokerTransformer,ChainedTransformer构成。gadget主要通过Transfor......
  • 在Unity3D中使用ScriptableObject进行序列化
    ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法1.usingUnityEngine;......
  • Java反序列化:URLDNS的反序列化调试分析
    URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。一.Java反序列化前置知识Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject方法实现Serializable接口,将对象转化成字节......
  • 解决redis hash序列化报错的具体操作步骤
    RedisHash序列化报错的解决方法1.问题背景在使用Redis时,有时候会遇到Hash序列化报错的问题。这种问题通常是由于Redis中存储的数据类型与操作的数据类型不一致导致的。在下面的文章中,我将为你详细介绍解决这个问题的步骤和相应的代码示例。2.解决步骤步骤操作1.查......