Web安全之SSRF攻击与防御详解
字数 931 2025-11-10 14:25:08
Web安全之SSRF攻击与防御详解
一、攻击描述
SSRF(Server-Side Request Forgery)是一种由攻击者构造请求,让服务端发起非预期网络请求的安全漏洞。攻击者利用服务端应用作为代理,间接访问内部系统或第三方系统,常导致信息泄露、内网渗透等风险。
二、攻击原理深度解析
-
漏洞产生条件:
- 服务端存在可从外部获取数据的功能(如图片下载、网页抓取)
- 请求目标URL可由用户直接或间接控制
- 服务端对目标地址校验不足
-
常见触发场景:
- 远程图片下载(通过URL获取头像/封面)
- 网页内容抓取(预览功能、翻译服务)
- 文件读取(通过file://协议读取本地文件)
- Webhook回调测试功能
三、攻击流程分步详解
-
探测漏洞点:
- 寻找所有接收URL参数的功能点
- 测试不同协议支持情况(HTTP/HTTPS/FTP等)
- 观察错误信息判断服务端处理逻辑
-
构造恶意请求:
POST /api/fetch_url HTTP/1.1 Content-Type: application/json { "url": "http://192.168.1.1/admin" } -
利用方式分类:
- 基础探测:访问内网存活主机
- 协议利用:使用file://读取敏感文件
- 重绑定攻击:利用DNS重定向绕过校验
- 端口扫描:通过响应时间判断端口开放状态
四、防御策略分层实现
-
输入校验层:
- 白名单校验:只允许特定域名或IP段
const allowedDomains = ['example.com', 'cdn.example.com']; function validateUrl(inputUrl) { const url = new URL(inputUrl); return allowedDomains.includes(url.hostname); } -
协议限制层:
- 禁用危险协议(file://、gopher://、dict://)
- 限制只允许HTTP/HTTPS协议
-
网络隔离层:
- 设置网络访问白名单
- 使用中间代理服务器进行出站请求
- 禁止访问回环地址(127.0.0.1、localhost)
-
请求过滤层:
- 解析目标IP,禁止内网IP段访问
function isInternalIP(ip) { const ranges = [ '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', '127.0.0.0/8' ]; return ranges.some(range => isIPInRange(ip, range)); }
五、进阶防御方案
-
DNS重绑定防护:
- 解析域名后立即校验IP
- 请求前后进行双重DNS解析比对
-
重定向防护:
- 限制重定向次数(最多2-3次)
- 对重定向目标进行再次校验
-
时间盲注防护:
- 设置请求超时时间(如5秒)
- 监控异常响应时间模式
六、实战检测方法
-
自动化工具:
- 使用SSRFmap、Gopherus等工具检测
- 编写自定义Payload进行fuzz测试
-
手动验证:
- 尝试访问已知存在的内网服务
- 使用Burp Collaborator检测带外数据渗出
通过分层防御和持续监控,可有效降低SSRF攻击风险,保护内网资源安全。