前言
Fastjson
原理
和之前一样,我们也对fastjson的原理有一个深度的剖析
在各个fastjson版本中的安全漏洞的修复流程中,大概主要是下面这些内容
在fastjson 1.2.24之后,引入
checkAutoType
机制,默认关闭autoTypeSupport
,如果需要打开checkAutoType
,则使用黑名单,也添加了添加黑名单的接口在fastjson 1.2.41之后,在
ParserConfig
中将黑名单进行了hash处理,防止绕过,而在ParserConfig#checkAutoType
中进行了L ;
的去除,可以双写绕过在fastjson 1.2.42之后,在
ParserConfig#checkAutoType
中如果出现了多个L
,就会抛出异常,但是前面除了L
同样也可以使用[
在fastjson 1.2.43之后修复了利用
[
的漏洞在fastjson 1.2.45之后,修复了
org.apache.ibatis.datasource.jndi.JndiDataSourceFactory
黑名单绕过在fastjson 1.2.47之后,修复了使用
Class.class
绕过checkAutoType
检查,在MiscCode
处理Class类的地方,设置Cache为fasle, 并且 loadClass 重载方法的默认的调用改为不缓存,这就避免了使用了 Class 提前将恶意类名缓存进去在fastjson 1.2.50 - fastjson 1.2.51中在
ParserConfig#checkAutoType#1411
的类过滤中添加了RowSet.class
,而且将oracle.jdbc.rowset.OracleJDBCRowSet
添加进入了黑名单在fastjson 1.2.68之后将期望类
java.lang.AutoCloseable
加入黑名单在fastjson 1.2.80之后添加了黑名单
我们这里主要是看看在fastjson在处理json串的时候,是如何对我们我们的对象进行还原和属性值的恢复
在进行JSON处理的过程中,在DefaultJSONParser#parseObject
方法中
ObjectDeserializer deserializer = config.getDeserializer(type);