人生苦短,请把时间用在有意义的地方。

本帖所包含的内容仅限技术交流和学习研究使用,禁止用于其他用途!因使用不当造成的一切后果与本人无关!

某些领导总是爱做面子工程,像这种网络学习什么安全教育完全是在浪费时间,我们应该把时间花在有意义的地方,比如……想办法找出这个系统的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抓一遍后看到它的流程大概是这样的:

  1. 请求原网页GET studentstudy
  2. 记录日志GET setlog
  3. 请求视频框架网页GET studentstudyajax
  4. 请求课程清单GET studycourselist
  5. 请求视频网页 GET card
  6. 检测并行数GET passport
  7. 请求字幕、弹幕等无关内容
  8. 根据你选择的线路请求视频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引起的原因是相信了客户端的“视频播放完成”这个动作,做后台的要牢记一切客户端的数据和行为都是不可信的,就算你的验证再复杂(比如本例中的各种登陆验证,数据验证),一旦动作的执行(函数调用)出现问题(本例中伪造了播放位置导致视频播放完成动作被触发)了,那么发出去的数据即使被正确加密验证,也会被绕过。