ssrf跨站请求伪造(保姆级教程)

原理

SSRF(服务器端请求伪造)的本质是让服务器成为攻击者的代理。当应用程序需要"替用户"去访问一个远程资源时,如果未能对用户提供的目标地址进行严格限制,攻击者就能诱导服务器向本不该访问的内部系统发起请求。

漏洞位置

第一类是远程资源加载,比如远程图片加载、网页抓取、分享预览、在线文档生成、文件远程导入、RSS 订阅、在线翻译或转码。这类功能通常接受一个 URL 参数,服务器会根据这个地址去下载内容,如果没校验目标地址,就可能被用来访问内网或本地服务。

第二类是回调和代理类入口,比如 Webhook、回调地址、API 代理、网关转发、对象存储远程拉取。这些位置往往允许用户提供一个目标地址,服务器会向该地址发起请求,容易被当成跳板。

第三类是解析类入口,比如 XML、SVG、HTML 解析中如果支持外部实体或远程引用,也可能触发 SSRF。尤其是 XXE 和 SSRF 经常联动出现。

第四类是比较隐蔽的位置,比如请求头中的 X-Forwarded-For、Referer,或者后端把用户输入拼进 curl、requests、file_get_contents、HttpURLConnection 等网络请求函数时,也可能形成 SSRF。

伪协议

SSRF 里协议是"怎么让服务器发起请求"的关键。后端如果直接把用户输入交给 cURL、file_get_contents、requests、HttpURLConnection 这类网络请求函数,就可能被切换协议,访问本地文件、内网服务或云元数据。

HTTP / HTTPS

最基础,也最常见。

用途主要是让服务器访问原本从外网无法访问的内部资源。

常见利用:

  • 访问内网 Web 服务,例如 http://127.0.0.1:8080/admin
  • 访问内网微服务、管理后台
  • 访问云实例元数据,例如 http://169.254.169.254
  • 探测内网端口是否开放,根据响应状态、延时或报错判断

示例:

复制代码
http://127.0.0.1:8080/
https://169.254.169.254/latest/meta-data/

HTTP/HTTPS 本身不能直接发送任意 TCP 数据,但可以用来探测服务、读取返回内容,或触发内网 Web 漏洞。

FILE

用于访问服务器本地文件系统。

如果 SSRF 点有回显,file 协议常被用来读取本地敏感文件。

常见利用:

  • 读取 /etc/passwd
  • 读取 /etc/hosts
  • 读取 Web 配置文件、日志、环境变量
  • 读取应用源码或数据库配置

示例:

复制代码
file:///etc/passwd
file:///var/www/html/config.php
file:///C:/Windows/System32/drivers/etc/hosts

防御上,file 协议通常应直接禁用,尤其不能让用户可控的 URL 进入文件读取函数。

DICT

DICT 是基于 TCP 的字典查询协议,但在 SSRF 里更多被用来探测端口和攻击内网服务,尤其是 Redis。

常见利用:

  • 探测端口是否开放
  • 识别服务指纹
  • 攻击未授权 Redis,执行简单单行命令

示例:

复制代码
dict://127.0.0.1:6379/info
dict://127.0.0.1:6379/keys:*

DICT 的限制是每次通常只能发送单行命令,复杂操作需要分步执行,并且要对特殊字符做编码。

GOPHER

Gopher 是 SSRF 里最强大的协议之一。

它可以构造原始 TCP 数据流,所以能攻击 Redis、FastCGI、SMTP、MySQL 等内网服务。

常见利用:

  • 攻击内网 Redis,写 Webshell 或写计划任务反弹 Shell
  • 攻击 FastCGI,执行系统命令
  • 构造 HTTP GET/POST 请求访问内网服务
  • 绕过只允许 HTTP/HTTPS 的简单校验

示例格式:

复制代码
gopher://127.0.0.1:6379/_[编码后的TCP数据]

Gopher 的关键在于 URL 中 _ 后面的内容会被当作 TCP 数据发送给目标端口,所以可以拼出 Redis 命令、FastCGI 包或 HTTP 请求包。

FTP

FTP 主要用于文件传输,但在 SSRF 里危害相对弱一些,更多用于探测端口或尝试访问远程文件。

常见利用:

  • 探测 FTP 端口是否开放
  • 尝试访问远程 FTP 文件
  • 某些环境下可能扩大协议攻击面

示例:

复制代码
ftp://127.0.0.1:21/
ftp://user:pass@target/file

FTP 是否能被利用,取决于后端使用的网络库是否支持该协议,以及是否允许访问内网地址。

面试记忆版

  • HTTP/HTTPS:访问内网 Web、探测端口、读云元数据。
  • FILE:读本地文件。
  • DICT:探测端口、识别服务、攻击 Redis。
  • GOPHER:构造任意 TCP 数据,最危险。
  • FTP:探测端口、访问远程文件,危害相对小。

最稳防御仍是:只允许 http/https,禁用 file、dict、gopher、ftp 等协议,再做 IP 白名单、DNS 解析后校验、禁止自动重定向和出站网络隔离。

防御

只允许 http/https

禁用 file://、gopher://、dict://、ftp:// 等危险协议。

域名/IP 用白名单,不用黑名单

能白名单就白名单;必须开放公网时,至少校验不是内网、回环、链路本地和云元数据地址。

DNS 解析后再校验 IP

域名解析出真实 IP,确认不在禁止网段;如果业务允许,把解析结果绑定到连接,防 DNS 重绑定。

禁止自动重定向

关闭 HTTP 客户端的 30x 自动跳转;必须跳转时,对最终目标重新校验协议、域名和 IP。

出站网络隔离

服务器出口流量禁止访问内网段和元数据地址,最好走受控出站代理。

常见绕过手法

绕过通常发生在"校验层"和"实际请求层"不一致时。

协议绕过:file://、gopher://、dict:// 等危险协议

本地回环绕过:localhost、127.0.0.1、::1、0、127.1 等

IP 变形:八进制、十六进制、十进制整数、混合进制

URL 解析差异:http://example.com@127.0.0.1、# 片段截断

重定向绕过:先通过白名单,再 301/302 跳转到内网

DNS 重绑定:首次解析返回公网 IP,二次解析返回内网 IP

短链接 / 开放重定向:用可信域名做跳板

NAT64 / IPv6 翻译:用 IPv6 地址绕过 IPv4 黑名单

危害

SSRF 的危险点在于它能穿透网络边界:

探测内网存活主机、端口

读取本地文件,如 file:///etc/passwd

访问内网管理后台、微服务、Redis、MySQL、FastCGI

窃取云实例元数据,例如 AWS/Aliyun/TencentCloud 的临时凭证

结合 Gopher/Dict 等协议攻击内网服务

触发 DoS,甚至链式利用实现 RCE

相关推荐
帷幕落秋1 小时前
进程服务与文件描述符
linux·运维·面试
帷幕落秋1 小时前
信号、Ctrl 组合键与进程状态
linux·运维·面试
开开心心就好1 小时前
文件被占用删不掉?解锁工具强制删除
java·运维·服务器·开发语言·前端·pdf·ocr
小超人诞生日记2 小时前
Linux 进程优先级
linux·运维·服务器
西安同步电子2 小时前
嵌入式二次集成怎么选频率计模块?看懂这几个参数不踩坑
服务器·硬件工程
科技象限2 小时前
数据防泄漏系统:文件是怎么溜出门的,就该怎么堵
运维·网络·网络安全·安企神
cpolar技术支持2 小时前
端口被谁占了、这台机上开了哪些监听?本机起一个端口占用只读清单,cpolar 给异地同事远程看谁在监听
运维·python·内网穿透·cpolar·端口占用
在西安放羊的牛油果2 小时前
WebP 图片优化方案详解
运维·前端·架构
JavaPub-rodert2 小时前
Docker 容器为什么 stop 半天停不下来?讲透 PID 1、SIGTERM、SIGKILL、僵尸进程与 tini
运维·docker·容器