谷歌课堂漏洞:如何越权访问他人Google Drive文件

本文详细分析了谷歌课堂曾存在的一个严重安全漏洞,攻击者可通过修改API请求中的Google Drive文件ID,结合特定操作流程越权获取其他用户的云端文件所有权。漏洞涉及RBAC缺失和权限提升机制,已获谷歌VRP奖励。

泄露所有用户的Google Drive文件

大家好!好久不见。我决定撰写新的博客文章,分享多年来我在谷歌发现的一些顶级漏洞。希望未来几周能持续发布这个系列文章,敬请关注。

本文将要介绍的是几年前我发现的一个有趣漏洞,该漏洞允许你获取其他用户Google Drive文件的访问权限。对于不了解Google Drive的用户来说,这是一项文件共享服务,你可以上传Word文档、PDF文件或任何类型的文件,并与其他用户共享。如果文件是私有的或未与你共享,你将收到访问被拒绝的错误提示。

今天,我将展示如何在不被授权的情况下访问他人的Google Drive文件。

在开始之前,我需要说明该漏洞已被修复,并且谷歌VRP为此支付了丰厚的奖金。

概念验证

在介绍POC之前,我需要简要说明一下Google Classroom的背景。Google Classroom是谷歌为教师和学生提供的协作平台,访问地址为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"
    

    将ID替换为你在步骤1中添加至班级的目标用户的Google Drive文件ID。

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

就这样!这里还有一个视频演示:

(请注意背景音乐,因为谷歌VRP喜欢音乐,所以我通常会加上。)

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

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