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

时间:2021-11-02 04:34:36

网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理
(转)我如何利用前端技术得到 XXOO 网站的 VIP
首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔几秒钟弹出第几几几个会员充值成功,我们先把这个删掉
(转)我如何利用前端技术得到 XXOO 网站的 VIP
好了,我们继续研究这个网站内部结构了
正常情况每个页面的视频都是试看几十秒就会提醒你充值,当然这是这类网站的常规套路,我们在浏览器的Network观察加载的js,我们可以看到里面这段代码
(转)我如何利用前端技术得到 XXOO 网站的 VIP
这是一份叫做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值,有两个关键的值出现了,分别是lsj和lsjyy
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被成功改写
(转)我如何利用前端技术得到 XXOO 网站的 VIP
(转)我如何利用前端技术得到 XXOO 网站的 VIP
在这里我设置lsjyy为vip2,当然我在后面测试的时候发现这两个值貌似没什么区别
(转)我如何利用前端技术得到 XXOO 网站的 VIP

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

var play_rand = 1

(转)我如何利用前端技术得到 XXOO 网站的 VIP
我们把id为play-html节点的元素样式设置diplay为显示,我们就可以看到正常的播放器出来了
(转)我如何利用前端技术得到 XXOO 网站的 VIP
分析源码得知,它大概的工作原理就是根据url的参数,比如play_name和play_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_oumei和play_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.js的getMp4Url函数执行一次

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

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

(转)我如何利用前端技术得到 XXOO 网站的 VIP
至此,就可以看懂这种网站的工作原理了,所以遇到小心上当了

【本文由“游戏撕裂者”发布,2017年1月21日】

(转)我如何利用前端技术得到 XXOO 网站的 VIP的更多相关文章

  1. D2 前端技术论坛总结(上)

    得幸获得D2前端技术论坛门票一张,今天就去了,公司还给批假了(有可能不会算做请假,哈哈). 早上8点50出门,骑个小毛驴,大概9点30分左右,到了阿里巴巴西溪园区,很多人,进去的门口有专人接待,看D2 ...

  2. 最受欢迎web前端技术总结

    Web前端技术发展非常快,主流技术的进步.想想刚毕业那会用asp技术.目前,该网站已经非常少见主流应用. 后来的后来J2EE框架.然后SpringMVC声望,然而,最近的各种js框架广泛传播,Html ...

  3. 前端技术之&lowbar;CSS详解第二天

    前端技术之_CSS详解第二天 1.css基础选择器 html负责结构,css负责样式,js负责行为. css写在head标签里面,容器style标签. 先写选择器,然后写大括号,大括号里面是样式. & ...

  4. 前端技术之&lowbar;CSS详解第五天

    前端技术之_CSS详解第五天 一.行高和字号 1.1 行高 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. <!DOCTYPE html ...

  5. &lbrack;转&rsqb; React风格的企业前端技术

    亲爱的各位朋友们,大家下午好! 首先祝大家国庆节快乐! 很高兴可以在国庆前夕,可以为大家分享一下React风格的企业前端技术. 谈到前端,可能以前大家的第一感觉就是,前端嘛,无非就是做做页面切图,顶多 ...

  6. 现代前端技术解析:Web前端技术基础

    ​ 最近几年,越来越多的人投入到前端大军中:时至至今,前端工程师的数量仍然不能满足企业的发展需求:与此同时,互联网应用场景的复杂化提高了对前端工程师能力的要求,一部分初期前端工程师并不能胜任企业的工作 ...

  7. 前端技术Jquery与Ajax使用总结

    前端技术Jquery与Ajax使用总结 虽然主要是做的后端,但是由于有些时候也要写写前台的界面,因此也就学习了下Jquery和Ajax的一些知识,虽说此次写的这些对于前端大神来说有些班门弄斧的感觉,但 ...

  8. 当下较热web前端技术汇总

    Web前段技术发展很快,主流技术日新月异,想想自己刚毕业那会用的asp技术,现在已经很少有主流网站在使用了.再到后来的J2EE框架,然后SpringMVC大行其道,但是最近各种js框架被广为传播,Ht ...

  9. 2019年一半已过,这些大前端技术你都GET了吗?- 下篇

    在上一篇文章中已经介绍了大前端关于状态管理.UI组件.小程序.跨平台和框架层的内容.在本文中,我会继续介绍编程语言.工程化.监控.测试和服务端,同时也会对下半年大前端可以关注的部分进行展望. 结合个人 ...

随机推荐

  1. Android Tab -- 使用ViewPager、PagerTitleStrip&sol;PagerTabStrip来实现

    原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换:点击标签切换. 代码:https://github.com/l ...

  2. Js文字特效—文字段逐个变色循环

    自己用来练习的,附上详细注释,如果有和我一样喜欢并想要学习Dom特效创作的朋友,推荐先系统了解Javascript中Html Dom Object部分的内容,包括常用方法及属性. <!DOCTY ...

  3. 视频最后用使用了function&lpar;i&comma;ot&rpar;一笔带过,但我看不懂i和ot这2个参数的具体值是怎么获取得到的,能不能说一下参数传递过程?

    使用函数设置文本内容: $(selector).text(function(index,currentcontent)) 参数描述content必需.规定被选元素的新文本内容.注意:  特殊字符会被编 ...

  4. air写文件 SecurityError&colon; fileWriteResource 时报错的解决方法

    用 File.applicationDerectoryPath.resolv("text.txt")会报SecuriyError错误! 解决: var _Path:File = F ...

  5. flask开发restful api

    flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...

  6. 公司需求知识自学-Oracle的Package的作用及用法

    Oracle的Package的作用 简化应用设计.提高应用性能.实现信息隐藏.子程序重载. 1.Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)? 你不觉得把存储过 ...

  7. Entity Framework 学习中级篇4—存储过程&lpar;下&rpar;

    在EF中,各个实体的插入.更新和删除也都通过使用存储过程来完成,以便提高点性能.这个类似于数据集.其步骤是:先定义存储过程,然后在VS的可视化设计器,设置存储过程映射即可. 下面,以为Supplier ...

  8. 自定义Git之忽略特殊文件

    有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定 ...

  9. zabbix自定义key监控mysql主从同步超简单!

    原理:利用在slave上运行show slave status获取Slave_IO_Running和Slave_SQL_Running的值 1.在zabbix客户端配置文件中加入: 首先要对mysql ...

  10. C语言描述队列的实现及操作(链表实现)

    // 队列的单链表实现 // 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方 // 首节点:头节点后第一个节点,存放数据 #include<stdio.h> #incl ...