前言
上一篇分析了Fastjson低版本漏洞的成因以及利用,这篇来学习一下高版本Fastjson的补丁绕过。
影响范围
Fastjson <= 1.2.41
前提条件
autoTypeSupport属性为true才能使用(fastjson>=1.2.25默认为false)。
环境搭建
这里环境用的是1.2.26,所以手动改一下autoTypeSupport属性。

补丁分析
补丁大部分内容在com.alibaba.fastjson.parser.ParserConfig中。
首先是AutoType默认不开启,并且增加了checkAutoType方法。
如果AutoType开启后,进入到if中进行两次for循环。分别通过acceptList和denyList用来检测@type指定的类是否在白名单或黑名单。 如果在白名单直接调用TypeUtils.loadClass返回,如果在黑名单就抛出异常。

如果AutoType关闭,就先使用黑名单匹配,再进行白名单匹配。

如果黑白名单逗没有匹配到并且AutoType开启,则直接调用TypeUtils.loadClass加载类。

漏洞分析
前面看到如果黑白名单中没有匹配到并且AutoType开启,则直接调用TypeUtils.loadClass加载类。 进入到TypeUtils.loadClass方法中可以看到匹配到L开头并且;结尾的类名后会去掉这两个字符再次load, 所以我们将@type的类名开头加入L,结尾加入;即可绕过。

There Is Nothing Below
