从我作为一个农民程序员,写下第一行response.write “safsdfdsf'”,到我后来写追梦阳光的系列开源程序,大大小小也算个程序员。程序员的水平,直接决定了你的作品是否可用,是否能用、是否耐用。最近几年因为工作和家庭的事儿比较多,也算是转型了,很少再从事程序的开发,但是对程序的执着热爱,还是有那么一点,在心里。我觉的,跟程序打交道,无论是写程序,还是分析改别人的程序,都是一件枯燥但是又很有乐趣的生活,耐得住寂寞,经得起诱惑,坐得稳屁股,看得进代码,吃的透逻辑。
前段时间,幼儿园的老师让帮忙下载几个幼儿园教师的培训课程,我根据幼儿园提供的用户名和密码,登录了系统,发现这个系统做的很有特点,根据授权的权限不同,可以看的内容也不同,采用了会员制度,注册会员,审核后可以在一定时间和次数内观看教程,过期无法收看,收看次数满了后无法收看。有时,因为网络问题,不能一次看完,下次想要看就没有办法了,所以幼儿园老师提出了这个问题,希望能够下载这些视频。
我分析了一个多小时,通过路径抓包和缓存监视,找到了这个网站的逻辑:
该网站的视频数据存放于第三方网站服务器,该网站号称专门为教程类站点提供视频,可以加密,保证数据的安全访问,不可下载。观看的时候,,通过http协议加载到缓存文件夹的pcf文件也是一个加密的文件,在拿不到加密密码的情况下,根本读不出。虽然说可以破解它的flash播放器和加载xml,继续研究他的密码是怎么传输的,但是实际意义不大了。毕竟拿到的视频无法转码,无法用普通播放器播放。于是我采用了录制视频的办法来临时抱佛脚,暂时解决了这个问题,录制需要一比一的时间,费时费力。
后期,继续研究,控制次数和时间在教程网站控制。过期后,视频路径观看不受影响。
这是一个很大研究突破,因为如果你对视频转码没有思路的情况下,完全可以放弃这条路了,回过头来走网站的路,从网站上找找bug,也许真的是一个好办法。
一个偶然的机会,我发现了这个网站在提示的时候,感觉浏览器没有往日别的网站提示的那种迅捷与清爽,感觉拖泥带水的样子。
以往,我们写程序,在页面输出前服务器进行判断,是否可以看,是否过期或者次数超过限制。然后输出alert,最后一定记得response.end来终止服务器向客户端传输后面的语句。所以,从服务器端到客户端,就是短短几行代码,非常简洁,浏览器执行起来也不费时间。但是今天发现,貌似不是。我好奇的另存了这个页面,突然就看到了这行代码后面的精彩内容——程序员在判断权限后,忘记了response.end,结果悲剧了——
我去掉了这行提时代吗,另存为。通过浏览器访问这个页面,页面可以打开了,但是视频出现了新的提示——当前域名未授权。这个提示来自视频服务器端。那怎么办呢?
虚拟一个!
于是,修改host文件,虚拟了当前的域名为127.0.0.1,然后运行域名www.xxxx.com,判断完全正确,页面正常打开,视频正常打开了。
至此,寻找这个网站的漏洞已经完成。还要感谢的是,这个网站两个域名,都经过了视频授权。我们可以主域名访问,辅助域名用来做虚拟,既可以访问网站,又可以访问我们的虚拟视频。
剩下的事儿,就是可以录制视频了或者反复看视频了,想怎么折腾就怎么折腾吧。
想起我当初写程序的时候的一些习惯来了,在任何无效判断后面,加载一条终止语句,是必须的,就像开车就必须要带驾驶证一样,不用问为什么,也不用说没有的话不是照样提示照样打不开吗?别忘了,不该传输到客户端的东西,一旦让客户看到,就没有收场的机会。
过去我们做程序,经常有客户问,是否可以采用加密的方式,不让复制,不让打印。我觉得,从技术上可以屏蔽打印和下载,但是你永远阻止不了访问用户的那颗求知的心。在没有打印机的年代,为了听歌,我们抄歌词。在不让打印的年代,一旦我需要你这个文本的东西,我照样拷屏打印甚至抄写。不让下载的视频我录制下来,不会屏幕录制也不怕,幼儿园的老师在求助我 之前,已经端着摄像机对着屏幕录制了两堂课了——佩服,佩服。一定记着,不想让客户看到的东西,一定不要输出给他,否则,你就收不回来!
写程序是一个很严谨的事儿,研究起来,也挺有意思。