Vimeo上传功能中的SSRF

iso60001  1592天前

22.jpg

前言

Vimeo是一个高清视频播客网站,与大多数类似的视频分享网站不同,Vimeo允许上传1280X700的高清视频,上传后Vimeo会自动转码为高清视频,源视频文件可以自由下载,它达到了真正的高清视频标准。Vimeo允许每月上传500MB的高清或普通视频,用户可以定制视频的显示尺寸。  ————百度百科

我在和Vimeo上传功能相关的上传流中发现了某些特性,并借此发现了一个SSRF漏洞。

过程

某一天,在学习了我最讨厌的科目后,我决定休息一下,在HackerOne中找一个漏洞悬赏项目镐劳自己,很快我便瞄准了“Vimeo”。我打开MacBook,进入测试网站,利用其中的上传功能直接从Google网盘上传视频,同时利用BurpSuite捕捉实时请求:

33.png

如你所见,它发送带有谷歌授权的文件URL,让后端服务器从指定URL处获取文件,且数据包中还有Google云盘授权的请求头。

现在让我们使用WireShark,看看Vimeo网站在向我们的VPS请求一个视频文件后,会发生什么:

44.png

在这些请求中,我注意到一个不同寻常的请求头,比如RangeContent-Range。虽然并不常见,不过它的名字足以告诉我它是干什么的。为此,我们可以假设,在大多数情况下,视频文件是很大的,所以Vimeo不会直接请求一个特别大的完整文件。如果视频文件很小,它就会请求完整的文件,如果很大,它就会循环请求文件的一部分,直到获得完整的视频文件,具体如下图所示:

55.png

Vimeo服务器会先发送一个请求来检查文件的大小,如果文件很小,可以通过单个连接直接获取,那么它将请求完整的文件。

那么,如果我的VPS不把完整的文件发送到Vimeo服务器呢?例如,当Vimeo询问我视频文件大小时,告诉它文件只有500B,那么Vimeo就会请求500B大小的内容,但如果我只给它200B的内容呢?

我用Python编写了一个Web服务器来进行测试,完整的文件长度是554231B,当Vimeo请求完整的文件时,我的服务器只回复8228B的内容!让我们看看此时的Range请求头。

66.png

此时,服务器在存储了8228B的内容后,再次请求视频文件的剩余部分。那么,是不是存在SSRF呢?

如果当Vimeo请求剩余的视频文件时,我的服务器响应一个重定向会发生什么事呢?Vimeo会跟着重定向吗?会不会存储响应的内容?经测试后,最终流程图如下:

77.png

现成的一些Web服务器很难直接用于这类攻击,所以我决定编写一个http服务器来执行攻击。我编写了代码,运行它,并成功利用这个上传功能进行了攻击!看来我的猜测是正确的!

注意:在Vimeo中,你可以下载你的原始视频文件,这样就可以很容易地找到有问题的请求。

88.png

利用

我已经收集到了关于目标服务器的信息,它是一个谷歌云实例,我还尝试检索实例的元数据,通过重定向到http://me tadata.google.internal/computeme tadata/v1beta1/instance/service-accounts/default/token来进行攻击,最终我能够得到他们的Compute Engine api访问令牌!这对我来说是一个伟大的时刻,因为这是我第一次发现高危的SSRF!

99.png

时间线

4月29日:由HackerOne团队进行分类。

4月29日:Vimeo最初奖励了100美元。

5月1日:漏洞已修复。

5月1日:再次发放4900美元的奖励。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/@dPhoeniixx/vimeo-upload-function-ssrf-7466d8630437

最新评论

昵称
邮箱
提交评论