某网络学习系统强制学习时间绕过及BUG利用
人生苦短,请把时间用在有意义的地方。
本帖所包含的内容仅限技术交流和学习研究使用,禁止用于其他用途!因使用不当造成的一切后果与本人无关!
某些领导总是爱做面子工程,像这种网络学习什么安全教育完全是在浪费时间,我们应该把时间花在有意义的地方,比如……想办法找出这个系统的BUG。
本例Github地址:https://github.com/MXWXZ/Net-Learning-Fucker
0x00 看看它长啥样
首先这个玩意儿会检测你的鼠标状态,如果不在那个播放器框框里就自动暂停,然后过一会还会弹框,还TM不允许并行观看,非常恶心人。单纯搞掉它的鼠标限制不是难事,毕竟客户端的一切检测都是纸老虎。要干就搞波大的,直接完成学习目标。
0x01 第一波试探
首先看看源码,不得不说这玩意儿写的相当屎,逻辑啥的混做一团,我也是呵呵了。然后发现它居然还是Ajax动态获取播放器那一块的网页,哦哦对,它选择课程的切换还是无刷新的,当然要用ajax。那么我们看看F12吧,找到那一块发现了一些有趣的东西,播放器的参数有个flashvars
,里面经过urldecode
解码后发现是一些视频信息之类的,里面有一个很让我们兴奋的参数:
start=xx
这个后面的xx就是你当前的播放时间了,我们接着看,嗯?后面还有一个JS,里面也有一个
playTime=xx
???什么情况,这是人为混淆么(笑),不管它我们都改一下,当当当当!失败了……视频还是从之前的地方开始。
0x02 数据包分析
前端路走不通我们就干老本行把,播放的记忆啥的总归会和服务器通信的,我们来看看它的通信包。Fiddler抓一遍后看到它的流程大概是这样的:
- 请求原网页
GET studentstudy
- 记录日志
GET setlog
- 请求视频框架网页
GET studentstudyajax
- 请求课程清单
GET studycourselist
- 请求视频网页
GET card
- 检测并行数
GET passport
- 请求字幕、弹幕等无关内容
- 根据你选择的线路请求视频
POST video
目前我们只要单线程搞就可以了,翻了翻那些请求也没什么东西,就是一堆ID和验证,看看地址和cookie好像还有个enc密钥……害怕.jpg。
那么我们再看看他是如何保存的吧,请求视频的同时会返回一个包含start
参数的json,正是这个参数记录了你的观看位置,那么必然会有一个通信来提交它,我们把鼠标移出去再移回来试试。
果然有一个GET logxxx
地址后面一堆验证和id的包了,地址中有一个变化的playingtime
参数,想必这个就是的了。
0x03 第二波试探
我们首先就是看看直接GET
把这个参数修改掉可不可以,发一个包!403……不行我截包修改!403……看来后面那串验证还是有用的,这条路看来是走不通了。
我们再想想,它要求看到70%就算过了,那么到达的时候肯定有一个包!我看呀看好不容易看完了,然而TM它居然就是之前那个记录观看位置的包!卧槽这也太节省了吧(好像也没什么问题)!!
我们继续想办法,按流程往上推,我们来改改视频请求返回的参数试试,通过分析发现参数包含了下面的内容
dragAble:貌似是看完了视频就可以拖动滑动条了,这个应该是个标志
startPoint:观看位置
singleid:未知数字
lock:未知锁(?)
videourls:不同线路的视频真实地址
嗯我们再来改改这里试试,后面的流程都有验证不好搞,那么我们直接伪造一下视频的信息看看。GET断点下上,改掉startpoint
,成功!哈哈我们成功跳转到想要的地方了,而且还有意外惊喜,我们的视频任务已经显示完成了!!看来这个东西完成是一个单独的字段,只要视频播放达到要求就行了,但是却没有检测你看的是哪个视频以及开始的位置!
0x04 自动化
找到BUG就好办了,因为这个是https的流量,而且还有一堆的登陆cookie和各种验证,我们直接用fiddler的autoresponder来伪造数据包。把截取地址改成那个POST的地址,然后返回的东西就随便找一个包,把里面startPoint
这个字段改成900(意味着开始位置为900s),然后试试,果然!视频一播放就自动跳到最后了,然后发了一个正确加密验证的log包到服务器,服务器判断视频看完了写入完成字段。顺利Bypass。
0x05 总结
这个BUG引起的原因是相信了客户端的“视频播放完成”这个动作,做后台的要牢记一切客户端的数据和行为都是不可信的,就算你的验证再复杂(比如本例中的各种登陆验证,数据验证),一旦动作的执行(函数调用)出现问题(本例中伪造了播放位置导致视频播放完成动作被触发)了,那么发出去的数据即使被正确加密验证,也会被绕过。