新版畅课禁止下载无权限PPT课件?或有漏洞可以绕过权限控制
前言
近期笔者发现畅课进行了一系列的更新,其中最主要的一项就是引入了阿里云的多人协作在线文档阅览系统,这个更新直接导致了原先通过IDM下载没有下载权限的PPT课件的方法失效了(之前的下载方式可以参考这篇文章:畅课(tronclass)如何下载没有权限的视频和课件 – 哔哩哔哩 (bilibili.com))。经过研究发现,阿里云多人协作在线文档的防盗版系统还是做的比较完善的,所有PPT课件内容都是由JavaScript进行渲染显示,并且加载方式也比较奇葩,它不是直接显示PPT课件的整个文档,而是将PPT课件里面的图片等内容拆分成一个个“shapes”组份,并在本地用js脚本再将这些组分重新组合排列成PPT课件本来原有的样子,如下图所示:
这个新变化加大了下载无权限课件的难度,但是也不是完全一点漏洞都没有。既然没有下载权限,那我们可以从预览API这个地方下手,通过下载系统生成的预览文件间接达到漏洞测试目的。
教程开始
首先,我们需要获取我们所需课件的“upload_id”和“reference_id”这个参数。在电脑浏览器中找到你想下载的课件的详情页,但是不要急着打开预览。我们需要按“F12”这个按键调出浏览器开发者工具,切换到“网络”选项卡,然后勾选“保留日志”。准备好以上步骤之后,刷新一下页面,我们将会抓取这一步时浏览器发出和接收到的所有HTTP请求,它包含了该章节所有附件资源的各种信息,如下图所示。
然后,找到与“activities id”相同的这个网络请求。“activities id”是畅课系统内部标记不同教学活动的一串数字,同一门课下面每一个教学活动(一般也就是每一个章节)都有一个独一无二的“activities id”。在这里,我们可能会发现有多个名字都为“activities id”的网络请求,我们需要找出请求URL为“https://****/api/activities/{activities_id}”的请求,点击它并切换到“负载”这一栏,一直往下拉找到“uploads”并一级级地打开下级被折叠起来的内容,我们可以看到第一个附件对应的“upload_id”和”reference_id清晰地显示在这里。
一般情况下,你所选的这个教学任务里面有多少个附件,“uploads”下面就有多少条信息,从0开始排序,每条都把相关附件的各种信息包含在内了,例如上传时间、附件大小、附件名称、上传人的工号ID等等,如果有视频文件也可以通过类似方法进行下载。
接着,在学校的畅课系统访问主域名后面加上一串链接:“//api/uploads/reference/document/{这里填写你刚刚获取到的reference_id,并且把花括号去掉}/url?preview=true”。举个例子,如果学校的畅课系统域名是“https://course-online.abc.edu.cn”,而获取到的“reference_id”是123456,那么最后我们得到的链接是长这个样子的:“https://course-online.abc.edu.cn//api/uploads/reference/document/123456/url?preview=true”,将这串网址输入到浏览器中打开后,我们应该会得到下面这样的一个页面:
如果“status”的值为“ready”,这说明我们的PPT可以正常下载,而“url”的值就是该PPT课件的下载链接,我们只需要复制出来并粘贴到浏览器或者任意下载器中就可以得到我们的文件了。如果“status”的值是“failed”,则说明这种方法无法正常下载你想要的课件,目前暂时没有好的解决方法。
关于“upload_id”的用途解释:一般情况下我们用“reference_id“就能下载到我们想要的文件,但是也会有一些例外,如果你发现下载到的文件不是你想要的文件,那么你可以尝试使用“upload_id”来替换“reference_id“并再次下载。如果你用“reference_id“一次就能下载到你想要的文件,那么“upload_id”对于你来说就是多余的,可以不用管他。
结语
这个方法目前仍然有效,经过2023年10月的实际测试,某些“reference_id”会获取到奇奇怪怪的文件,所以读者可以使用“upload_id”碰碰运气。对此还有其他可行的方法,例如取消对话框插件+不支持阿里云文档预览的旧版畅课APP+抓包可以获得真正的下载链接,不过对于普通人来说难度较高,本文不再赘述。
本文版权归作者所有,转载搬运请注明出处。本文仅供漏洞查找及分析使用,请遵守所在地区的相关法律法规。
后续更新
2024/3/20更新:实测发现,目前“reference_id”已经更名为“referrer_id”,并且只有在单击课件跳转到阿里云文档打开的时候才会触发带有“referrer_id”的请求,所以从现在开始需要逐个打开课件进行“referrer_id”的获取。
按“F12”这个按键调出浏览器开发者工具,切换到“网络”选项卡后,再点击打开课件,等待阿里云文档加载完成。然后,在“aliyun?preview=true”这一个网络请求下面,找到“count?conditions=”这一个请求,切换到“标头”旁边的“负载”一栏,里面的”referrer_id”就是我们需要的东西。
获取到“referrer_id”后直接按照上面的方法进行下载即可,下载方式没有发生变化。
这两天我会再验证一下方法是否还有效,然后更新一下文章。不过基本的思路是通过审查元素分析网页的元素获取到课件对应的附件ID,然后找一个老师开放下载权限的文件,抓取下载地址后拿前面弄到的附件ID做替换大法。不过这种方法有个缺点:就是你要下载的文件必须在你学校的畅课内部系统里面存在转码好的文件,如果提示转码失败的话暂时没办法下下来。
文章已更新方法,欢迎交流
谢谢谢谢
idm下载法失效后一直没法下载困扰许久,实在是不太能忍受在线阅读的效果。搜索后找到文章,实测有效,感谢博主。
不客气,很高兴能帮上忙
现在好像没有reference_id这个东西了,搞得又不能下载了
现在变成“referrer_id”了,具体在网络选项卡里面的XHR栏——“count?conditions=”这个请求的负载——查询字符串参数里面的“conditions”可以找到,稍后我会更新文章