Web安全-SSRF服务端请求伪造
字数 1796 2025-08-10 12:17:58
SSRF(服务端请求伪造)漏洞全面解析与防御指南
一、SSRF基础概念
SSRF(Server-Side Request Forgery,服务端请求伪造)是攻击者构造恶意链接传给服务端执行造成的漏洞,主要用于外网探测或攻击内网服务。
与CSRF的区别
| 特性 | SSRF | CSRF |
|---|---|---|
| 攻击目标 | 服务器本身 | 用户浏览器 |
| 利用方式 | 滥用服务器对外请求功能 | 利用用户已认证状态 |
| 关键问题 | 服务器对URL信任过度 | 服务器缺乏随机token校验 |
| 防御重点 | URL输入过滤与限制 | 增加随机token和referer检查 |
二、SSRF漏洞成因
主要由于服务器提供了从其他服务器获取数据的功能,但缺乏严格的过滤与限制,导致攻击者可传入任意地址让后端服务器请求。
典型场景:后端代码直接请求用户提供的未经验证URL。
三、SSRF攻击危害
-
信息收集:
- 获取web应用可达服务器的banner信息
- 收集内网服务指纹信息(开放端口、中间件版本等)
- 探测内部网络和端口信息
-
内网攻击:
- 攻击内网系统或应用程序
- 通过漏洞获取webshell(如Struts2命令执行、Redis未授权访问等)
-
资源访问:
- 通过URL Scheme读取内部资源
- 让服务器执行特定攻击动作
四、常见漏洞场景
- URL分享功能:通过目标地址获取网页/图片内容
- 在线翻译服务:可构造恶意请求获取回显
- 图片加载与下载:非直接使用img标签的图片处理
- 收藏功能:获取URL内容的title和文本
- 社交分享:获取超链接标题等内容
- 转码服务:为移动设备优化网页内容
- 云服务器监控:远程执行存活检测命令
- 网站采集/抓取:对用户提供URL进行信息采集
- 邮件系统:接收邮件服务地址
- 文件处理:ffmpeg、ImageMagick、docx/pdf/xml处理器等
- 未公开API:扩展调用URL的功能
- 关键词功能:包含share、wap、url、link、src、source、target等参数的功能
五、漏洞利用技术
1. 协议利用
dict协议
- 用途:探测端口服务版本信息
- 示例:
curl -v 'dict://127.0.0.1:22' curl -v 'http://example.com/ssrf.php?url=dict://139.9.198.30:22'
file协议
- 用途:读取文件系统内容
- 示例:
curl -v 'file:///etc/passwd' curl -v 'http://example.com/ssrf.php?url=file:///etc/passwd'
gopher协议
- 用途:构造任意TCP数据
- 示例:
gopher://10.0.0.1:6789/Hi%0aEveryone%0athis%20is%20just%20a%20test
2. 危险PHP函数
-
curl_exec():
- 端口探测:
dict://127.0.0.1:22 - 可结合Burp进行端口爆破
- 端口探测:
-
file_get_contents():
- 文件读取:
file:///etc/passwd - 使用伪协议读取源码:
php://filter/read=convert.base64-encode/resource=fgc.php
- 文件读取:
-
fsockopen():
- 可指定IP和端口获取信息
3. 敏感文件路径
-
Windows:
file://c:\windows\win.ini -
Linux:
file:///etc/passwd file:///etc/httpd/conf/httpd.conf
六、无回显SSRF利用
-
HTTP带外通道:
- 使用Burp Collaborator client
- 构造请求使服务器访问Collaborator地址
-
DNSlog:
- 使用http://dnslog.cn/
- 让服务器发起DNS查询以确认漏洞存在
七、绕过技术
-
URL解析绕过:
http://www.baidu.com@10.10.10.10 -
IP格式转换:
- 八进制:
0300.0250.1→192.168.0.1 - 十六进制:
0xC0.0xA8.0.1 - 十进制:
3232235521 - 十六进制整数:
0xC0A80001
- 八进制:
-
端口添加:
10.10.10.80:80 -
xip.io/xip.name:
192.168.0.1.xip.io -
短网址:
- 通过https://www.ft12.com/生成短链
-
特殊字符:
127。0。0。1 -
IPv6格式:
http://[::]:80/ -
@符号:
xxx.com@10.10.10.10
八、防御措施
-
输入过滤:
- 验证远程服务器响应
- 统一错误信息避免信息泄露
-
限制措施:
- 限制请求端口为常用HTTP端口(80,443)
- 设置内网IP黑名单
- 禁用不需要的协议(仅允许http/https)
-
代码层面:
- 对用户提供的URL进行严格校验
- 使用白名单机制限制可访问域名
- 避免直接使用用户输入构造请求
-
网络层面:
- 内网服务设置严格访问控制
- 关键服务设置网络隔离
九、总结
SSRF漏洞危害严重,可导致内网渗透和数据泄露。开发人员应:
- 永远不信任用户提供的URL
- 实施严格的输入验证和过滤
- 限制服务器发起的网络请求范围和协议
- 对敏感操作实施多层防护
通过全面的防御措施和持续的漏洞检测,可有效降低SSRF漏洞风险。