一、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代码注入示例展示 | ⭐⭐⭐⭐⭐ |