【原创】Spring Data Redis <=2.0.3反序列化漏洞

Spring Data Redis隶属于Spring Data家族, 提供简单易用的方式来访问Redis缓存。

Spring Data Redis在往Redis里面写数据的时候,默认会先对数据进行序列化,然后把序列化之后的字节码写入Redis;然后当Spring Data Redis从Redis里取数据的时候,会取出字节码进行反序列化操作,在反序列化的过程中没有对目标类进行校验和过滤,可导致远程任意代码执行。

攻击路径:

1.首先准备反序列化payload,参考ysoserial系列。

2.把生成的payload写入Redis中:

redis.set("\xac\xed\x00\x05t\x00\brebeyond",Payload)

这样,名为rebeyond的key中就有了我们构造的payload。

最好选择Redis中已经存在的key,这样等Spring取数据的时候就可以触发代码执行。

3.等待Spring读取我们已经覆盖的key,示例如下:

 

4.Spring侧的机器成功弹出计算器:

 

调用栈如下:

 

其他:

This vulnerability is tested on jdk1.8.0_144+spring 5.0.3+spring data redis 2.0.3+ commons-collections4:4.0

Common-collections4 is not necessary.Some modifications to payload can be applied to <=jdk8u20 without Common-collections4. 

尝试把这个问题提给Spring,不过Spring认为Redis在内网,开发人员有必要保证Redis的安全,所以没有认可该问题,只是更新了他们的产品guidelines ,让用户确保自己的Redis用在安全网络中。下图是pivotal的答复。但是我觉得认为Redis在内网就是安全的有点太乐观,我觉得对于spring来讲更好的解决方案是把默认的序列号引擎由DefaultDeserializer 改为JsonDeserializer:)

 

[0] https://jira.spring.io/browse/DATAREDIS-780

[1] https://github.com/spring-projects/spring-data-redis/commit/1f6790b10099f26c23c46ae5a099ba1023f055b1

 

posted @ 2018-09-21 13:39  rebeyond  阅读(1501)  评论(0编辑  收藏  举报