redis主从复制与[网鼎杯 2020 ]SSRFMe
在之前学的时候没有仔细去看这个 补一下
[网鼎杯 2020 玄武组]SSRFMe与redis主从复制
原理
基本概念
Redis 主从复制是一种数据复制机制
用于将一台作为主节点的redis服务器的数据复制到其他作为从节点的redis服务器上 这里的数据复制是单向的 只能够从主节点流向从节点
当主 Redis 写入数据时,会通过主从复制机制实时同步到其他从 Redis,从而保证主从 Redis 上的数据一致性。
漏洞产生
在全量复制过程中,从节点需要恢复 RDB(Redis Database,Redis 数据库快照)文件。如果攻击者将 RDB 文件构造为恶意的 exp.so
文件,当从节点恢复这个恶意 RDB 文件时,就会自动生成恶意代码,进而导致远程命令执行(RCE)漏洞被利用。
从节点执行 slaveof
命令后的复制过程
保存主节点信息:从节点记录主节点的相关信息,如 IP 地址、端口号等,以便后续建立连接。
主从建立 socket 链接:从节点和主节点之间通过 TCP 协议建立 Socket 连接,为后续的数据传输打下基础。
发送 ping 命令:从节点向主节点发送 ping 命令,用于检查主节点是否可达以及网络状况是否正常。
权限验证:如果主节点设置了访问密码,从节点需要进行权限验证,只有验证通过才能继续进行数据复制。
同步数据集:主节点将完整的数据集(RDB 文件内容)发送给从节点,从节点接收并进行数据恢复,使自己的数据状态和主节点在这一刻保持一致。
命令持续复制:在数据集同步完成后,主节点会将后续接收到的写命令,持续发送给从节点执行,保证主从节点数据的实时同步。
启动环境
拉取redis镜像
1 | docker pull redis:6.2 |
查看本地镜像
1 | `docker images` |
(出现redis latest即表明安装成功)
运行容器
1 | docker run -itd --name redis -p 10000:6379 redis:6.2 |
查看运行状态
1 | docker ps -a |
进入容器
1 | docker exec -it redis bash |
连接redis
1 | redis-cli |
主从复制启动
我们这里通过客户端命令方式开启从节点主从复制,redis服务器启动后,直接可短短输入命令
1 | slaveof <masterip> <masterport>//换成自己的ip和端口 |
这里有点容易乱
要有两个环境(一个master主环境 一个test从环境)
1 | docker exec -it redis-master redis-cli//进入主环境的redis-cli |
1 | set test "hello"//写入 |
1 | docker exec -it redis-test redis-cli//进入从节点 |
Redis 从 4.x 版本开始引入模块功能,恶意加载.so
文件的底层原理涉及 Redis 模块机制、主从复制机制以及相关命令执行逻辑
Redis 模块是一种动态库(.so
文件,在 Windows 下是.dll
文件),允许开发者扩展 Redis 的功能。它提供了一组 API,开发者可以利用这些 API 创建新的 Redis 命令,或者修改 Redis 的内部行为。
主从复制机制
Redis 主从复制是一种数据同步机制,用于将主节点的数据复制到一个或多个从节点,以实现读写分离和数据冗余备份。
全量复制:当从节点首次连接主节点,或者主从连接断开后重新连接时,通常会进行全量复制。主节点会生成一个 RDB(Redis Database)文件,包含当前数据库中的所有数据,然后将这个 RDB 文件发送给从节点。从节点接收到 RDB 文件后,会将其中的数据加载到自己的数据库中。
增量复制:在全量复制完成后,主从节点之间进入增量复制阶段。主节点会将写操作命令(如SET
、DEL
等)异步发送给从节点,从节点执行这些命令来保持与主节点的数据同步。