作者:手机用户2502918505 | 来源:互联网 | 2023-09-16 13:59
逛论坛发现一个求助帖,想获取数据但网站有COOKIE反爬,闲来无事就分析了一下COOKIE参数生成方法~
2021-01-04更新:如果此篇看不懂,可直接看第二篇,只要是网站使用的是同一家公司的服务,这个参数获取方式都是一样的。
目标:生成COOKIE中的__jsl_clearance_s参数
工具:chrome/firefox浏览器、fiddler、pychram、python3.7、解混淆专解测试版V0.1
模块:requests、re、execjs、json
分析:
首先打开浏览器,和fiddler抓包工具,发现浏览器进行了三次请求,前两次响应的状态码为521,响应内容都是一段js代码,第三次请求响应得到正常内容,并且携带了两个COOKIE参数;
通过三次请求对比,发现第三次请求COOKIE中的__jsl_clearance_s参数和第二次请求中的并不一样;
先看看第一次响应的结果,为一段js,这段js代码为浏览器设置了一个COOKIE;
这里直接利用正则将这段代码提取出来,再利用execjs模块执行,即可得到这个COOKIE:
js_clearance = re.findall('COOKIE=(.*?);location', response.text)[0]
result = execjs.eval(js_clearance).split(';')[0]
通过观察第二个请求,第二个请求再次得到一段js代码,并且携带了两个COOKIE参数,一个__jsluid_s、一个__jsl_clearance_s,而__jsl_clearance_s就是刚刚利用js生成的,__jsluid_s是第一次请求后为浏览器设置的;
继续分析得知第二次请求需要携带这两个COOKIE参数才能得到第二段js代码。这段js代码是混淆过的,利用解混淆专解测试版V0.1进行解混淆,得到正确的js代码;
简单解读COOKIE生成方法就是调用go方法并传入一个对象,最后该方法为浏览器设置一个COOKIE。那么思路就简单了,直接将js代码保存为本地文件,利用execjs模块执行代码调用go方法并传入需要的参数就能得到COOKIE;因为变量名都是混淆的,为了方便解读,修改一下js代码中的go函数:
function go(data) {
var chars = data["chars"]["length"];
for (var i = 0; i < chars; i++) {
for (var j = 0; j < chars; j++) {
var COOKIE = data["bts"][0] + data["chars"]["substr"](i, 1) + data["chars"]["substr"](j, 1) + data["bts"][1];
if (hash(COOKIE) == data["ct"]) {
return COOKIE;
}
}
}
}
修改前go函数是主要作用是通过组合一段字符串加密后进行对比,得到正确COOKIE然后设置到浏览器,修改后是直接return返回正确COOKIE);
js代码修改完成后保存到本地,js测试后发现有时会报错,多次抓包发现有三种加密方式,分别为md5、sha1、sha256,传入对象的参数ha的值不同,加密方式不同。那么思路有了,按上面的方法分别保存三套js加密代码,通过参数中的ha值判断使用哪一种加密,执行即可正确得到COOKIE;
parameter = json.loads(re.findall(r';go((.*?))', response.text)[0])
js_file = ''
if parameter['ha'] == 'sha1':
js_file = 'sha1.js'
elif parameter['ha'] == 'sha256':
js_file = 'sha256.js'
elif parameter['ha'] == 'md5':
js_file = 'md5.js'
整个请求过程利用session保持会话,最后得到的COOKIE添加进去进行第三次请求,即可得到正确响应内容。
总结:这个__jsl_clearance_s获取比较简单,懂一点js即可搞定,如果不懂也没关系,代码拿去。另外更新了一篇纯python实现获取,原理其实都是一样,可以看看。
本篇源代码:前往github