Fastjson简介
Fastjson是一个Java库,可以实现json和对象之间的转换。
将数据与对象进行转化,这个操作涉及到了反序列化。
与原生的 Java 反序列化不同,FastJson 反序列化并未使用 readObject 方法,而是自定义了反序列化的过程。
通过在反序列化的过程中自动调用类属性的 setter 方法和 getter 方法
将JSON转化成对象
fastjson的格式
{"【对象名】":{
"@type":"【类名】",
"【成员变量名1】":【成员变量值1】,
"【成员变量名2】":【成员变量值2】
}
}
AutoType的作用:
fastjson提供了AutoType这种方式来指定需要还原的对象以及值 {"@type":"Java_deserialization.User","id":"66666"}
其中@type对应的值就是类名,后面的内容就是成员变量名与值
同时还会在一定的条件下调用get和set方法,熟悉的配方熟悉的味道--反序列化漏洞
利用链
待补充
修复与绕过
出现漏洞之后autoTypeSupport属性默认为false,并且增加了checkAutoType()函数,通过黑白名单的方式来防御Fastjson反序列化漏洞
L; 绕过
版本< 1.2.41
com.sun.rowset.jdbcRowSetlmpl在1.2.25版本被加入了黑名单,fastjson有个判断条件判断类名是否以"L"开头、以";"结尾,是的话就提取出其中的类名在加载进来
那么在类名前后分别加上L和;就能绕过黑名单检测
[ 绕过
版本< 1.2.42
随后再次修复
会先去除一次L和;再进行黑名单判断,但是被双写绕过
之后修复了双写绕过,又遇见了和L&;类似的 [ 绕过,在类名前加上 [ 也可以绕过检测
通过严格匹配L;和[修复了漏洞
autoType开关绕过
版本1.2.48通过关闭缓存修复
在autoType关闭的前提下,先利用一个特殊类(java.lang.Class会在checkAutoType之前以常见类的身份加载进缓存)将payload加载进缓存,然后因为autoType关闭,fastjson优先去缓存寻找该类,并将该类反序列化出来(此反序列化存在漏洞)
在fastjson中有一个全局缓存,在类加载的时候,如果autotype没开启,会先尝试从缓存中获取类,如果缓存中有,则直接返回。黑客正是利用这里机制进行了攻击。
抛出异常绕过
版本v1.2.69修复,版本v1.2.68可以使用safeMode修复
在checkAutoType中,有这样一约定,那就是如果指定了expectClass ,那么也会通过校验
在fastjson中, 如果,@type 指定的类为 Throwable 的子类,那对应的反序列化处理类就会使用到 ThrowableDeserializer
而在此方法中,当有一个字段的key也是 @type时,就会把这个 value 当做类名,然后进行一次 checkAutoType 检测。且会指定expectClass,这样就绕过来检测。
且异常类中有get类型的方法,会在反序列化时直接调用达到rce
safeMode
彻底关掉相关功能,在黑白名单之前结束,在checkAutoType时抛出异常
写文件
在与黑白名单的博弈中,还衍生出了写文件的攻击形式(利用链不同)
工具&漏洞复现
环境搭建
使用vulhub搭建环境
使用插件检测
配置好相关的fastjson插件,发送json格式的POST包,burp就会自动检测
开启rmi服务
使用工具开启rmi服务
-
-C 参数指定恶意类执行的命令
-
-A 参数指定本机ip地址
发送payload
ps:如果是在本机复现,Host填写本地ip,不要写回环地址
先将数据包修改为POST请求,然后body加入带payload的json字符串
攻击成功
参考文章
从FastJson库的不同版本源码中对比学习绕过方法_fastjson如何关闭autotype-CSDN博客
fastjson-BCEL不出网打法原理分析-腾讯云开发者社区-腾讯云 (tencent.com)
干货|最全fastjson漏洞复现与绕过-腾讯云开发者社区-腾讯云 (tencent.com)
fastjson到底做错了什么?为什么会被频繁爆出漏洞? (baidu.com)
工具链接
welk1n/JNDI-Injection-Exploit: JNDI注入测试工具
https://github.com/pmiaowu/BurpShiroPassiveScan
标签:Fastjson,fastjson,缓存,漏洞,绕过,序列化,类名 From: https://www.cnblogs.com/Aixve/p/18183481