0


Tcsec安全研究院|fastjson漏洞分析

fastjson漏洞分析

fastjson介绍

fastjson 是一个 Java 库,可用于将 Java 对象转换为其 JSON 表示形式。它还可以用于将 JSON 字符串转换为等效的 Java 对象。Fastjson 可以处理任意的 Java 对象,包括没有源代码的预先存在的对象。
在这里插入图片描述

json -> bean

java 的核心就是对象的操作,fastjson 同样遵循这个原则利用get、set操作对象。将 User 对象转化为JSON字符串后,通过其提供的 parse() 方法就可将字符串还原成对象。
在这里插入图片描述

json框架探测

json框架识别

不同的json框架在解析json字符串的表现形式各不相同,利用其独特性质可以对json框架进行识别。举例现存在一个User对象,分析 json 反序列化时的性质。
在这里插入图片描述

jackson

  1. 严格要求与bean对象对齐,可少不能多,因此添加多余kv 报错在这里插入图片描述
  2. 无法解析单引号 报错在这里插入图片描述
  3. 无法识别注释符 报错在这里插入图片描述

gson

  1. 浮点无法转整数 报错,向 int 类型的值传浮点数无法解析会报错在这里插入图片描述
  2. 特有解析 报错,遇到 # 时都会当注释符处理在这里插入图片描述
  3. 特有解析 报错,拼接一个json字符串时会报错在这里插入图片描述

org.json

  1. 特有解析,插入 \n \r等字符改变输出,结合 # 注释符处理在这里插入图片描述

fastjson

  1. 浮点精度不丢失在这里插入图片描述
  2. 响应状态,如果是fastjson会对@type做出响应在这里插入图片描述
  3. DNSLOG 探测,这种方式可以无回显探测fastjson,是较为高效的一种方法,但不适用于不出网环境在这里插入图片描述

在 dnslog 域名被 ban 时,也可用一些正常域名探测是否存在DNS配置或出网
在这里插入图片描述

fastjson版本探测

当确定存在 fastjson 组件后,下一步就是对版本后的探测,以便更有针对性的利用。

有回显精确版本号

有报错回显的情况下,返回精确版本号
在这里插入图片描述

对于 FastJsonHttpMessageConverter 配置的解析,通常指定了key值或json结构,可通过添加

[]

等方式破坏既定结构
在这里插入图片描述

dnslog探测

1.2.47、1.2.68、1.2.80是漏洞的三个里程碑版本,通过

java.lang.Class

java.lang.AutoCloseable

java.lang.Exception

来构造dns可以准确识别,并且该探测方式向下版本兼容

1.2.47
在这里插入图片描述

1.2.68
在这里插入图片描述

1.2.80
68和80都只会接收到第一个dnslog请求,83会收到第二个请求
在这里插入图片描述

fastjson利用链探测

确定版本后,就是针对利用链的一个探测。

Character 报错回显

探测到存在的类时将 Class 强转为 Char 导致报错回显
在这里插入图片描述

Class回显

当类存在时将返回一个类实例,通常体现在改变服务器的响应
在这里插入图片描述

dnslog外带

该方式利用难度很高,对操作系统、dns服务器均有要求
在这里插入图片描述

json利用

jackson

jackson通常是通过cve记录漏洞进行攻击,举例两个攻击方式,当然也可以自行构造调用链,与fastjson类似。

CVE-2017-7525 反序列化

在这里插入图片描述

CVE-2020-36179 SSRF & RCE

在这里插入图片描述

exec.sql
在这里插入图片描述

fastjson <=1.2.24

最初的漏洞版本,无任何校验,任意利用,举例payload

JdbcRowSetImpl

在这里插入图片描述

TemplatesImpl

在这里插入图片描述

bcel

在这里插入图片描述

fastjson 1.2.25-1.2.45 黑名单

之后的 fastjson 引入checkAutoType 机制检查,当手动开启 autotype 时,可以绕过黑名单检查,这几种方式目前实战中已经很少见了。但黑名单但引入,对研究其他组件的利用方式很有帮助。
https://github.com/LeadroyaL/fastjson-blacklist

1.2.41 加L

在这里插入图片描述

1.2.42 双写L

在这里插入图片描述

1.2.43 加

[{

在这里插入图片描述

fastjson <=1.2.47 缓存通杀

在 fastjson 迭代到 1.2.47 时,爆出的漏洞在不开启 AutoTypeSupport 的情况下就可以构造任意反序列化
对于1.2.25-1.2.32:需关闭AutoTypeSupport
在这里插入图片描述

fastjson <=1.2.68

在 fastjson 迭代到 1.2.68 时,新增了对 expectClass 的判断,可以通过这个绕过 autoType 检查
在这里插入图片描述

fastjson <=1.2.80

fastjson 引入 expectClass 属性后造成了 1.2.68 的漏洞。而 checkAutoType 中还有一个对 expectClass 的判断,造成了 1.2.80 的漏洞。
在这里插入图片描述

fastjson WAF bypass

编码绕过

fastjson 对 key,value 值会自动进行 hex 解码和 unicode解码
在这里插入图片描述

在这里插入图片描述

字符填充

传统绕WAF思路,大量字符
在这里插入图片描述

fastjson dos

对于 Fastjson 1.2.36-1.2.62 的版本存在dos漏洞,在 1.2.80 后 fastjson 推出 noAutoType 版本,但并未对dos漏洞进行修复
在这里插入图片描述

fastjson 1.2.25-1.2.32 绕过autoType限制

fastjson 1.2.47 的漏洞存在一种情况,对于1.2.25-1.2.32版本区间需关闭AutoTypeSupport,这个问题在前几个月以赛题形式出现在了CTF中,也有了解决方案
在这里插入图片描述

fastjson -> codeql

比如寻找 shiro 的调用链,source 点就是类的 Field,sink点是lookup方法
在这里插入图片描述

找到3条调用链
在这里插入图片描述

总结

fastjson通过黑名单的方式限制攻击,终究是会有遗漏的,所以在官网的介绍中也建议使用fastjson2。
在这里插入图片描述

参考

https://blog.sometimenaive.com/2020/05/21/find-fastjson-jndi-gadget-by-codeql-tainttracking/
https://github.com/Whoopsunix/fastjson_study
https://github.com/knownsec/KCon/tree/master/2022


本文转载自: https://blog.csdn.net/tcsecXD/article/details/129028362
版权归原作者 tcsecXD 所有, 如有侵权,请联系我们删除。

“Tcsec安全研究院|fastjson漏洞分析”的评论:

还没有评论