V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wsscats
V2EX  ›  程序员

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

  •  4
     
  •   wsscats ·
    Wscats · 2016-12-29 10:18:22 +08:00 · 20107 次点击
    这是一个创建于 2668 天前的主题,其中的信息可能已经有所发展或是发生改变。

    查看作者原文

    网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理 image 首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔几秒钟弹出第几几几个会员充值成功,我们先把这个删掉 image 好了,我们继续研究这个网站内部结构了 正常情况每个页面的视频都是试看几十秒就会提醒你充值,当然这是这类网站的常规套路,我们在浏览器的 Network 观察加载的 js ,我们可以看到里面这段代码 image 这是一份叫做 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 = '<img src="'+pic+'" style="height:auto; width:100%;display: none;">';
            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 <= s_v1_money)) 
            {
                setCookie('lsjyy', 'vip', 'd730');
            }
            else if ((pay_tee > s_v1_money)&&(pay_tee <= s_v2_money)) 
            {
                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 被成功改写 image image 在这里我设置 lsjyy 为 vip2 ,当然我在后面测试的时候发现这两个值貌似没什么区别 image

    然后我们可以用 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... image 我们再次进入其中一个带有视频的网页看看变成 VIP 会会真的有 VIP 的"待遇",我们发现页面内容块变成了空白,控制台报了下面这个错,那是提示有一个值叫play_rand没有定义,其实来到这里我们已经发现我们已经绕过了刚才会员判断,进入我们是会员的判断分支,只是因为一个未定义的值停止了代码的运行 image image 由于这个值我们可以看到是一个数组的索引值,所以我们在控制台全局定义

    var play_rand = 1
    

    image 我们把 id 为 play-html 节点的元素样式设置 diplay 为显示,我们就可以看到正常的播放器出来了 image 分析源码得知,它大概的工作原理就是根据 url 的参数,比如play_nameplay_type,根据你是否 VIP 然后加载播放器播放拼接完的 URL , play_name 还含有undefined很不科学,说明有些视频根本只有图没有源 打开 play.html 查看里面的源代码,可以看到视频的链接源 play.html第 21 行

    <script type="text/javascript">
        var cdn_url = 'http://oewx8de7n.qnssl.com/9e0120cv23';
    </script>
    

    往下面看我们可以看到刚才play_rand选取的对应的那个视频,事实上play_url_arr_oumeiplay_url_arr数组已经定义好了 VIP 可以观看的这十几个视频,所以不管怎么样付钱后都是看这十几个里面的其中一个,在这里其实已经可以自己拼接对应的链接进入相应的视频 play.html第 324 行

    var play_url_arr_oumei=new Array();
        play_url_arr_oumei[1]=cdn_url+"/vip/2/om_1.mp4";
        play_url_arr_oumei[2]=cdn_url+"/vip/2/om_2.mp4";
        play_url_arr_oumei[3]=cdn_url+"/vip/2/om_3.mp4";
        play_url_arr_oumei[4]=cdn_url+"/vip/2/om_4.mp4";
        play_url_arr_oumei[5]=cdn_url+"/vip/2/om_5.mp4";
        play_url_arr_oumei[6]=cdn_url+"/vip/2/om_6.mp4";
        play_url_arr_oumei[7]=cdn_url+"/vip/try7.mp4";
        play_url_arr_oumei[8]=cdn_url+"/vip/try8.mp4";
        play_url_arr_oumei[9]=cdn_url+"/vip/try9.mp4";
        play_url_arr_oumei[10]=cdn_url+"/vip/try10.mp5";
        var play_url_arr=new Array();
        play_url_arr[1]=cdn_url+"/vip/try1.mp4";
        play_url_arr[2]=cdn_url+"/vip/try2.mp4";
        play_url_arr[3]=cdn_url+"/vip/try3.mp4";
        play_url_arr[4]=cdn_url+"/vip/try4.mp4";
        play_url_arr[5]=cdn_url+"/vip/try5.mp4";
        play_url_arr[6]=cdn_url+"/vip/try6.mp4";
        play_url_arr[7]=cdn_url+"/vip/try7.mp4";
        play_url_arr[8]=cdn_url+"/vip/try8.mp4";
        play_url_arr[9]=cdn_url+"/vip/try9.mp4";
        play_url_arr[10]=cdn_url+"/vip/try10.mp4";
    
    

    当然我们为了证明我们刚才上面的推测,我们可以在控制台把lsj.mp4.jsgetMp4Url 函数执行一次

    image

    我们可以看到一个可用的链接就这样出现了 当然你可以再执行如下代码,让它在网页端执行,关键就是用playHtml3 函数加载播放器,并打开拼接好的视频链接,有时候加载的是一张图片,更有时候加载的视频链接也根本无法播放,其实不管是否会员,最后也只是播放在页面最后定义好的那十几个视频,支付变成会员只是它们把数据入库,然后帮你设置个 cookie 的过程而已 当然这些网站的前端人员的代码和注释还是挺可笑的 image

    image 至此,就可以看懂这种网站的工作原理了,所以遇到小心上当了

    ----------------------update 2016.12.26-------------------------- 技术本身不可耻,可耻的是滥用技术的人! 后续更多内容可关注作者本人@Wscats或者 star 本文

    51 条回复    2017-01-13 10:22:23 +08:00
    ylsc633
        1
    ylsc633  
       2016-12-29 10:26:18 +08:00
    看完以后, 我立刻上 草 x 看了下 会员... 登陆账号... 恩! 还很正常!
    Dlad
        2
    Dlad  
       2016-12-29 10:26:39 +08:00
    楼主好定力
    newbieooOO
        3
    newbieooOO  
       2016-12-29 10:28:59 +08:00
    抓包直接获取视频地址不是更快捷?
    CuminLo
        4
    CuminLo  
       2016-12-29 10:42:17 +08:00
    可以。
    qinxi
        5
    qinxi  
       2016-12-29 10:44:15 +08:00
    newbieooOO
        6
    newbieooOO  
       2016-12-29 10:45:02 +08:00
    哈哈,牙麻碟。 这种网站要是开通移动支付,应该有不少人上当。
    djy0716
        7
    djy0716  
       2016-12-29 10:45:58 +08:00
    楼主开始的打码没啥用嘛
    longr923
        8
    longr923  
       2016-12-29 10:47:04 +08:00
    花样秀,请问,有 GV 么?
    Arrowing
        9
    Arrowing  
       2016-12-29 10:50:00 +08:00
    问个问题,如果 js 代码被混淆的话,作者还能破解吗?
    TheCure
        10
    TheCure  
       2016-12-29 10:56:18 +08:00   ❤️ 2
    ipoh
        11
    ipoh  
       2016-12-29 10:58:05 +08:00
    这就是个诱导支付的网站,楼主花了半天破解了有啥意义。
    Patrick95
        12
    Patrick95  
       2016-12-29 11:15:28 +08:00   ❤️ 3
    这篇文章告诉我们,老司机为了开车真的是拼了命的。
    Ypoem
        13
    Ypoem  
       2016-12-29 11:31:13 +08:00
    楼主大大你好.我能转载文章到公众号么,会著名出处和作者.可以的话咱们加个联系方式谈谈
    Bairrfhoinn
        14
    Bairrfhoinn  
       2016-12-29 11:35:48 +08:00
    楼主这也是蛮拼的。
    kokutou
        15
    kokutou  
       2016-12-29 11:36:59 +08:00 via Android
    老哥,稳。
    tumbzzc
        16
    tumbzzc  
       2016-12-29 11:37:28 +08:00   ❤️ 1
    这个案例告诉我们,不要通过 cookies 来判断是否为 vip 会员,而是后台通过会员标识来判断
    freebit
        17
    freebit  
       2016-12-29 11:53:12 +08:00 via Android   ❤️ 1
    这个应该属于服务器端判断 VIP,明显的逻辑漏洞
    WhyAreYouSoSad
        18
    WhyAreYouSoSad  
       2016-12-29 11:56:50 +08:00
    @Ypoem 一分享到公众号,这车就开不成了
    Phariel
        19
    Phariel  
       2016-12-29 11:57:23 +08:00 via Android
    这其实没有漏洞 有漏洞是因为本来就是诱导你交钱的站点 不是所谓的正统视频站
    Kiuber
        20
    Kiuber  
       2016-12-29 12:10:37 +08:00
    http://vip.cnoubo.cn:8080/wapyy668/index.html
    讲解素材貌似挂了。。。
    jsq2627
        21
    jsq2627  
       2016-12-29 12:31:27 +08:00
    想起来 91 炮也是改 cookie 就能有 vip
    daolin998
        22
    daolin998  
       2016-12-29 12:33:25 +08:00 via iPhone
    居然有人用 cn 域名干黄网 牛逼
    kingddc314
        23
    kingddc314  
       2016-12-29 12:53:42 +08:00 via Android
    司机稳
    nikubenki
        24
    nikubenki  
       2016-12-29 13:01:33 +08:00
    近视眼表示打码并没有什么用
    warlue
        25
    warlue  
       2016-12-29 13:07:13 +08:00
    每次都是评论最诱人
    cnbeining
        26
    cnbeining  
       2016-12-29 13:11:29 +08:00   ❤️ 1
    在七牛上干大人站?

    思路惊奇啊少年 自己打车上央视找新闻联播栏目组认罪 录完直接打车上看守所给自己关进去得了给赵老爷省心。
    wxl1380610
        27
    wxl1380610  
       2016-12-29 14:36:41 +08:00
    广告吧
    shellcodecow
        28
    shellcodecow  
       2016-12-29 14:41:21 +08:00
    这是骗充值的网站...资源也不是最新的.. 一般这种会生成很多个进行推广,基本所有东西都在前端
    yghack
        29
    yghack  
       2016-12-29 14:44:49 +08:00
    @jsq2627 老哥,稳!
    pigsinthesky
        30
    pigsinthesky  
       2016-12-29 15:00:26 +08:00
    star 稳步上升中
    leyle
        31
    leyle  
       2016-12-29 15:32:22 +08:00
    之前对这类网站好奇,随手搜了个,

    [中艺蓝金科技(北京)有限公司以看片为名诱导客户支付宝充值,涉嫌欺诈! -- 聚投诉]
    http://ts.21cn.com/tousu/show/id/92544

    居然还可以投诉,然后我又在反馈里面找到对应的网站,专门做了个退钱的页面。。。

    这个行业估计暴利,很多人忍气吞声了。
    iamzhuyi
        32
    iamzhuyi  
       2016-12-29 16:17:27 +08:00
    @jsq2627 老司机求开车
    Baymaxbowen
        33
    Baymaxbowen  
       2016-12-29 16:30:45 +08:00
    厉害了
    hinate
        34
    hinate  
       2016-12-29 16:36:46 +08:00
    @jsq2627 老司机发车吗
    AlisaDestiny
        35
    AlisaDestiny  
       2016-12-29 16:38:30 +08:00 via Android
    事实说明了混淆 JS 代码的重要性。
    Xrong
        36
    Xrong  
       2016-12-29 16:39:27 +08:00
    厉害了, word 哥。。。
    xspoco
        37
    xspoco  
       2016-12-29 20:08:27 +08:00
    Kiuber
        38
    Kiuber  
       2016-12-29 21:00:44 +08:00
    @jsq2627 老司机带带我~
    shenhongbang
        39
    shenhongbang  
       2016-12-29 21:37:55 +08:00
    我直接输入楼主解出来的链接为啥不行啊🤣
    techmoe
        40
    techmoe  
       2016-12-29 22:08:50 +08:00 via Android
    网址就这样暴露了グッ!(๑•̀ㅂ•́)و✧
    TheCure
        41
    TheCure  
       2016-12-29 22:32:35 +08:00   ❤️ 1
    zingl
        42
    zingl  
       2016-12-30 00:20:43 +08:00
    会这个的本来也不可能付费看这种网站
    所以对人家根本没毛影响
    taojing10
        43
    taojing10  
       2016-12-30 00:48:52 +08:00
    厉害厉害!
    neilp
        44
    neilp  
       2016-12-30 01:29:03 +08:00 via iPhone
    把你这前端的手艺用在正途,能挣不少钱,回来把这网站会员买了根本不叫事好吗。 能节约多少时间啊
    setonfocus
        45
    setonfocus  
       2016-12-30 08:54:20 +08:00
    @AlisaDestiny 就算混淆加密,也是照样能解的。所以,不应该在前端验证这种信息
    dearmymy
        46
    dearmymy  
       2016-12-30 09:01:15 +08:00 via iPhone
    @Arrowing js 混淆就是麻烦点而已
    setonfocus
        47
    setonfocus  
       2016-12-30 09:06:53 +08:00
    看到了 CKplayer
    wsscats
        48
    wsscats  
    OP
       2016-12-30 15:04:44 +08:00
    monolight
        49
    monolight  
       2016-12-31 21:23:19 +08:00
    敢用 cn 域名来玩也是牛逼
    mingyun
        50
    mingyun  
       2017-01-01 20:01:20 +08:00
    wsscats
        51
    wsscats  
    OP
       2017-01-13 10:22:23 +08:00
    @shenhongbang 有些几个链接失效,还有些可以
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3797 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:19 · PVG 18:19 · LAX 03:19 · JFK 06:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.