利用Google Classroom API漏洞获取任意用户Google Drive文件访问权限

本文详细分析了通过Google Classroom API存在的权限验证缺陷,攻击者可以获取其他用户的Google Drive文件所有权。包含具体的API请求示例、利用步骤及Google的修复情况。

泄露所有用户的Google Drive文件

大家好!好久不见。我决定写一些新的博客文章,介绍我多年来在Google发现的一些顶级漏洞。我希望在接下来的几周里,继续撰写更多这样的文章,作为一个系列,所以请保持关注。

在这篇新文章中,我将写一个几年前的有趣发现,它允许你获取其他用户的Google Drive文件访问权限。对于那些不知道的人,Google Drive是一个文件共享服务,你可以上传Word文档、PDF文件或任何文件,并与其他用户共享。如果文件是私有的或不打算与你共享,你会收到一个访问被拒绝的错误。

今天,我将展示如何在不被授予访问权限的情况下,获取其他人的Google Drive文件访问权限:)。

在开始之前,我想说这个问题已经修复,Google VRP为此支付了不错的奖金:D。

POC:

在开始介绍这个POC之前,我需要解释一下Google Classroom的一些背景。对于那些不知道的人,Google Classroom是Google为教师/学生提供的服务,用于在类似课堂的环境中协作。你可以在classroom.google.com找到它,其工作方式是教师可以发布公告、作业、评分论文等。

当教师在Google Classroom上发布作业时,学生会收到一个页面,用于向教师提交作业。例如,这个页面看起来像这样:

学生可以看到上述页面,向课堂的教师提交作业以进行评分。

在提交作业时,学生有能力附加一个文件到作业中。假设学生需要附加他们为班级写的论文。他们会将他们的Google Drive DOC附加到作业中,然后点击提交。

这就是问题出现的地方。

当学生向教师提交作业时,Google Classroom有一个过程,会授予课堂教师对提交文档的所有权。这是必要的,因为显然教师需要能够阅读学生提交的文档。

当学生实际将Google Drive文件添加到他们的作业中时,会运行以下API请求:

1
2
3
POST /v7/writesubmission?_reqid=4786040&rt=j HTTP/1.1
Host: classroom.google.com
f.req=[[3],[[["18537069787",["46653220298",["41400909728"]]],[["18537069787",["46653220298",["41400909728"]]],null,null,null,[[null,null,"1h8tReWm8Cp6bsv24BwMlimFrJ3w1d7sdpxYHfUr1rgw",2,"application/vnd.google-apps.ritz",null,null,null,null,null,null,null,null,null,[null,2]]],null,[],null,null,null,null,null,null,null,null,null,null,null,[],[]],[null,true],[]]],[null,true,null,true,true,null,true,true,true,null,null,null,true,null,[true],null,null,null,true,true,true,null,null,null,[[true,true]],[[true,true]]]]

如果我们仔细看,可以看到这个值:

“1h8tReWm8Cp6bsv24BwMlimFrJ3w1d7sdpxYHfUr1rgw” 这是学生的Google Drive文件的ID,例如正在提交作业的文件。没有适当的RBAC检查来验证你是否实际拥有附加到作业的Google Drive文件。

所以现在我们知道我们可以将任何Google Drive文件附加到我们的作业中,但Google Classroom后端会授予我访问文件的权限吗?

在第一次测试中,它没有授予我访问权限。因此,当时我认为RBAC检查工作正常,如果有什么的话,更多的是UI问题。当简单地更改上述请求中的ID时,我无法获取我的其他帐户的Google Drive文件访问权限。

绕过方法?

经过进一步挖掘,有一个绕过方法完全有效。如果你将目标用户添加到你的Google Classroom作为学生/教师,那么你现在可以使用上述请求完全获取他们的Google Drive文件的完全访问权限。

流程如下:

  1. 将目标用户添加为你的Google Classroom的用户,并在课堂中创建一个作业。
  2. 添加另一个你控制的帐户作为学生到课堂,并登录该帐户。
  3. 作为你登录的学生帐户,提交一个作业,并修改此请求:
1
2
3
POST /v7/writesubmission?_reqid=4786040&rt=j HTTP/1.1
Host: classroom.google.com
f.req=[[3],[[["18537069787",["46653220298",["41400909728"]]],[["18537069787",["46653220298",["41400909728"]]],null,null,null,[[null,null,"1h8tReWm8Cp6bsv24BwMlimFrJ3w1d7sdpxYHfUr1rgw",2,"application/vnd.google-apps.ritz"

并在步骤1中添加的课堂用户的Google Drive ID处放置目标用户的Google Drive ID。

  1. 提交作业,你现在将能够访问他们的整个Google Drive文件并获得所有权。

就是这样:) 这里还有一个视频:

注意音乐,因为Google VRP喜欢音乐,所以我通常会添加它。

如果你有任何问题,请随时在X上联系我: Cam (@SecretlyHidden1) / X

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计