SSRF怎么能拿下Redis服务器,原理其实没那么复杂,聊聊这中间的门道
- 问答
- 2026-01-18 23:07:29
- 2
“SSRF怎么能拿下Redis服务器,原理其实没那么复杂,聊聊这中间的门道”这个说法,其实是在探讨一种特定的网络攻击场景,咱们就把它当成一个故事来讲,看看攻击者是怎么一步步利用一个普通的漏洞,最终控制一台重要的服务器的,这个故事的核心主角有两个:一个是存在SSRF漏洞的Web应用,另一个就是目标Redis服务器。
咱们得先认识一下这两位主角,SSRF,中文叫“服务器端请求伪造”,这名字听起来有点唬人,但说白了,就是攻击者能够“忽悠”一个网站的后台服务器,让它代替自己去发送一个网络请求,举个例子,你经常看到一些网站有“分享到微博”或者“抓取URL内容”的功能,你输入一个网址,网站后台会去访问那个网址,然后把内容显示给你看,如果这个功能没有做好安全检查,攻击者就可以不让你输入一个正常的公网网址,而是让你输入一个内网的地址,http://192.168.1.10/data”,网站服务器很“老实”,它真的会去访问这个内网地址,并把结果返回给攻击者,这样一来,攻击者就相当于在网站服务器上开了一个“望远镜”,看到了本来他直接从外部网络看不到的内部系统情况,这就是SSRF的基本原理。
另一位主角Redis,是个很快的数据库,因为它把数据都存在内存里,所以读写速度极快,很多大型网站都用它来存一些经常要读取的数据,比如用户的登录状态、购物车信息什么的,Redis为了追求速度,默认的设置往往比较“奔放”,有时候为了管理方便,运维人员会把它绑定在服务器的“0.0.0.0”这个地址上,并且设置一个密码,或者干脆不设密码,这就好比把你家金库的大门装在了人来人往的街上,虽然可能上了把锁(密码),但门的位置已经暴露了。
攻击者是怎么把这两个主角联系起来的呢?关键就在于Redis有一个非常特别的“特性”,根据已知的知识(比如来自安全社区如SecWiki、CTF比赛Writeup以及安全研究人员如antirez(Redis作者)本人的相关讨论),Redis服务器不仅可以通过Redis客户端工具(比如redis-cli)用命令来操作,它还能接受一种叫做“RESP”(Redis序列化协议)格式的纯文本数据,更厉害的是,Redis会把客户端发送过来的数据,直接当成命令来执行。
攻击者的攻击思路就像一部精心设计的“谍战片”,步骤如下:
第一步,侦察,攻击者首先发现了一个存在SSRF漏洞的网站,这个网站有一个功能是输入图片URL,它会帮你把图片下载下来并生成缩略图,攻击者不会老实地输入“http://google.com/logo.jpg”,而是会尝试输入“http://127.0.0.1:6379”,127.0.0.1代表本机自己,6379是Redis默认的端口,如果网站服务器返回的错误信息提示“连接被拒绝”,说明这台服务器上没开Redis,或者Redis没开在这个端口,但如果返回的错误信息是Redis特有的,或者连接超时(说明端口是开放的,但Redis可能因为协议不对没响应),那攻击者心里就有底了:“嘿,这台机器上跑着Redis呢!”
第二步,武器制作,既然知道了目标,攻击者就要制作“特制弹药”了,他不能直接通过SSRF漏洞发送Redis命令,因为那个图片下载功能期待的是HTTP协议,他需要精心构造一个HTTP请求,但这个请求的“身体”里,包裹着标准的Redis命令,他可能会利用HTTP协议的一些特性,比如CRLF(回车换行)注入,在HTTP请求头中插入特殊字符,使得网站服务器在向Redis发起连接时,实际发送过去的数据刚好是一条完整的Redis命令,举个例子,他可能想让Redis把数据保存到一个特定文件里。
第三步,核心攻击:写入SSH密钥,这是最经典的一种攻击手法,在Linux服务器上,用户可以通过SSH密钥免密码登录,密钥是一个文件,公钥放在服务器上,私钥拿在自己手里,攻击者的目标就是利用Redis,把自己的SSH公钥写入到运行Redis服务的那个系统用户的家目录下的一个特定文件(比如/root/.ssh/authorized_keys)里,他怎么做到的呢?他通过SSRF漏洞,让网站服务器向Redis发送一连串伪装成数据的Redis命令,大概的逻辑是这样的:
- 告诉Redis,我要把接下来的一串数据保存到一个叫“crackit”的键里。
- 我分几行把我的SSH公钥内容作为这个键的值传过去。
- 我发出最关键的命令:让Redis把“crackit”这个键里的数据,保存到硬盘上的
/root/.ssh/authorized_keys这个文件里。
Redis有一个配置项叫dir,表示数据保存的目录,另一个叫dbfilename,表示保存的数据文件名,攻击者可以通过Redis命令临时修改这两个配置,比如把dir设置为/root/.ssh/,把dbfilename设置为authorized_keys,然后执行一个保存命令(如SAVE),这样,Redis就会把当前内存中的数据(也就是攻击者写入的公钥)保存到指定的路径下,这样一来,攻击者的公钥就被成功地、悄悄地放到了root用户的家目录下。
第四步,登录服务器,完成上面那一步后,攻击者只需要用自己的SSH私钥,就可以直接免密码登录这台Redis服务器了,因为系统认为他的公钥是合法的,于是他获得了服务器的最高控制权(如果是root用户的话),想干嘛就干嘛,比如植入挖矿木马、窃取所有数据、把它当成攻击内网其他机器的跳板等等。
你看,整个过程其实并没有用到什么深奥难懂的魔法,它就是巧妙地利用了Web应用的疏忽(SSRF漏洞)和Redis服务的默认不安全配置(以及其将数据当作命令执行的特性),一环扣一环,最终实现了突破,防范这种攻击也需要从这两端入手:Web应用要严格过滤用户输入的URL,禁止访问内网地址;而Redis服务则一定要设置强密码,并且尽量不要暴露在公网或者使用默认端口,最好配置为只允许本地连接,原理不复杂,但中间的这些道道,一旦被利用,后果就很严重了。”

本文由帖慧艳于2026-01-18发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/83313.html
