专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
程序员的那些事  ·  NPM 作者推出全新的 ... ·  3 天前  
程序员的那些事  ·  喜大普奔!GitHub Copilot 免费了 ·  5 天前  
程序员小灰  ·  我的第一个副业是什么? ·  1 周前  
51好读  ›  专栏  ›  程序员大咖

我是如何用前端技术得到XXOO网站VIP的

程序员大咖  · 公众号  · 程序员  · 2016-12-29 19:29

正文

这是一个技术贴,文章的作者Wscats用前端技术破解了某XXOO网站的VIP,揭示了网站的一些工作原理。喜欢的人可以点击阅读原文去给原作者打星。作者高兴了,说不定就把网站也发给你了呢  :)

网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理。

首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔几秒钟弹出第几几几个会员充值成功,我们先把这个删掉。

好了,我们继续研究这个网站内部结构了。

正常情况每个页面的视频都是试看几十秒就会提醒你充值,当然这是这类网站的常规套路,我们在浏览器的Network观察加载的js,我们可以看到里面这段代码。

这是一份叫做lsj.mp4.js的代码的其中一部分,我们可以看到里面有个关键的判断,具体就是判断你是否是会员,关注公众号:程序员大咖,如果是那就根据类型是否是2返回play_url_arr_oumei数组和play_url_arr数组拼接一个url给你,如果你不是会员的话就进入试看的判断,很清晰的看到有一个url,那就是试看的短视频的路径。

var isvip = getCookie('lsjyy'); 

if(isvip != undefined && isvip != ''  && isvip.match(rgExp)){}else{}

上面这两句还告诉我们第二个关键点就是我们可以根据isvip的cookie值来伪造身份,这个cookie就是保存到我们的本地浏览器上,所以如果我们能成功改写它的话我们就能变成会员绕过这个判断,这份代码已经封装好getCookie,所以我们可以在控制台直接调用来改写cookie值,但是问题来了,我们应该改成什么值才能绕过判断呢,我们继续看源代码搜索答案。

function getMp4Url() {

        var play_name = getParam('play_name');

        var type = getParam('type');

        var rgExp =/^(v|V)[i|I|p|P|0-9]{2,3}$/g;

        var isvip = getCookie('lsjyy');

        var pic = $('.movie-pic img').attr('src');

        var html = '';

        html = '';

        var play_url = '';

        //vip会员

        if(isvip != undefined && isvip != ''  && isvip.match(rgExp))

        {

            var play_mp4 = getCookie('play_mp4');

            if(type == 2)

            {

                play_url = play_url_arr_oumei[play_rand2];


            }else{

                play_url = play_url_arr[play_rand];


            }

        }

        //试看

        else if(( play_name != '')&&(play_name != 'undefined'))

        {

            

            play_pic = 'http://oewx8de7n.qnssl.com/9e0120cv23/images/'+play_name+'.jpg';

            play_url = 'http://oewx8de7n.qnssl.com/9e0120cv23/images/mp4/'+play_name+'.mp4';

        }

        else

            play_url =  "http://su.cywl5.com/sy/h34.mp4";

        return play_url;

}

在lsj.pay.js?v=256这份代码的279行中我们又找到了一个线索,我们从代码看到,如果支付成功会在本地浏览器设置用户的cookie值,有两个关键的值出现了,分别是lsjlsjyy。

lsj

setCookie('lsj', pay_tee, 'd730');

lsjyy

setCookie('lsjyy', 'vip', 'd730');

其实我想了很久这个名字跟vip有什么关联,估计这个网站的作者想写的是老司机和老司机YY的意思吧,不过不管它是什么意思,现在只要我们尝试用它封装好的setCookie方法自己改写这两个cookie值,就能在本地顺利成为会员,绕过刚才的判断条件了。

lsj.pay.js

function checkOrderStatus() {

    $.post("./pay/ok.php?action=check&uid="+getCookie('user'), function(data) {

        var pay_tee = Number(data);

        if (pay_tee >= 1) 

        {

            ispay = 1;

            ispay = true;

            var lsj = getCookie('lsj');

            if(lsj == null) lsj = 0; 

            if(pay_tee > lsj)

            {    

                setCookie('lsj', pay_tee, 'd730');

            }

        }   

        if ((pay_tee > 0)&&(pay_tee

        {

            setCookie('lsjyy', 'vip', 'd730');

        }

        else if ((pay_tee > s_v1_money)&&(pay_tee

        {

            setCookie('lsjyy', 'vip2', 'd730');         

        }

        if (pay_tee >= 1) 

        {

            var dt1 =Math.round(new Date().getTime()/1000);

            setCookie('lsjtime', dt1, 'd730');

            setCookie("isPayClick",0, 'd1');

            var isPayClick = getCookie("isPayClick");

            if (isPayClick == 0)

                window.location.reload(); 

        }

       // el_checkpay.hide();

    })

其实往下也可以看到有一个clearVIP函数,更肯定了刚才我们的结论,VIP和非VIP其实就是这两个值在作怪,所以我们默认的值应该就是clearVIP函数设置的值。

function clearVIP()

{

    setCookie("lsjyy",0, 's1');

    setCookie("lsj",0, 's1');

}

如下图,我们在浏览器执行这两个函数,执行成功后我们就能看到cookie被成功改写。

在这里我设置lsjyy为vip2,当然我在后面测试的时候发现这两个值貌似没什么区别。

然后我们可以用lsj.pay.js第179行的showpay函数来检测是否已经是成功变成VIP。

function showpay() {

    var rgExp =/^(v|V)[i|I|p|P|0-9]{2,3}$/g;

    var isvip = getCookie('lsjyy');

    if(isvip != undefined && isvip != ''  && isvip.match(rgExp))

    {

        alert('您已经是vip了哦.');

        return false;

    }

   //省略后面的代码

}

如果成功完成上面的步骤,我们在控制台输入showpay()就会看到下图这个弹窗,那证明我们已经成功升级为VIP...

我们再次进入其中一个带有视频的网页看看变成VIP会会真的有VIP的"待遇",我们发现页面内容块变成了空白,控制台报了下面这个错,那是提示有一个值叫play_rand没有定义,其实来到这里我们已经发现我们已经绕过了刚才会员判断,进入我们是会员的判断分支,只是因为一个未定义的值停止了代码的运行。


由于这个值我们可以看到是一个数组的索引值,所以我们在控制台全局定义。

var play_rand = 1


我们把id为play-html节点的元素样式设置diplay为显示,我们就可以看到正常的播放器出来了。

分析源码得知,它大概的工作原理就是根据url的参数,比如play_nameplay_type,根据你是否VIP然后加载播放器播放拼接完的URL,play_name还含有undefined很不科学,说明有些视频根本只有图没有源。

打开play.html查看里面的源代码,可以看到视频的链接源。

play.html第21行: