记一次对优学院和云班课的前端代码审计

很多大学都使用一些在线学习平台来布置和考察作业。作为一名计算机专业的大学生,又颇爱研究Web安全,循规蹈矩地做作业当然不是我的风格,干就完了。


蓝墨云班课——破解视频进度不可控

我校部分专业课老师经常在云班课上发布一些“教学资源文件”,每看完一个视频或文件,都会被后台记录并获得对应的经验值。

先来一张成果图

由于之前测试过学习通,直接重放视频观看结束后的包是不可行的。后端的数据说到底还是从前端JS传过去的,于是这次决定从前端入手,直接修改前端的值,符合程序逻辑一点。

随便打开一个视频看看情况

最下边一条灰色的bar,是进度条,看着像自己做的那种。先打开F12看看情况。

直奔目标,审查进度条元素,发现有事件监听器,展开事件监听代码,看看功能。

哟西,有注释,看一遍学生们就懂了,是个好程序员,往下翻翻。

联系上下文,高亮部分的代码作用大概就是:

  • 计算已看进度和总进度的百分比
  • 按百分比绘制进度条
  • 设置当前看过的视频时间

既然那么简单明了,那么就直接Ctrl-C,打开Firefox控制台

直接定义一个函数,将进度调整到9999,调用自定义函数。可以看到,9999明显超长,绘制的进度条已经超出了屏幕宽度,预期的效果有了。
有同学之前质疑,前端只是表面,那么后端数据更新了吗?刷新一下看看。

很OK,50分钟的视频,一两分钟就看完了,美滋滋。


优学院——破解视频进度不可控+获取选择题答案

第一部分 破解视频进度

优学院相对于云班课来说,就麻烦了一点。

还是先上一张成果图。

随便打开一个视频

按照之前的测试方法,打开F12,审查进度条元素。

前后翻了一下,只有这段代码有事件监听器,而且代码已被混淆处理,难以阅读。既然这样,就直接去调试器里看看了。

翻了一下文件,盯上了PageViewModule.js,文件名可疑,参数和注释更可疑。

这段代码的逻辑比较明了,大概是这样:

  • 如果观看时间>=视频总长度,视频进度设置为100,此判断可能是为了防止数值过大出现异常。
  • 如果观看进度>=95%,视频进度设置为100,此判断可能是为了容错。

这段代码中有个方法被多次调用:element.record(),由第二个判断条件来看,element.record().status(1)可以直接把视频状态更新为已看完。
去控制台直接改一下试试

element变量不存在,有几种可能,pageViewModule.js可能没有被直接引用,element可能是一个当前作用域无法访问的局部变量。那么,就下一个断点,刷新页面试试。由于代码中的两处逻辑判断,条件不成立,无法跳入,那么,我选择在第一个判断前下断点,就是下图中的第765行。

刷新页面,运行到断点,js停止。

输入代码,element.record().status(1),回车

刷新页面看一下,后端数据是否更新

很OK,破解完成

第二部分 获取选择题答案

这个就比较简单了,BurpSuite挨个抓包,每个选择题对应一个题目ID,通过一个接口,可以获取对应题目ID的答案。


结语

之前我一直把Web安全的重心放到后端,其实实际场景中,前端也会出现很多小问题,而且JavaScript是重点关注对象。