微慑信息网

fastjson <=1.2.47 反序列化漏洞浅析

作者:iiusky

#poc


 

最近据说爆出来一个在hw期间使用的fastjson 漏洞,该漏洞无需开启autoType即可利用成功,建议使用fastjson的用户尽快升级到> 1.2.47版本(保险起见,建议升级到最新版)

环境准备

阅读本篇文章之前建议先了解一下fastjson中的jndi漏洞利用方式。

## rmiServer.java


##Exploit.java


##poc.java


 

其中Exploit.java需要使用javac编译执行一次生成Exploit.class并放置在localhost:8000端口的根目录。我这边使用python简单的httpServer搭建的简易http服务器。
fastjson =< 1.2.47 反序列化漏洞浅析

调用分析

调用过程和之前的 《fastjson jndi利用方式》 差不多,这边使用了一个特性绕过了黑名单机制,在com.alibaba.fastjson.parser.DefaultJSONParser#parseObject(java.util.Map, java.lang.Object)执行逻辑中:

首先遇到的是第一个key@type,然后进行了以下的判断,如果是@type并且启用了特殊key检查的话,那么就把对应的value作为类来加载。这边摘取片段来进行展示。


fastjson会去检测@type的类是否为黑名单中的类,
fastjson =< 1.2.47 反序列化漏洞浅析

而poc中传入的@typejava.lang.class并非黑名单中的类,所以第一步检测的通过的。

接下来会把对应的value进行加载,也就是加载java.lang.class
fastjson =< 1.2.47 反序列化漏洞浅析
跟进deserialze方法(com.alibaba.fastjson.serializer.MiscCodec#deserialze)
fastjson =< 1.2.47 反序列化漏洞浅析

fastjson =< 1.2.47 反序列化漏洞浅析

可以看到lexer中的stringVal为poc中的val,而val的值为com.sun.rowset.JdbcRowSetImpl.

接下来将objVal赋值给strVal
fastjson =< 1.2.47 反序列化漏洞浅析

然后执行下面一大串if判断,其中有个if为:
如果传入的clazz为java.lang.class,则会调用TypeUtils.loadClass加载com.sun.rowset.JdbcRowSetImpl类,
fastjson =< 1.2.47 反序列化漏洞浅析
跟进loadClass方法
fastjson =< 1.2.47 反序列化漏洞浅析

从而导致checkAutoType在检测是否为黑名单的时候绕了过去,因为上一步将com.sun.rowset.JdbcRowSetImpl放入了mapping中,checkAutoType中使用TypeUtils.getClassFromMapping(typeName)去获取class不为空,从而绕过了黑名单检测
fastjson =< 1.2.47 反序列化漏洞浅析

导致将com.sun.rowset.JdbcRowSetImpl放入mapping中的问题点是在loadClass中的第三个参数,该参数是指是否对class放入缓存mapping中。

1.2.47版本中的代码
fastjson =< 1.2.47 反序列化漏洞浅析

1.2.48版本中的代码
fastjson =< 1.2.47 反序列化漏洞浅析

##结语

文章中有不对的点欢迎指出,勿喷,文明交流

##参考


原文始发于微信公众号(洛米唯熊):fastjson =< 1.2.47 反序列化漏洞浅析

本文标题:fastjson <=1.2.47 反序列化漏洞浅析
本文链接:
(转载请附上本文链接)
http://vulsee.com/archives/vulsee_2019/0712_8186.html
转载请附本站链接,未经允许不得转载,,谢谢:微慑信息网-VulSee.com » fastjson <=1.2.47 反序列化漏洞浅析
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

微慑信息网 专注工匠精神

访问我们联系我们