当前位置:首页 > 问答 > 正文

Redis禁用指令那些事儿,怎么绕过DISABLE限制偷偷玩转Redis

说到Redis禁用指令这个事儿,咱们得先明白为啥要禁用,这就像家里有个超级好用的工具箱,里面既有螺丝刀,也有大铁锤,你拿螺丝刀拧螺丝没问题,但要是把大铁锤随便给一个不懂事的小孩,他可能一高兴就把电视机砸了,Redis也一样,它有很多非常强大的指令,但这些指令如果被不当使用,轻则导致服务卡顿、数据丢失,重则能让整个服务器被黑客控制。

(来源:基于常见的Redis安全实践认知)

最常见的“大铁锤”指令就是FLUSHALL,这个命令一下去,Redis里所有的数据,不管哪个库的,瞬间清空,干干净净,连个确认框都没有,想象一下,如果你是运维,不小心在生产环境敲了这个命令,那基本可以准备跑路了,还有像KEYS *这种,在数据量大的时候,它会扫描所有键,直接让Redis卡死,别的请求都进不来,负责服务器安全的运维人员,为了求稳,就会选择把这些危险的指令给禁掉,方法通常是在Redis的配置文件redis.conf里加上一行,rename-command FLUSHALL "",这样就把这个命令彻底废了,或者改成个特别复杂的名字,只有自己人知道。

(来源:Redis官方文档关于rename-command配置项的说明)

道高一尺魔高一丈,有时候我们确实需要用到这些被禁用的指令,比如在受控的开发环境或者进行一些紧急的数据维护时,那怎么绕过这个DISABLE限制,偷偷玩转Redis呢?这里有几个不是秘密的“野路子”。

第一招,也是最直接的一招:找配置文件,改配置,重启服务。 这个方法简单粗暴有效,只要你拥有服务器的登录权限,并且有权限修改Redis的配置文件,那就好办,找到那个redis.conf文件,把里面禁用指令的那几行代码用号注释掉,或者把改名的命令恢复成原来的样子,重启一下Redis服务,被封印的指令就全部回来了,这招的缺点是需要重启服务,可能会影响线上正在运行的业务,所以只能在允许停机的场景下用。

(来源:基本的Linux服务管理操作)

第二招,利用如果运维“手滑”没禁干净的指令。 运维在禁指令的时候,可能会只禁用了最常见的危险命令,但一些有类似功能的“平替”指令可能被忽略了,举个例子,他可能禁用了FLUSHALL,但忘了禁FLUSHDBFLUSHALL是清空所有数据库,而FLUSHDB只清空当前所在的这个数据库,虽然威力小了点,但在某些情况下也够用了,再比如,他禁用了性能杀手KEYS *,但我们可以尝试用SCAN命令来替代。SCAN是一个增量式的迭代命令,不会一次性锁住服务器,可以慢慢地把所有键找出来,这就好比不让你用大型收割机一次性收割整片麦田(KEYS *),但允许你拿着一把小镰刀,一次割一小片(SCAN),多割几次也能完成任务。

(来源:Redis官方文档中SCANKEYS命令的对比说明)

第三招,高级玩法:利用未禁用的指令组合“造”出危险操作。 这招就需要对Redis有更深入的了解了,即使单个的危险指令被禁了,但通过一系列“无害”指令的组合,也能达到类似的效果,一个经典的例子是模拟文件写入,Redis有个非常危险的配置,叫做dirdbfilename,它们决定了数据持久化文件RDB保存在服务器的哪个位置以及叫什么名字,如果黑客能控制Redis,他可以通过CONFIG SET命令(如果这个命令没被禁用的话)修改这个路径,比如改成网站根目录下的一个可写文件夹,然后把自己的数据设置成一个恶意的网页木马内容,最后通过SAVEBGSAVE命令强制Redis生成RDB持久化文件,这样,一个Webshell就通过Redis悄悄写入了服务器,黑客就能进一步控制机器了,这整个过程可能完全不需要用到那些明令禁止的高危指令。

(来源:国内外安全社区广泛讨论的Redis未授权访问漏洞利用原理)

第四招,寻找配置疏漏,比如无密码访问。 这是最危险的情况,但也最常见,很多开发图省事,安装完Redis后没有设置密码(默认是无密码的),只要你能连接到这台Redis服务器(端口通常是6379),你就拥有了最高权限,在这种情况下,即使指令被重命名了,你依然可以通过CONFIG GET rename-command这样的指令,直接把运维重命名后的新命令名查出来!这就好比保安把武器库的钥匙藏起来了,但你居然能在保安室的桌子上找到一张写着“钥匙在花盆底下”的纸条,拿到新命令名后,你就可以为所欲为了。

(来源:基于常见的Redis安全漏洞案例)

禁用Redis指令是一种重要的安全措施,但它绝非铜墙铁壁,作为运维,要有纵深防御的思想,不能只依赖这一招,还必须结合设置强密码、限制访问IP、定期更新版本等多种手段,而作为想“偷偷玩转”的人,上面这些方法也揭示了安全措施的脆弱性,不过要切记,所有这些操作都必须在合法合规、获得授权的前提下进行,否则可就真成了“黑客行为”,那是要承担法律责任的。

Redis禁用指令那些事儿,怎么绕过DISABLE限制偷偷玩转Redis