Breaking Dailymotion: A Private Video Access Control Bypass (Part1)
距离我上一次分享技术文章已经有一段时间了,我希望从现在开始能更持续地与大家交流。毕竟,一个人总是应该将自己学到的知识与他人分享。
关于时间的简短说明! 我提交给Dailymotion的报告实际上是在2023年底和2024年底完成的。我现在正处于休假状态。我一直没有发布它,是为了遵守负责任的披露原则——基本上,我想确保公司在问题公开之前有充足的时间来修复它。正如你们可以猜到的,这个过程通常需要一段时间,但我推测现在漏洞应该已经被修补了。
摘要
为了让大家能跟上我的思路,让我先解释一下Dailymotion的私有链接是如何工作的。在对他们的系统进行一番探查、更彻底地测试了他们的API之后,我发现他们基于以下这个ID格式来处理API上的一切。
x5bi2h
x4ik8d
x1ha1a
x1gg4a
我说的“一切”,指的是:用户、组织、视频、播放列表、域名、播放器……等等。
然而,我们的漏洞出现在当用户创建一个公开播放列表,但在这个播放列表中设置了一个视频为私有时(就像你在YouTube上通常能看到的那样)。在我们的案例中,我们能够获取到那个私有视频。
回到正题,他们的私有链接工作原理是在后端加密我上面提到的ID——例如 x4ik8d,然后提供一个已加密的新ID。
你可以通过 dai.ly/[Encrypted_ID] 来访问那个视频。
漏洞
到目前为止,一切看起来都正常,且按设计运行。漏洞之所以出现,是因为Dailymotion有一个GraphQL查询没有被安全地处理。我们的目标就是获取那个加密的ID。
如果你看一下那个加密ID,它大概是这个样子:
K7kBGGthRNaboVCITU0
看起来很难暴力破解,所以我们需要另寻他法。
如果你尝试从一个普通用户的视角访问一个包含私有视频的公开播放列表,它会显示如下:
(此处为图片占位符,内容提示:显示私有视频被隐藏或无法访问的界面)
在深入调查后,我发现了这个GraphQL查询,它以播放列表ID作为变量。你需要做的,就是提供一个公开的播放列表ID,然后你就可以获取到那个视频的ID。“这里有一点值得记住——GraphQL查询可以非常强大。有时,你可以包含来自其他查询的字段,仍然能获取到关于某个资源的额外信息。这是一个很巧妙的方法,可能会在你下一次漏洞挖掘中派上用场!”
|
|
正如你可能在上面的查询中注意到的,你只需替换 playlistID 就能获取到那个加密的ID。你现在需要做的就是访问这个链接 dai.ly/[Encrypted_ID],然后你就能获得访问权限。
(此处为图片占位符,内容提示:成功获取私有视频ID并访问的界面演示)
额外提示:关于ID暴力枚举的讨论
如上所述,他们用这种ID格式处理所有东西 => xxxxxx(私有或公开)。不过在这种情况下,由于播放列表是公开的,枚举起来会比较容易。但关于这个问题的讨论发生在我发现合作伙伴账户某个功能上存在IDOR漏洞时。那个漏洞也是基于相同的ID格式处理的。他们当时降级了这个问题的严重性,并说了下面这番话(我直接引用):
“这些标识符不是简单的递增标识符。有36⁶种可能的组合(2,176,782,336),这使得暴力破解并不简单。您并未提供任何能够获取有效ID列表的信息。” 实际上,他们并不完全正确。和我一起来看看这些ID:
x5bi2hx4ik8dx1ha1ax1gg4a你会注意到,第一个字符是一个固定的小写字母“x”,第二个是数字,第三和第四个是字母字符,第五个又是数字……等等。当然并非所有ID都如此,但大多数是这样。
- 字母字符中不包含大写字母,只有小写。 (此处为图片占位符,内容提示:可能展示ID字符模式分析的图表或列表) 如果你根据这些组合模式进行攻击——例如,仅用数字暴力破解第二个字符,仅用小写字母暴力破解第三个字符……依此类推——你总共需要尝试的组合数是1,423,656,这看起来是可管理的。 为了进一步测试,我仅仅发送了22,000个请求(以保持测试的简洁)。在这些请求中,有2,200个是有效的。命中率达到了10%。基于这个模式,如果你完成对这140万个组合的完整扫描,你可能会发现超过140,000个有效ID。 而且这还更好:一旦你拥有了一些有效ID,你就可以开始逐个修改字符来探索其他组合——这使得暴力枚举的方法甚至更加高效。 所以,我向他们解释了在这种情况下暴力枚举是可能的,他们随后提升了这个问题的严重性等级,并给予了我额外的奖励。
结论 再次强调,访问控制问题仍然存在,开发人员仍在犯着同样的愚蠢错误。 有些事情在理论上看起来很安全,但这并不总是与现实相符。有时你必须亲自去测试,更进一步,你会发现他们未曾预料到的缺口。就像我在ID暴力枚举部分解释的那样。 不要忽视细节,并且一定要手动测试。
下篇预告 在下一篇报告中,我将展示如何在完全不同的域名上发现同样的问题。可以把它看作是另一个绕过手法。感谢阅读,我们下次再见。再见!