JS逆向实战4--cookie——__jsl_clearance_s 生成
分析
网站返回状态码521,从浏览器抓包来看,浏览器一共对此地址请求了三次(中间是设置cookie的过程):
第一次请求:网站返回的响应状态码为 521,响应返回的为经过  混淆的 JS 代码;但是这些都不重要,他会有一个set-cookie,我们取出cookie,这个cookie是jsluid_s (可能会改名)
第二次请求:把这个cookie加入请求中,然后会获得一段混淆的代码,我们通过反混淆的网站,然后得到以下代码

我们多次获得这个代码 可见这个ha就是加密方式
会发现不止一种加密,每次混淆对应的大概是三次加密方式
分别是
sha256,sha1,还有md5
改写的JS
所以我们扣除代码,分别改下js代码
由于三种代码太多了,下面只放一种代码
sha256
function hash(_0x2d4d71) {
  var _0x4fa55c = 8;
  var _0x47edc1 = 0;
  function _0x2c9622(_0x29359d, _0x4ae66f) {
    var _0xb605c0 = (_0x29359d & 65535) + (_0x4ae66f & 65535);
    var _0x27744e = (_0x29359d >> 16) + (_0x4ae66f >> 16) + (_0xb605c0 >> 16);
    return _0x27744e << 16 | _0xb605c0 & 65535;
  }
  function _0x19c666(_0xf7e020, _0x235055) {
    return _0xf7e020 >>> _0x235055 | _0xf7e020 << 32 - _0x235055;
  }
  function _0x436381(_0xd2ec5, _0x5c392d) {
    return _0xd2ec5 >>> _0x5c392d;
  }
  function _0x3f7e6a(_0x3df6f9, _0xb07891, _0x43446d) {
    return _0x3df6f9 & _0xb07891 ^ ~_0x3df6f9 & _0x43446d;
  }
  function _0x20e775(_0x51df81, _0xeeb3b4, _0x2ebd5f) {
    return _0x51df81 & _0xeeb3b4 ^ _0x51df81 & _0x2ebd5f ^ _0xeeb3b4 & _0x2ebd5f;
  }
  function _0x5450df(_0x155ce6) {
    return _0x19c666(_0x155ce6, 2) ^ _0x19c666(_0x155ce6, 13) ^ _0x19c666(_0x155ce6, 22);
  }
  function _0x2d51c9(_0xc877f4) {
    return _0x19c666(_0xc877f4, 6) ^ _0x19c666(_0xc877f4, 11) ^ _0x19c666(_0xc877f4, 25);
  }
  function _0x515e90(_0x16cf8f) {
    return _0x19c666(_0x16cf8f, 7) ^ _0x19c666(_0x16cf8f, 18) ^ _0x436381(_0x16cf8f, 3);
  }
  function _0x57905d(_0x9b4d6e) {
    return _0x19c666(_0x9b4d6e, 17) ^ _0x19c666(_0x9b4d6e, 19) ^ _0x436381(_0x9b4d6e, 10);
  }
  function _0x7dfc8(_0x10a4b0, _0x43831c) {
    var _0x1d2989 = new Array(1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298);
    var _0x5cb44b = new Array(1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225);
    var _0x5a20f0 = new Array(64);
    var _0x218e05, _0xe3c1e2, _0x107c4d, _0xf15343, _0x4e8165, _0x3d523b, _0x5552b2, _0x55b2d5, _0x8b0131, _0x4adfc9;
    var _0x92e82e, _0x281f56;
    _0x10a4b0[_0x43831c >> 5] |= 128 << 24 - _0x43831c % 32;
    _0x10a4b0[(_0x43831c + 64 >> 9 << 4) + 15] = _0x43831c;
    for (var _0x8b0131 = 0; _0x8b0131 < _0x10a4b0["length"]; _0x8b0131 += 16) {
      _0x218e05 = _0x5cb44b[0];
      _0xe3c1e2 = _0x5cb44b[1];
      _0x107c4d = _0x5cb44b[2];
      _0xf15343 = _0x5cb44b[3];
      _0x4e8165 = _0x5cb44b[4];
      _0x3d523b = _0x5cb44b[5];
      _0x5552b2 = _0x5cb44b[6];
      _0x55b2d5 = _0x5cb44b[7];
      for (var _0x4adfc9 = 0; _0x4adfc9 < 64; _0x4adfc9++) {
        if (_0x4adfc9 < 16) {
          _0x5a20f0[_0x4adfc9] = _0x10a4b0[_0x4adfc9 + _0x8b0131];
        } else {
          _0x5a20f0[_0x4adfc9] = _0x2c9622(_0x2c9622(_0x2c9622(_0x57905d(_0x5a20f0[_0x4adfc9 - 2]), _0x5a20f0[_0x4adfc9 - 7]), _0x515e90(_0x5a20f0[_0x4adfc9 - 15])), _0x5a20f0[_0x4adfc9 - 16]);
        }
        _0x92e82e = _0x2c9622(_0x2c9622(_0x2c9622(_0x2c9622(_0x55b2d5, _0x2d51c9(_0x4e8165)), _0x3f7e6a(_0x4e8165, _0x3d523b, _0x5552b2)), _0x1d2989[_0x4adfc9]), _0x5a20f0[_0x4adfc9]);
        _0x281f56 = _0x2c9622(_0x5450df(_0x218e05), _0x20e775(_0x218e05, _0xe3c1e2, _0x107c4d));
        _0x55b2d5 = _0x5552b2;
        _0x5552b2 = _0x3d523b;
        _0x3d523b = _0x4e8165;
        _0x4e8165 = _0x2c9622(_0xf15343, _0x92e82e);
        _0xf15343 = _0x107c4d;
        _0x107c4d = _0xe3c1e2;
        _0xe3c1e2 = _0x218e05;
        _0x218e05 = _0x2c9622(_0x92e82e, _0x281f56);
      }
      _0x5cb44b[0] = _0x2c9622(_0x218e05, _0x5cb44b[0]);
      _0x5cb44b[1] = _0x2c9622(_0xe3c1e2, _0x5cb44b[1]);
      _0x5cb44b[2] = _0x2c9622(_0x107c4d, _0x5cb44b[2]);
      _0x5cb44b[3] = _0x2c9622(_0xf15343, _0x5cb44b[3]);
      _0x5cb44b[4] = _0x2c9622(_0x4e8165, _0x5cb44b[4]);
      _0x5cb44b[5] = _0x2c9622(_0x3d523b, _0x5cb44b[5]);
      _0x5cb44b[6] = _0x2c9622(_0x5552b2, _0x5cb44b[6]);
      _0x5cb44b[7] = _0x2c9622(_0x55b2d5, _0x5cb44b[7]);
    }
    return _0x5cb44b;
  }
  function _0x180a16(_0xf1fd6e) {
    var _0xb0db85 = Array();
    var _0x25f9c5 = 255;
    for (var _0x2f8e7d = 0; _0x2f8e7d < _0xf1fd6e["length"] * _0x4fa55c; _0x2f8e7d += _0x4fa55c) {
      _0xb0db85[_0x2f8e7d >> 5] |= (_0xf1fd6e["charCodeAt"](_0x2f8e7d / _0x4fa55c) & _0x25f9c5) << 24 - _0x2f8e7d % 32;
    }
    return _0xb0db85;
  }
  function _0x46ee98(_0x58c977) {
    var _0x85a9a = new RegExp("\n", "g");
    _0x58c977 = _0x58c977["replace"](_0x85a9a, "\n");
    var _0x4bca3a = "";
    for (var _0x1e7342 = 0; _0x1e7342 < _0x58c977["length"]; _0x1e7342++) {
      var _0x5c7a8b = _0x58c977["charCodeAt"](_0x1e7342);
      if (_0x5c7a8b < 128) {
        _0x4bca3a += String["fromCharCode"](_0x5c7a8b);
      } else {
        if (_0x5c7a8b > 127 && _0x5c7a8b < 2048) {
          _0x4bca3a += String["fromCharCode"](_0x5c7a8b >> 6 | 192);
          _0x4bca3a += String["fromCharCode"](_0x5c7a8b & 63 | 128);
        } else {
          _0x4bca3a += String["fromCharCode"](_0x5c7a8b >> 12 | 224);
          _0x4bca3a += String["fromCharCode"](_0x5c7a8b >> 6 & 63 | 128);
          _0x4bca3a += String["fromCharCode"](_0x5c7a8b & 63 | 128);
        }
      }
    }
    return _0x4bca3a;
  }
  function _0x5fb598(_0x580622) {
    var _0x11d2a4 = "0123456789abcdef";
    var _0x180550 = "";
    for (var _0x11bebf = 0; _0x11bebf < _0x580622["length"] * 4; _0x11bebf++) {
      _0x180550 += _0x11d2a4["charAt"](_0x580622[_0x11bebf >> 2] >> (3 - _0x11bebf % 4) * 8 + 4 & 15) + _0x11d2a4["charAt"](_0x580622[_0x11bebf >> 2] >> (3 - _0x11bebf % 4) * 8 & 15);
    }
    return _0x180550;
  }
  _0x2d4d71 = _0x46ee98(_0x2d4d71);
  return _0x5fb598(_0x7dfc8(_0x180a16(_0x2d4d71), _0x2d4d71["length"] * _0x4fa55c));
}
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;
        }
      }
    }
}
python代码
import re
import execjs
import requests
import json
from requests.utils import add_dict_to_cookiejar
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 关闭ssl验证提示
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
class JsClearance:
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0',
    }
    url = 'https://www.zbytb.com/search/?kw=%E7%9F%BF&okw=&catid=0&zizhi=&field=0&moduleid=26&areaids=&page=2'
    # 使用session保持会话
    session = requests.session()
    def get_parameter(self, response):
        # 提取js代码
        js_clearance = re.findall('cookie=(.*?);location', response.text)[0]
        # 执行后获得cookie参数js_clearance
        result = execjs.eval(js_clearance).split(';')[0].split('=')[1]
        # 添加cookie
        add_dict_to_cookiejar(self.session.cookies, {'__jsl_clearance_s': result})
        # 第二次请求
        response = self.session.get(self.url, headers=self.header, verify=False)
        # 提取参数并转字典
        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'
        return parameter, js_file
    def get_cookie(self, param, file):
        with open(file, 'r') as f:
            js = f.read()
        cmp = execjs.compile(js)
        # 执行js代码传入参数
        clearance = cmp.call('go', param)
        return clearance
    def main(self):
        # 第一次请求
        response = self.session.get(self.url, headers=self.header, verify=False)
        # 获取参数及加密方式
        parameter, js_file = self.get_parameter(response)
        # 获取cookie
        clearance = self.get_cookie(parameter, js_file)
        # 修改cookie
        add_dict_to_cookiejar(self.session.cookies, {'__jsl_clearance_s': clearance})
        # 第三次请求
        response1 = self.session.get(self.url, headers=self.header, verify=False)
        print(response1.text)
if __name__ == '__main__':
    JsClearance().main()
												
											JS逆向实战4--cookie——__jsl_clearance_s 生成的更多相关文章
- JS逆向实战7-- 某省在线审批网站params 随机生成
		
参数分析 我们首先通过抓包 发现这个就是我们所需要的数据 然后我们通过fidder 发起请求 结果: 通过我们反复测试 发现这个params的参数是每次请求中都会变化的 断点查找 我们通过 这个t参数 ...
 - JS逆向实战5--JWT TOKEN x_sign参数
		
什么是JWT JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式).它是在Web环境下 ...
 - JS逆向实战3——AESCBC 模式解密
		
爬取某省公共资源交易中心 通过抓包数据可知 这个data是我们所需要的数据,但是已经通过加密隐藏起来了 分析 首先这是个json文件,我们可以用请求参数一个一个搜 但是由于我们已经知道了这是个json ...
 - JS逆向实战2--cookie-AcwScV2加密—某招标信息网
		
cookies的获取 首先拿到第一次访问原链接 拿到acw_tc的值,然后放到session中去 再用这个session再次访问原链接拿到js加载的加密的真实数据.用了一些反混淆. 最后获取这个数据中 ...
 - JS逆向实战8——某网实战(基于golang-colly)
		
其实本章算不上逆向教程 只是介绍golang的colly框架而已 列表页分析 根据关键字搜索 通过抓包分析可知 下一页所请求的参数如下 上图标红的代表所需参数 所以其实我们真正需要的也就是Search ...
 - JS逆向实战6-- x轴 y轴 过点触验证码
		
点触验证码是一种常见的反爬手段 解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间的对应关系. 这 ...
 - JS逆向实战1——某省阳光采购服务平台
		
分析 其实这个网站基本没有用到过什么逆向,就是简单的图片base64加密 然后把连接变成2进制存成文件 然后用ocr去识别即可 !! 注意 在获取图片连接 和对列表页发起请求时一定要用一个请求,也就是 ...
 - 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
		
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
 - 我去!爬虫遇到JS逆向AES加密反爬,哭了
		
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
 
随机推荐
- 【Go实战基础】GO语言是什么,有哪些优势
			
一.简介 2007年,为了提高在多核.网络机器(networked machines).大型代码库(codebases)的业务场景下的开发效率,Google 首席软件工程师决定创造一种语言那就是 Go ...
 - HCIA-datacom 4.2 实验二:本地AAA配置实验
			
关于本实验 AAA是Authentication(认证).Authorization(授权)和Accounting(计费)的简称,是网络安全的一种管理机制,提供了认证.授权.计费三种安全功能.这三种安 ...
 - python九周周末总结
			
python九周周末总结 UDP协议 udp协议的交互模式服务端不需要考虑客户端是否退出,你发多少那么他就会按照你发的东西直接去传输给客户端不存在黏包现象 服务端: import socket ser ...
 - Java使用定时任务详解
			
定时任务 目录 定时任务 SpringBoot定时任务 默认单线程 使用异步多线程 Spring定时任务XML配置(注解形式几乎同上) 使用springTask: ----springTask为spr ...
 - 第十二章 Kubernetes的服务暴露插件--traefik
			
1.前言 之前部署的coredns实现了k8s的服务在集群内可以被自动发现,那么如何使得服务在k8s集群外被使用和访问呢? 使用nodeport星的Service:此方法只能使用iptables模型, ...
 - java基础学习:java中的反射
			
一.什么是java反射 什么是 java 的反射? 说到反射,写这篇文章时,我突然想到了人的"反省",反省是什么?吾一日三省吾身,一般就是反思自身,今天做了哪些对或错的事情. ja ...
 - Fast.Framework ORM 于中秋节后 正式开源
			
Fast Framework 作者 Mr-zhong 开源项目地址 https://github.com/China-Mr-zhong/Fast.Framework QQ交流群 954866406 欢 ...
 - MySQL到底有没有解决幻读问题?这篇文章彻底给你解答
			
MySQL InnoDB引擎在Repeatable Read(可重复读)隔离级别下,到底有没有解决幻读的问题? 网上众说纷纭,有的说解决了,有的说没解决,甚至有些大v的意见都无法达成统一. 今天就深入 ...
 - typora收费了,最后一个免费版提供下载
			
typora收费了,在这里,博主提供最后一个免费版下载,地址如下,顺便把typora导入和导出word时需要的工具也一同提供.最看不惯免费用着别人的软件,还搞引流的垃圾网站和公众号.地址如下 http ...
 - 监控Redis集群,有两种方法
			
前提条件 redis集群:已搭建三主三从(三台主机) prometheus.grafana已安装 三台主机ip: 192.168.0.39,192.168.0.164,192.168.0.68 第一种 ...