当前位置:   article > 正文

[Java安全]Fastjson>=1.2.36$ref引用可触发get方法分析_java 解析 json $ref语法

java 解析 json $ref语法

写在前面

平时我们在处理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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

触发

    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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5

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

$ref引用触发get方法分析

简简单单引入依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.36</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

老规矩拉到底,看看调用栈再分析
在这里插入图片描述
跟进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对象,那就结束了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/991133
推荐阅读
相关标签
  

闽ICP备14008679号