Fastjson 代码执行漏洞,该漏洞允许攻击者绕过 Fastjson 中的"AutoTypeCheck"机制并实现远程代码执行
影响版本:1.2.80及以下版本,即, java.lang.reflect.Type)
会检测目标类中是否属于Throwable
的扩展,之后就会调用
ThrowableDeserializer.deserialize()
所以初步得出结论,如果目标类属于 Throwable
的扩展类,就可以实现打开autoType
的类似操作,去调用任何类
为了验证这个猜测,我们修改一下文件
package com.example.fastjson;
import java.io.IOException;
public class Poc extends Error {
public void setName(String str) {
try {
Runtime.getRuntime().exec(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
依然可以利用成功
继续关注函数
com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class, java.lang.reflect.Type)
会调用 createException 去创建反序列化函数
com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer#createException
最后还是在函数
com.alibaba.fastjson.parser.ParserConfig#getDeserializer(java.lang.Class, java.lang.reflect.Type)
中实现了代码执行
如此整个漏洞就分析完成了
漏洞修复官方提供了以下四种修复方式
● 升级到最新版本1.2.83
● safeMode加固
● 升级到fastjson v2
● noneautotype版本
总结反思 整个漏洞的分析花了很多时间,根据参考文章 CVE-2022-25845 – Analyzing the Fastjson “Auto Type Bypass” RCE vulnerability 来来回回加断点调试了很久。对这个漏洞做一个自己的总结。在默认未开启 AutoType 时,Fastjson 是基于白名单的获取外部类,通过 搜索checkAutoType
发现ThrowableDeserializer#deserialze
中的调用,当然也不止这一处,只是这处能进一步的利用,通过满足类属于 Throwable
的扩展类就可以触发,最后实现代码执行。但是这个代码在实际场景中的利用要求较为苛刻,首先满足类是 Throwable
的扩展类,同时其中必须有危险的 set 方法。
更多靶场实验练习、网安学习资料,请点击这里>>https://www.hetianlab.com