网页抓取解密(分析一系列的VIP解析网站(一)(1)_光明网(图))
优采云 发布时间: 2022-01-07 21:10网页抓取解密(分析一系列的VIP解析网站(一)(1)_光明网(图))
前端加解密-VIP解析初探网站院长系列文章二维码阅读
2020-07-20 23:01
还记得几年前刚进入前端互联网行业的时候,随便点了一个网站,基本都装了jQuery,而且代码没有加密,随便看看,就是漏洞多多,漏洞百出,近些年,越来越多的网民开始关注网络安全,不仅是服务器端,客户端也开始研究各种压缩、混淆压缩、各种加密。简而言之,他们正在尽一切可能让那些拿起代码的人看到。看不懂网站的代码,是为了尽可能避免安全问题,或者防止别人从网站中提取自己的资源。当然,归根结底,前端没有安全性。我们所做的一切只是为了提高门槛。而已。从本文开始,我们将分析一系列网站案例,看看那些提高门槛的方法的前端应用。
这里我们将分析一系列VIP分析网站,看看他们站点中的前端加解密应用。为什么选择这种网站?仔细分析会发现,他们的网站充斥着各种增加代码或资源门槛的方法,值得分析。下面我们就从他们的分析技巧一一开始简单的了解一下。
作为本系列的开头文章,我们将分析一个稍微简单的目标站点:我们只需要在url参数中添加vip视频播放的链接,就可以解析出完整版的播放链接,这种网站一般基本支持市面上所有主流视频网站,比如爱奇艺、优酷等。网站的实际解析不是这样的,可能嵌套n层iframe .
以下说明将在Chrome浏览器中进行。如果你没有,你可以下载一个。Chrome真的很容易使用,但它会吃内存。
首先我们打开站点,传入vip视频播放链接,:///v_2ffkwswd6oo.html?vfrm=pcw_home&vfrmblk=L&vfrmrst=712211_dianyingbangbang_title1
打开一会,我们要得到一个网站的视频,清晰度还不错。当然,这不是重点。我们的重点是写一个爬虫,可以解析任何vip视频的真实播放链接。
接下来我们先打开开发者工具,打开开发者工具有两种方式,一种是直接按快捷键F12或者Ctrl+Shift+I,但是这个方法可能会被屏蔽,我们也可以按照下面的截图打开开发者工具如图
打开开发者工具,你会发现断点命中,页面现在无法操作。这是对网站的反调试分析,也是该类型网站的标准配置。通过这个很简单,我们只需要禁止断点的执行,然后继续执行,就不会再有断点了。
记得按照图中的顺序,然后我们切换到network选项卡,然后刷新页面,我们会看到很多请求,
为了缩小范围,我们进一步选择了网络下的xhr选项卡,发现只剩下几个请求了。
而m3u8请求之一就是我们需要获取的视频播放源地址,然后就可以找到api.php接口,通过这个接口获取视频播放源。
我们看到接口在post中发送了7个参数:
url: https://www.iqiyi.com/v_2ffkwswd6oo.html?vfrm=pcw_home
referer: aHR0cHM6Ly93d3cuYWRtaW5pc3RyYXRvcnYuY29tL2lxaXlpL2luZGV4LnBocD91cmw9aHR0cHM6Ly93d3cuaXFpeWkuY29tL3ZfMmZma3dzd2Q2b28uaHRtbD92ZnJtPXBjd19ob21lJnZmcm1ibGs9TCZ2ZnJtcnN0PTcxMjIxMV9kaWFueWluZ2JhbmdiYW5nX3RpdGxlMQ==
ref: 0
time: 1595251830
type:
other: aHR0cHM6Ly93d3cuaXFpeWkuY29tL3ZfMmZma3dzd2Q2b28uaHRtbD92ZnJtPXBjd19ob21lJnZmcm1ibGs9TCZ2ZnJtcnN0PTcxMjIxMV9kaWFueWluZ2JhbmdiYW5nX3RpdGxlMQ==
ios:
除了引用和其他字段,它们都很好理解。它们是纯文本格式。其实我们应该知道这是对refer等字段一目了然的base64编码,解密后的refer是: ///v_2ffkwswd6oo.html?vfrm=pcw_home&vfrmblk= L&vfrmrst=712211_dianyingbangbang_title1就是我们当前访问的地址。其他解密后就是要解析的VIP视频地址。但是,还有一个问题需要验证。时间字段是请求发起的时间还是服务器为学校发出的时间来验证请求的合法性,通过跟踪请求发起的代码,我们确认该字段是由服务器发起的进行验证。跟踪代码的方法如下:
我们只需要将鼠标移动到当前请求的发起者选项,就可以看到发起请求的js栈。我们排除了来自诸如 jquery 之类的库的调用以找到真正的来源。这里是较长的一段,然后点进去,发现代码是压缩的,我们可以通过浏览器的扩展功能来美化代码:
通过这段代码,我们可以发现客户端无法伪造时间字段。需要得到这个值才能正常调用接口。有两种选择:
一、所有请求参数都是从页面中提取的
二、 只提取时间字段,其余字段由客户端生成
这里我们选择第二种方式,我们用node来演示,先获取服务器发送的时间字段。
function getTime(u) {
return new Promise((resolve, reject) => {
request({
url: `https://www.administratorm.com/index.php?url=${u}`,
headers: {
Referer: `https://www.administratorm.com/index.php?url=${u}`
}
}, (err, response, body) => {
if (err) {
return reject(err);
}
const reg = /\'time\'\s*\:\s*\'(\d+)\'/;
if (reg.test(body)) {
return resolve(RegExp.$1);
}
reject();
});
});
}
获取到时间字段后,我们就可以正常发起请求了。我们先实现获取视频源的方法。
function getVideoSource(u, time) {
return new Promise((resolve, reject) => {
const formData = {
url: u,
referer: Buffer.from(`https://www.administratorw.com/index.php?url=${u}`).toString('base64'),
ref: 0,
time,
type: '',
other: Buffer.from(u).toString('base64'),
ios: ''
};
request({
url: PARSE_API,
method: 'POST',
headers: {
Referer: `https://www.administratorm.com/index.php?url=${u}`
},
formData
}, (err, response, body) => {
if (err) {
return reject(err);
}
try {
const ret = JSON.parse(body);
if (ret.url) {
return resolve(ret.url);
}
reject();
} catch(e) {
reject(e);
}
});
});
}
然后发起请求,
getTime(url)
.then(time => {
getVideoSource(url, time)
.then(url => {
console.log('视频解析成功,播放源地址:%s', url)
});
})
.catch(err => {
console.log('视频解析失败!');
});
文末小贴士:
1、在浏览器中,我们可以使用atob方法解密base64字符串,使用btoa方法获取解密后的base64字符串。
2、 如果参数正确但伪造请求时请求失败,可以尝试更改headers中的字段,例如添加Referer、userAgent、X-Requested-With。
3、 如果接口服务器对IP有限制,有一定几率可以通过伪造X-Forwarded-For来绕过这个限制。
文末提供了本文的示例代码,请自行下载。
报酬