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

相关推荐
木头左2 小时前
【Nginx】内网服务源 IP 白名单实战:动态域名解析放行网段 + 端口接管零改造
运维·nginx·白名单·反向代理
Linux-lucky2 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默3 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk81633 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
翔云1234564 小时前
RocksDB中,客户端每写入一次数据,需要访问几次磁盘
运维·数据库·mysql
爱莉希雅&&&5 小时前
GitLab 完整学习笔记
linux·运维·服务器
博客zhu虎康6 小时前
实现局域网P2P通信:内网发送消息
网络·网络协议·p2p
小杨爱科普7 小时前
制造业上自动化改造,改造部分的专利到底归谁
运维·经验分享·自动化
吴声子夜歌7 小时前
Kubernetes权威指南——网络原理(一)
网络·容器·kubernetes
陈希1237 小时前
Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位
linux·服务器·网络