Vimeo上传功能中的SSRF
前言
Vimeo是一个高清视频播客网站,与大多数类似的视频分享网站不同,Vimeo允许上传1280X700的高清视频,上传后Vimeo会自动转码为高清视频,源视频文件可以自由下载,它达到了真正的高清视频标准。Vimeo允许每月上传500MB的高清或普通视频,用户可以定制视频的显示尺寸。 ————百度百科
我在和Vimeo上传功能相关的上传流中发现了某些特性,并借此发现了一个SSRF漏洞。
过程
某一天,在学习了我最讨厌的科目后,我决定休息一下,在HackerOne中找一个漏洞悬赏项目镐劳自己,很快我便瞄准了“Vimeo”。我打开MacBook,进入测试网站,利用其中的上传功能直接从Google网盘上传视频,同时利用BurpSuite捕捉实时请求:
如你所见,它发送带有谷歌授权的文件URL,让后端服务器从指定URL处获取文件,且数据包中还有Google云盘授权的请求头。
现在让我们使用WireShark,看看Vimeo网站在向我们的VPS请求一个视频文件后,会发生什么:
在这些请求中,我注意到一个不同寻常的请求头,比如Range
、Content-Range
。虽然并不常见,不过它的名字足以告诉我它是干什么的。为此,我们可以假设,在大多数情况下,视频文件是很大的,所以Vimeo不会直接请求一个特别大的完整文件。如果视频文件很小,它就会请求完整的文件,如果很大,它就会循环请求文件的一部分,直到获得完整的视频文件,具体如下图所示:
Vimeo服务器会先发送一个请求来检查文件的大小,如果文件很小,可以通过单个连接直接获取,那么它将请求完整的文件。
那么,如果我的VPS不把完整的文件发送到Vimeo服务器呢?例如,当Vimeo询问我视频文件大小时,告诉它文件只有500B
,那么Vimeo就会请求500B
大小的内容,但如果我只给它200B
的内容呢?
我用Python编写了一个Web服务器来进行测试,完整的文件长度是554231B
,当Vimeo请求完整的文件时,我的服务器只回复8228B
的内容!让我们看看此时的Range
请求头。
此时,服务器在存储了8228B
的内容后,再次请求视频文件的剩余部分。那么,是不是存在SSRF呢?
如果当Vimeo请求剩余的视频文件时,我的服务器响应一个重定向会发生什么事呢?Vimeo会跟着重定向吗?会不会存储响应的内容?经测试后,最终流程图如下:
现成的一些Web服务器很难直接用于这类攻击,所以我决定编写一个http服务器来执行攻击。我编写了代码,运行它,并成功利用这个上传功能进行了攻击!看来我的猜测是正确的!
注意:在Vimeo中,你可以下载你的原始视频文件,这样就可以很容易地找到有问题的请求。
利用
我已经收集到了关于目标服务器的信息,它是一个谷歌云实例,我还尝试检索实例的元数据,通过重定向到http://me tadata.google.internal/computeme tadata/v1beta1/instance/service-accounts/default/token
来进行攻击,最终我能够得到他们的Compute Engine api访问令牌!这对我来说是一个伟大的时刻,因为这是我第一次发现高危的SSRF!
时间线
4月29日:由HackerOne团队进行分类。
4月29日:Vimeo最初奖励了100美元。
5月1日:漏洞已修复。
5月1日:再次发放4900美元的奖励。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/@dPhoeniixx/vimeo-upload-function-ssrf-7466d8630437
最新评论