1.fastjson 1.2.24源码分析以及漏洞复现
2.å»ç设å¤ç®¡çç³»ç»
3.fastjson埋的源码「坑」,fastjson2.0能拯救吗?
4.Fastjson库parseObject/parseArray方法:表字段名和实体类属性的下载智能匹配研究(源码向)
5.002、Spring Boot返回Json数据及数据封装
6.教你如何用 IDEA 反编译 jar 源码解读
fastjson 1.2.24源码分析以及漏洞复现
反序列化,源码这个过程将字节序列恢复为Java对象。下载例如在使用Python做自动化测试时,源码通过字符串名字调用相同名字的下载flashftp上传源码教程方法。Fastjson的源码功能允许通过字符串引用如`@type":"com.sun.rowset.JdbcRowSetImpl`来执行内部方法。由此,下载我们能利用Fastjson提供的源码便利,通过调用对应的下载函数来验证漏洞。
在渗透测试中,源码漏洞的下载验证通常需要满足几个条件:判断指纹和指纹回显,Fastjson的源码特性使得这一步变得简单。然而,下载在利用过程中,源码要考虑到Fastjson本身的限制、JDK的限制以及可能的安全配置限制。因此,POC验证方案需考虑这些限制的版本和配置。
Fastjson通过JSON抽象类实现JSONAware接口,并提供两个常用方法:`toJSONString`用于对象转换为JsonString,`parseObject`用于将JSON字符串转换为对象。这次的漏洞主要与反序列化相关。
反序列化的执行发生在`DefaultJSONParser.java`类中。关键代码中,固定键`@type`对应反序列化类的全路径,其中`typeName`为传入类的全路径。在Fastjson 1.2.版本中,`loadClass`方法未进行任何过滤,允许传入任何JVM加载的类,并执行`setKey`方法,其中Key为可变参数。
要利用这个反序列化漏洞,需要满足以下条件:JVM加载的类、有非静态set方法和传入一个参数。postman源码解析使用RPC远程执行代码的思路实现POC,此处使用了`com.sun.rowset.JdbcRowSetImpl`实现。
JNDI全称为Java Naming and Directory Interface,主要提供应用程序资源命名与目录服务。其底层实现之一是RMI(Remote Method Invocation),用于Java环境的远程方法调用。在`com.sun.rowset.JdbcRowSetImpl`类中,关注点在于`getDataSourceName()`和`setAutoCommit()`方法。`getDataSourceName()`用于传值,`setAutoCommit()`用于确认调用set方法。
实现过程包括引用`com.sun.rowset.JdbcRowSetImpl`类、设置`dataSourceName`传值以及通过`autoCommit`属性触发执行方法。完成方法确认后,使用`marshalsec`项目启动RMI服务并加载远程类。
POC的实现步骤如下:首先确认目标是否使用Fastjson且存在漏洞;利用Fastjson的反序列化功能传输引用类和执行方法;使用`com.sun.rowset.JdbcRowSetImpl`执行验证POC的脚本,并观察回显结果;最后,完成漏洞利用。
具体操作包括搭建环境,如使用CentOS虚拟机作为RMI服务器和远程调用服务,KALI机器作为靶机和抓包测试。进行指纹确认、安装maven、构建RMI服务器和客户端、调用测试文件,并观察DNS日志以验证漏洞成功利用。通过DNS日志确认漏洞利用成功后,可以进一步尝试反弹shell,实现远程控制。
综上所述,Fastjson的反序列化漏洞是一个可以被利用的安全问题,通过合理的利用,可以实现远程代码执行。了解和研究这类漏洞有助于增强对Fastjson以及类似技术的防御能力。
å»ç设å¤ç®¡çç³»ç»
å»ç设å¤ç®¡çç³»ç»æºç ï¼å»é¢å»ç设å¤ç®¡çç³»ç»æºç å è´¹å享使ç¨ææ¯ï¼Spring Bootï¼Apache Shiroï¼Thymeleafï¼MyBatisï¼
æ°æ®åºè¿æ¥æ± ï¼Druidï¼Fastjsonã
æ建ç¯å¢ï¼ideaãjava1.8ãmysql5.7 maven3
å»é¢ 设å¤ç®¡ç ç³»ç»æ¯å©ç¨è®¡ç®æºç¡¬ä»¶ã软件ãç½ç»è®¾å¤é信设å¤ä»¥åå ¶ä»åå ¬è®¾å¤ï¼è¿è¡è®¾å¤è¿è¡ä¿¡æ¯çæ¶éãä¼ è¾ãå å·¥ãå¨åãæ´æ°åç»´æ¤ï¼ä»¥æé«è®¾å¤å©ç¨æç为ç®çï¼æ¯æé«å±å³çãä¸å±æ§å¶ãåºå±è¿ä½çéæåçè®¾å¤ ä¿¡æ¯ç®¡çå¹³å° ã
ç³»ç»ä¸»è¦åè½ï¼ç»éï¼æ³¨åï¼ç³»ç»ç¨æ·ç®¡çï¼è§è²ï¼é¨é¨ç®¡çï¼è®¾å¤å¢å æ¹æ¥ã
ç³»ç»åè½ç®ä»ï¼
1ã ç³»ç»ç®¡çï¼ ç¨æ·ç®¡çãè§è²ç®¡çãèå管çãé¨é¨ç®¡çãå²ä½ç®¡çãåå ¸ç®¡çãåæ°è®¾ç½®ãéç¥å ¬åãæ¥å¿ç®¡ççã
2ã ç³»ç»çæ§ï¼å®æ¶çæ§è®¾å¤è¿è¡ãå¾ æºãè°è¯ãå ³æºãåæºçç¶æï¼è®°å½è®¾å¤æ£å¸¸å·¥ä½æ¶é´ã
3ã设å¤ç®¡çï¼è®¾å¤ä¿¡æ¯ç®¡çï¼å æ¬è®¾å¤å称ã设å¤ç¼å·ã设å¤ä»·æ ¼ã设å¤å家ãå家çµè¯ãæ¯å¦é«å¼ã设å¤ç¶æãè´ç½®æ¥æãå项ç¼è¾æä½çï¼
fastjson埋的hashmap源码图「坑」,fastjson2.0能拯救吗?
欢迎阅读,我是马建仓。
在数据交互中,JSON因其跨语言、跨平台的特性而成为数据交换的首选。在Java领域,主流的JSON库包括三个:
快json的发展历程颇具传奇色彩。年,阿里巴巴资深技术专家温绍锦(花名:高铁),在搜索后发现缺少一款性能优秀的JSON解析库,于是开始开发一个高性能的解析器——快json,以满足阿里巴巴B2B平台技术部在应用监控系统Dragoon中的需求。自此,快json成为Java程序员广泛使用的国产类库。
然而,随着时间的推移,快json频繁曝出安全漏洞,一度成为网络热议的对象。年8月,高铁在阿里巴巴内网上公开回应争议。快json之所以频繁出错,部分原因在于其自动类型识别功能(AutoType)在年至年间进行了升级。
为了解决这些问题,高铁在4月底正式开源了快json v2,以全面升级和修复原有版本。如今,快json v2已通过Gitee官方推荐。开发者可通过访问项目地址,与作者直接交流或自行测试,以了解快json v2的性能提升。
快json v2的目标是为下一个十年提供高性能的JSON库。它与原始版本共享同一API体系,且已经解决了Auto Type RCE问题。
快json v2的源码熊账号性能提升体现在多个方面。在搭建测试环境和添加依赖时,用户需注意快json v2的GroupId与1.x版本不同,为com.alibaba.fastjson2。Maven依赖和Gradle依赖的格式已相应调整。此外,项目可根据实际需求选择不同的模块,如使用兼容包、fastjson-kotlin模块或fastjson-extension模块与SpringFramework等框架集成。
对于性能测试,用户应先搭建测试环境,添加对应依赖,再进行实际测试。在不同模块的源码获取方面,用户可直接访问项目仓库。针对快json v2的测试效果,用户可通过实际测试进行验证。如遇到疑问或发现BUG,用户可以直接在项目仓库与作者沟通。
Fastjson库parseObject/parseArray方法:表字段名和实体类属性的智能匹配研究(源码向)
项目中,数据来源从数据库转向HTTP请求获取JSON,面对无需mybatis映射的问题,团队成员产生了疑问:在未配置映射的情况下,实体类属性的驼峰命名与JSON键的任意书写为何能实现智能匹配?
深入分析Fastjson库源码,发现其确实具备智能匹配机制。以parseArray方法为例,首先解析JSON数据,其核心在于文本解析器lexer,它与智能匹配功能紧密相关。最终,解析流程导向JavaBeanDeserializer类中的parseField方法,此方法是智能匹配的关键所在。
进入parseField方法,可窥见其分段处理逻辑:首先通过TypeUtils工具类的fnv1a__lower和fnv1a__extract方法处理JSON键,通过哈希值比较实现初步匹配。nacos 源码配置fnv1a__extract通过去除下划线、短横线及大写字符,实现字符格式化处理,以适应常见的驼峰命名规则。
进一步深入,smartMatch方法在处理过程中,先通过fnv1a__lower进行大小写转换,再利用Arrays.binarySearch进行二分查找,以高效定位匹配项。当查找失败,即返回负值时,通过fnv1a__extract方法进一步去除下划线和短横线,实现对标准命名规则的适应。
增加理解维度,smartMatch方法后续逻辑涉及对特定前缀如“is”的处理,允许在以“is”开头的键匹配时,跳过“is”部分进行匹配,确保JSON中的“isName”也能与数据表字段正确关联。
综上,Fastjson库在反序列化过程中,通过一系列逻辑处理实现对表字段名和实体类属性的智能匹配。具体步骤如下:
1. 首先,将JSON键转为小写,检查是否直接匹配表字段。若匹配,后续处理;若未匹配,继续下一步。
2. 然后,去除JSON键中的下划线和短横线,转为小写,再次检查与表字段的匹配情况。如匹配,后续处理;若未匹配且键以“is”开头,执行第三步。
3. 最终,对于以“is”开头的键,在去除“is”后再次尝试匹配,确保所有可能的匹配关系得到考虑。
、Spring Boot返回Json数据及数据封装
在项目开发中,接口与接口之间,前后端之间数据的传输都使用 Json 格式。Spring Boot 中,接口返回 Json 格式的数据很简单,在 Controller 中使用 @RestController 注解即可返回 Json 格式的数据。@RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解。默认情况下,使用 @RestController 注解即可将返回的数据结构转换成 Json 格式。Spring Boot 中默认使用的 Json 解析技术框架是 jackson。使用 @RestController 注解可以方便地返回 Json 数据。
Spring Boot 中对依赖都做了很好的封装。我们可以查看 pom.xml 中的 spring-boot-starter-web 依赖,可以看到一个 spring-boot-starter-json 依赖。Spring Boot 的特点之一是不需要人为去引入很多相关的依赖。我们可以再次点进去上面这个 spring-boot-starter-json 依赖,查看其内容。Spring Boot 中默认使用的 json 解析框架是 jackson。
在实际项目中,常用的数据结构无非有类对象、List 对象、Map 对象。默认的 jackson 框架对这三个常用的数据结构转成 json 后的格式如何?我们可以通过测试来验证。在 Controller 类中,我们可以分别返回 User 对象、List 和 Map。然后在浏览器中输入不同的 URL 来测试效果。我们看到,map 中不管是什么数据类型,都可以转成相应的 json 格式。这样就非常方便。
在实际项目中,我们难免会遇到一些 null 值出现。我们转 json 时,是不希望有这些 null 出现的。比如我们期望所有的 null 在转 json 时都变成 "" 这种空字符串。在 Spring Boot 中,我们可以通过配置来实现。我们可以新建一个 jackson 的配置类,修改返回 map 的接口,将几个值改成 null 进行测试。重启项目,再次输入 URL,可以看到 jackson 已经将所有 null 字段转成了空字符串了。
阿里巴巴的 FastJson 也常用于项目中 json 转换的相关工作。jackson 和 fastJson 的区别在于:上手难易程度、高级特性支持、官方文档、Example 支持和处理 json 速度。在扩展上,fastJson 没有 jackson 灵活,从速度或者上手难度来看,fastJson 可以考虑。在项目中使用的是阿里的 fastJson,挺方便的。使用 fastJson 需要导入依赖,版本为 1.2.。使用 fastJson 时,对 null 的处理和 jackson 有些不同。
为了在返回的 json 中添加一些其他信息,比如返回一些状态码 code 和返回一些 msg 给调用者,我们需要封装一个统一的 json 返回结构。这使得返回的 json 数据信息更加完整。我们定义了一个统一的 json 结构,包括数据、状态码、提示信息,并且可以根据实际业务需求做相应的添加。在 Controller 中,我们可以使用泛型来方便地返回各种数据类型。通过封装,我们不仅将数据通过 json 传给前端或者其他接口,还带上了状态码和提示信息。这在实际项目场景中应用非常广泛。
总结,本节详细分析了 Spring Boot 中 json 数据的返回。从默认的 jackson 框架到阿里巴巴的 fastJson 框架,我们对它们的配置进行了相应的讲解。另外,结合实际项目情况,我们总结了实际项目中使用的 json 封装结构体,加入了状态码和提示信息,使得返回的 json 数据信息更加完整。课程源代码下载地址:[课程源代码下载](链接)。
教你如何用 IDEA 反编译 jar 源码解读
要快速查看并解读 jar 包中的 class 源码,使用 IntelliJ IDEA (简称 IDEA) 是一个高效便捷的选择。只需几步操作,就能轻松反编译并阅读类源码。以下步骤指导你如何操作。
首先,确保你的本地 Maven 仓库已包含 jar 包。这里以阿里巴巴的 fastjson 包为例,其版本号为 1.2.。你可以在本地 .m2 仓库中找到并选择任意一个 jar 包。
接着,使用 WinRAR 或其他解压工具,将选中的 jar 包解压至当前文件夹中。解压后,你将看到一个名为 fastjson 的文件夹。
在解压出的 fastjson 文件夹内,寻找 JSON.class 文件。找到文件后,直接将鼠标拖拽至 IDEA 编辑器中即可。至此,你已成功反编译并打开了 jar 包中的源码。
这个方法简便高效,适用于快速查看和理解 jar 包内类的实现细节。通过这种方式,你不仅能更直观地了解代码逻辑,还有助于解决实际开发中遇到的问题。
来源:toutiao.com/i...
fastjson的toJSONString()对于时间类的特殊处理源码分析——《DEEPNOVA开发者社区》
作者:贺子江
背景介绍
本文是在项目迭代过程中,针对fastjson库在时间类型处理上发现的一系列问题而进行的源码分析。通过案例分析和深入代码探索,揭示了fastjson对于时间类的特殊处理机制。
案例分析
在实际项目使用中,我们遇到了一个出乎意料的情况:对于Timestamp类型的toJSONString()方法调用,并没有按照预期输出Timestamp对象的toString信息,而是直接输出了时间戳的long值。经过复现问题并单独测试,我们明确了预期结果与实际输出之间的差异。
深入debug与代码分析
面对这一情况,首先产生了fastjson可能存在bug的初步怀疑。为了验证这一猜想,我们通过调用栈追踪,深入到fastjson的实现层。在序列化流程中,一个名为ObjectSerializer的接口被关键地调用。经过详细分析,我们发现Timestamp类型的序列化逻辑由DateCodec类负责。进一步追踪DateCodec的实现,我们发现了一系列if-else判断的逻辑,用于处理继承自Date类的类的序列化操作。关键在于,fastjson对于date类的实现有特殊的序列化策略,这需要特定的配置来实现正常的toJSONString功能。
解决方案研究
为了克服这一问题,我们提出了两个解决方案。第一,避免直接使用原生的日期类型,而是使用string形式进行表示,以确保输出符合预期。第二,配置fastjson的SerializerFeature,使用fastjson提供的类进行日期的特殊处理。
方案对比
通过实验验证,我们比较了两种方案的执行效率。第一种方案中,使用自定义的toString方法替代原生日期输出,执行时间约为ms。第二种方案下,通过配置SerializerFeature实现日期处理,执行时间约为ms。
结论
fastjson在处理时间类型方面,并没有展现出明显的优势。对于时间类型的打印,我们建议在业务层面对时间进行适当的转换和处理,以确保输出的格式既直观又易于控制。特别是时区的灵活处理,以及更严格的输出格式控制,能够提供更好的用户体验。当然,这仅是个人观点,欢迎不同意见的交流与讨论。