原文:
https://bugs.xdavidhu.me/google/2021/01/11/stealing-your-private-videos-one-frame-at-a-time/
早在2019年12月,就在我开始对Google VRP进行黑客攻击后的几个月,我一直在看YouTube。 我想找到一种访问不属于我的私有视频的方法。
将视频上传到YouTube时,可以在3种隐私设置之间进行选择。 Public(表示任何人都可以找到并观看您的视频),Unlisted(仅列出知道视频ID(URL)的用户观看该视频)和Private(仅允许您观看该视频或有权限的其他帐户)被允许这样做。
我要做的第一件事是将视频上传到第二个测试帐户的YouTube频道,并将视频的隐私设置为“私人”,这样我就可以使用该视频进行测试了。 (请记住,请始终仅对您拥有的资源/帐户进行测试!)如果我可以找到使用我的第一个帐户访问该视频的方法,则我们发现了一个漏洞。
我开始使用第一个账户访问YouTube,尝试所有功能,按我能找到的每个按钮,每当看到其中带有视频ID的HTTP请求时,我便将其更改为目标私有视频,希望可以泄漏一些 有关它的信息,但我并没有真正获得任何成功。 YouTube的主要网站(至少是我测试过的端点)似乎总是检查该视频是否为私有视频,并且在尝试请求有关目标私有视频的信息时,他们总是返回错误,例如“此视频是私有视频!”。
我需要找到其他的方式。
在这种情况下,一种很有趣的方式是尝试寻找其他产品/服务,这些产品/服务不是您的主要目标,而是以某种方式与其内部资源进行交互。 如果他们可以访问其资源,则可能他们没有主要产品所具有的所有保护级别。
满足这些要求的有趣目标是Google Ads。 这是广告客户用来在所有Google服务(包括YouTube)中制作广告的产品。 因此,您可以在此处通过广告客户在Google Ads平台上设置YouTube视频之前获得的广告。
因此,我创建了一个Google Ads帐户,并创建了一个新广告,该广告可以播放我的视频作为YouTube用户的可跳过广告。 在广告制作过程中,我也尽力使用目标私有视频的ID,但没有成功。制作广告后,我开始研究所有不同的Google Ads功能。 这个东西很大,它有很多不同的设置/工具。 我试图找到任何可能与YouTube相关的内容。
有一个名为“视频”的页面,在这里我可以看到广告使用的视频列表。 单击视频可打开该特定视频的“分析”部分。 它具有嵌入式播放器,一些统计信息以及一个有趣的功能,称为Moments。 它允许广告商“标记”视频的特定时刻,以查看何时发生不同的事情(例如公司徽标出现的时间戳)。
坦白说,我不确定广告客户将此功能用于什么,但它似乎很有趣:

查看代理日志,每次我“标记一下”时,都会向/ GetThumbnails端点发出POST请求,其主体包括视频ID:
POST /aw_video/_/rpc/VideoMomentService/GetThumbnails HTTP/1.1
Host: ads.google.com
User-Agent: Internet-Explorer-6
Cookie: [redacted]
__ar={"1":"kCTeqs1F4ME","2":"12240","3":"387719230"}
在__ar参数中,其中1是视频的ID,2是时刻(以毫秒为单位)。 响应是base64编码的图像,它是Ads显示的缩略图。
我做了很多次,然后将ID替换为请求中第二个帐户的“私有”视频,令我惊讶的是,它返回了base64响应!
我迅速用Google搜索“base64到图像”,然后将base64粘贴到我找到的第一个解码器中,它显示了目标私有视频的缩略图!有效! 我发现了一个有效的IDOR(不安全的直接对象引用)错误,可以从YouTube上的任何私人视频中获取帧!但是我就像“嗯,那只是一帧”。 我们可以做得更好。
我想做一个漏洞Python脚本,该脚本生成一个实际的移动“视频”。 我搜索了一些计算结果,发现如果视频速度为24 FPS,则一帧在屏幕上停留33毫秒。 因此,我只需要下载从0毫秒开始的每张图像,每次增加33毫秒,然后使用我获取的所有图像来构建某种视频。
我写了一个快速而脏脏的POC,它在视频的前3秒钟下载了帧,对其进行了解码,然后生成了GIF。 为了对其进行测试,我将其与我的旧视频进行了比较,当然,由于社恐,我以前将其设置为private,视频链接:https://youtu.be/G3bNbYRTxZM。
使用此漏洞,您已经拥有了一个恶意攻击者可以下载任何私人YouTube视频的功能,对我来说,这是非常不错的影响。
但是当然,它有一些我无法克服的限制:
⚪在现实世界中,您将必须知道目标视频的ID。 大量泄漏这些ID本身就是一个漏洞。
⚪由于这些只是图片,因此您无法访问音频。
⚪分辨率很低。(但可以看到正在发生的事情)
从该漏洞中得出的结论是,两个不同产品在后台相互交互的情况始终是一个值得关注的好地方,因为两个产品团队可能只最了解自己的系统,并且在使用其他产品时可能会错过重要的资源细节。
寻找这样的不安全对象引用可能是一项非常重复和手动的任务,如今,我尝试避免仅在各处盲目更改ID并希望获得最佳结果。在对产品进行一段时间的测试并了解其内部工作方式之后,尝试根据您所看到的内容考虑开发人员可能没有想到的各种意外操作可能会更有效(也更有趣)。或专注于刚刚发布的功能,或仅执行任何其他无关紧要的任务。从长远来看,您可能会更喜欢它。我认为,您对系统的了解越多,自然就会想到关于如何破解该系统的更多想法。
但是,即使在功能最健壮且经过良好测试的系统中,也有可能仅在请求中交换ID就会遇到严重的漏洞。
时间线:
[2019年12月11日]-报告了漏洞
[2019年12月12日]-初始分类
[2019年12月20日]-接受漏洞(P4-> P1)
[2020年1月8日]-通过暂时禁用Moments功能来缓解错误
[2020年1月17日]-奖励$ 5000
[2020年??月??日]-重新启用了“Moments”功能,现在它会检查您是否有权访问视频
译者按:
挖漏洞最重要的3点是什么?差异性!差异性!还TM是差异性!作者通过尝试不同产品对于同一资源权限控制得差异性,获得了对private视频的访问权限。这种漏洞不仅仅涉及到代码层面的问题,更有可能涉及到不同的项目组之间的交流,所以这种漏洞修复起来周期也会拉的很长。译者也曾经在挖掘某短视频网站时,尝试过此种类型的漏洞,但是很可惜,没有成功。如果哪位白帽子成功利用了这种类型的漏洞,希望能告诉我,我们交流一下。
本文迁移自知识星球“火线Zone”