一、Redis常見用途
1. Redis介紹
- 全稱與起源: Redis全稱Remote Dictionary Service(遠程字典服務),最初由antirez在2009年開發,用于解決網站訪問記錄統計的性能問題。
- 發展歷程: 從最初僅支持列表功能的內存數據庫,經過十余年發展已支持多種數據類型和豐富功能特性。
2. Redis常用數據類型
- 基本結構: 所有數據都以鍵值對(key-value)形式存儲,鍵名均為字符串類型。
- 五種核心類型:
- 字符串: 最基本類型,如set name wuya
- 哈希表: 鍵值對中嵌套鍵值對,如hset hash 1 a 2 b
- 列表: 有序元素集合
- 集合: 無序不重復元素集合
- 有序集合: 帶排序功能的集合
3. 操作演示
- 服務啟動: 通過redis-server命令啟動服務,需指定配置文件路徑。
- 客戶端連接: 使用redis-cli連接本地6379端口服務。
- 基本操作:
- set key value: 設置鍵值對
- get key: 獲取鍵對應值
- hset hash field value: 設置哈希字段值
- hget hash field: 獲取哈希字段值
- flushall: 清空所有數據
4. Redis常見用途
- 緩存系統: 最經典應用場景,提升數據訪問速度
- 分布式解決方案:
- Session共享: 解決多服務器session同步問題
- 分布式鎖: 實現秒殺、搶購等并發控制
- 全局ID生成: 保證分布式系統ID唯一性
- 其他應用:
- 計數器: 實現簽到、閱讀量統計
- 限流控制: 限制并發訪問量
- 抽獎系統: 隨機抽取不重復元素
- 標簽系統: 商品多維度分類過濾
- 排行榜: 實現各類熱度排序
5. Redis為什么這么流行
- 數據類型豐富: 支持多種數據結構,適用場景廣泛
- 高性能: 純內存操作,讀寫速度遠超磁盤數據庫
- 功能完備:
- 數據持久化防止丟失
- 事務支持保證操作原子性
- Pipeline提升批量操作效率
- 多語言客戶端支持
- 集群部署保障高可用
二、知識小結
知識點 | 核心內容 | 考試重點/易混淆點 | 難度系數 |
Redis簡介 | 遠程字典服務(Remote Dictionary Service),2009年由antirez用C語言開發,最初用于網站統計系統 | 名稱來源與開發背景 | ?? |
基本數據類型 | 支持5種主要類型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set) | 鍵(key)始終為字符串,值(value)類型多樣 | ??? |
基礎命令操作 | SET/GET(字符串)、HSET/HGET(哈希)等基礎命令演示 | 哈希表嵌套結構語法 | ?? |
分布式應用場景 | 緩存、分布式Session、分布式鎖、全局ID生成、計數器、限流、排行榜、標簽系統 | 分布式鎖實現秒殺場景 | ???? |
技術特性優勢 | 純內存操作、支持持久化、多語言接口、集群部署能力 | 內存vs磁盤數據庫性能差異 | ??? |
安全漏洞風險 | 未授權訪問漏洞(6379端口暴露風險),護網/CTF常見攻擊面 | 運維人員安全意識薄弱問題 | ???? |
發展歷程 | 從MySQL替代方案演變為多功能數據庫,支持數據類型持續擴展 | 原始需求與最終產品的差異 | ?? |
企業級應用 | 百度/谷歌統計類系統、電商標簽過濾、微博熱搜榜實現 | 標簽系統實現原理 | ???? |
一、Redis環境安裝
1. 環境準備
1)環境準備內容
- 架構說明:需要準備兩臺虛擬機,分別安裝Redis服務端(靶機IP66)和客戶端(控制機IP44)
- 版本選擇:課程使用Redis 6.2.3版本,但6.2.6版本同樣適用,漏洞復現與版本關系不大
- 漏洞本質:該漏洞源于用戶配置不當而非Redis官方漏洞,早期版本即可利用且未修復
2)CentOS7安裝Redis 6單實例
- 解壓壓縮包
- 下載命令:wget https://download.redis.io/releases/redis-6.0.9.tar.gz
- 解壓命令:tar -zxvf redis-6.0.9.tar.gz
- 安裝gcc依賴
- 版本要求:Redis 6.x需要gcc版本大于4.9
- 升級步驟:
- 編譯安裝
- 編譯命令:
- 生成文件:編譯后會生成redis-server(服務端)、redis-cli(客戶端)、redis-sentinel(哨兵)三個關鍵腳本
- 修改配置文件
- 后臺運行:將daemonize no改為daemonize yes
- 遠程訪問:注釋或修改bind 127.0.0.1為bind 0.0.0.0
- 密碼設置:建議生產環境取消requirepass注釋設置密碼,但漏洞復現需保持注釋
- 使用指定配置文件啟動Redis
- 啟動命令:/usr/local/soft/redis-6.0.9/src/redis-server /usr/local/soft/redis-6.0.9/redis.conf
- 驗證命令:netstat -an|grep 6379檢查端口是否監聽
- 進入客戶端
- 連接命令:/usr/local/soft/redis-6.0.9/src/redis-cli
- 配置別名
- 配置文件:編輯~/.bashrc文件
- 別名示例:
- 生效命令:source ~/.bashrc后需打開新終端窗口
3)Redis服務端配置
- 保護模式:設置protected-mode no允許遠程連接
- IP綁定:注釋bind配置或設為0.0.0.0
- 防火墻:關閉防火墻或開放6379端口
- 密碼認證:保持requirepass注釋狀態(漏洞復現要求)
2. 環境配置示例
- 連接驗證:通過redis-cli -h 靶機IP -p 6379命令測試遠程連接
- 命令測試:可執行set/get等基本操作驗證環境正常
- 克隆建議:可先安裝好一臺虛擬機后克隆,客戶端機器只需保留redis-cli腳本
3. 可以執行任意Redis命令的危害
- 數據清除:攻擊者可執行flushall清空所有數據
- 數據篡改:可任意修改緩存、排行榜等關鍵業務數據
- 權限提升:結合后續漏洞利用可實現從數據庫操作到系統提權
二、知識小結
知識點 | 核心內容 | 考試重點/易混淆點 | 難度系數 |
Redis環境安裝 | 需在虛擬機安裝客戶端和服務端,版本差異影響小(6.2.3與6.2.6均可復現漏洞) | 版本選擇:官方未修復漏洞,舊版本(如4.x/5.x)同樣適用 | ?? |
Redis漏洞本質 | 配置不當漏洞:無需密碼、開放遠程訪問、關閉保護模式(protected-mode no) | 關鍵配置項:bind注釋、requirepass注釋、防火墻關閉 | ??? |
服務端安裝步驟 | 1. 下載源碼包并解壓; 2. 更新GCC版本(≥4.9); 3. make install編譯安裝; 4. 修改配置文件(daemonize yes、protected-mode no等) | 易錯點:GCC版本未升級導致編譯失敗 | ??? |
客戶端連接驗證 | 通過別名配置簡化命令(如redis-cli -h 目標IP),無需密碼即可執行任意命令(如SET/GET) | 危害場景:數據清空或服務器控制(通過寫入惡意命令) | ???? |
環境配置技巧 | 1. 使用alias簡化啟動命令; 2. 克隆虛擬機快速搭建多節點; 3. 防火墻關閉(systemctl stop firewalld) | 效率優化:配置文件路徑管理與別名生效(source ~/.bashrc) | ?? |
漏洞復現關鍵點 | 1. 服務端允許遠程無密碼訪問; 2. 客戶端可執行任意Redis命令(如寫入SSH公鑰) | 對比維度:版本兼容性 vs 配置安全性 | ???? |
一、Redis持久化機制
1. Redis持久化
- 必要性: Redis作為純內存數據庫,斷電或重啟會導致內存數據全部丟失,需要通過持久化機制將數據保存到磁盤
- 兩種機制: RDB(Redis Database)和AOF(Append Only File),兩種方式可以同時使用
1)RDB
- 自動觸發規則
- 觸發方式: 分為手動觸發(管理員執行命令)和自動觸發(滿足條件時)
- 默認規則:
- 3600秒(1小時)內至少1個key改變
- 300秒(5分鐘)內至少100個key改變
- 60秒內至少10000個key改變
- 規則特點: 多個規則會同時生效,滿足任一條件即觸發保存
- 配置文件名
- 默認文件名: 通過dbfilename配置項指定,默認為dump.rdb
- 文件內容: 采用特殊編碼格式存儲,不可直接閱讀
- 文件存儲位置
- 默認路徑: 通過dir配置項指定,默認為Redis安裝根目錄(./)
- 路徑修改: 可配置到存儲空間更充足或更安全的位置
- RDB配置總結
- 三要素配置:
- 自動觸發規則(save配置項)
- 保存文件名(dbfilename配置項)
- 存儲路徑(dir配置項)
- 手動觸發命令: save(前臺保存)和bgsave(后臺保存)
- 三要素配置:
- 應用案例
- 例題:查看dump文件內容
2)題目解析
- 操作步驟: 使用cat命令查看dump.rdb文件內容
- 結果特點: 文件內容為特殊編碼格式,顯示為亂碼
- 驗證方法: 可通過設置新值后手動保存,觀察文件變化
二、知識小結
知識點 | 核心內容 | 考試重點/易混淆點 | 難度系數 |
Redis持久化機制 | 純內存數據庫特性導致斷電數據丟失,通過持久化解決 | 內存vs磁盤存儲特性差異 | ?? |
RDB持久化方式 | 默認機制,定時/定量觸發內存數據快照保存到磁盤 | save規則配置(時間+鍵數量閾值) | ??? |
RDB觸發規則 | 三重自動觸發條件: 1. 3600秒+1個key修改; 2. 300秒+100個key修改; 3. 60秒+10000個key修改 | 多條件并行生效邏輯 | ???? |
RDB存儲配置 | 文件名:dump.rdb; 路徑:安裝根目錄(可通過directory修改) | 配置文件中的dbfilename和dir參數 | ?? |
手動持久化命令 | 支持SAVE(前臺阻塞)和BGSAVE(后臺異步) | 強制刷盤與自動觸發的區別 | ??? |
AOF持久化方式 | Append Only File機制(與RDB可共存) | 兩種機制優劣對比未展開 | ???? |
數據恢復原理 | 依賴磁盤文件的斷電不丟失特性 | 內存數據易失性 vs 磁盤持久性 | ?? |
一、動態修改配置
1. 配置文件修改
- 持久化配置項:
- save 3600 1:自動觸發規則
- dbfilename dump.rdb:持久化文件名
- dir ./:存儲路徑
- 手動觸發命令:
- save:同步保存
- bgsave:后臺保存
- 修改方式:通過vim redis.conf直接修改配置文件中的存儲目錄、文件名或自動保存規則
2. 動態修改配置
- 特點:
- 使用config set命令實時修改配置
- 修改僅在當前連接會話有效
- 重啟后失效,不會修改配置文件本身
- 應用場景:需要臨時調整配置而不影響持久化配置時使用
1)示例操作
- 操作步驟:
- config set dir /www/admin/localhost_80/wwwroot:修改存儲路徑
- config set dbfilename redis.php:修改持久化文件名
- 執行set命令寫入數據
- 執行save命令保存數據
- 驗證方法:檢查指定目錄下是否生成新文件
2)配置項動態修改示例
- 關鍵點:
- 動態修改后,數據會保存到新指定的路徑和文件名
- 原dump.rdb文件不再更新
- 可通過刪除原文件驗證修改是否生效
- 安全風險:
- 可能被利用來向服務器任意路徑寫入任意內容
- 寫入PHP代碼可能導致webshell漏洞
- 注意事項:
- 動態修改是臨時性的
- 重要配置變更仍需修改配置文件
- 生產環境應嚴格控制config set命令權限
二、知識小結
知識點 | 核心內容 | 考試重點/易混淆點 | 難度系數 |
Redis動態修改配置 | 通過config set命令臨時修改配置(如持久化路徑/文件名) | 修改僅在當前連接有效,不會寫入配置文件 | ?? |
Redis持久化機制 | 內存數據保存到指定路徑的RDB文件 | 觸發保存的規則配置 | ??? |
動態配置驗證方法 | 1. 刪除舊RDB文件; 2. 修改配置; 3. 寫入數據后執行SAVE; 4. 檢查新路徑是否生成文件 | 文件內容驗證需注意二進制格式 | ???? |
安全風險演示 | 通過動態配置+持久化實現任意文件寫入: - 修改路徑/文件名; - 將惡意代碼作為value寫入 | PHP代碼注入示例展示 | ????? |