某行动态cookie反爬虫分析

某行动态cookie反爬虫分析


1. 预览

  • 反爬网址(base64): aHR0cDovL3d3dy5wYmMuZ292LmNu

  • 反爬截图:

    • 需要先加载运行js代码,可能是对环境进行检测,反调试之类的

    image-20230730194904202

    • 无限debugger

      image-20230730200545134

  • 处理办法
    • 网上大部分人说的都是添加cookie来解决。
      • 那个noscript标签仅仅是用于提示用户的,在不支持js的浏览器展示。
      • 本网站是动态ck,每一次的cookie都是上一次成功请求所返回的,但是python模拟请求时,第一次请求就是上图所示的页面,于是第一次成功的请求就是解决该问题的关键,
        • 1.你可以使用上一次浏览器成功请求返回的ck添加到python里发起请求,当然这比较笨拙,哈哈
        • 2.使用python完成第一次成功的请求
    • 当然,我们选择使用方法2来实现呀,优雅一点嘛

2.调试

  • 无限debugger怎么去掉?
    • 右键,不在这里暂停,是可以,但有时得小心,不暂停了出现无限循环带来的卡顿
    • 这里就简单的使用不在这暂停

3.扣代码环节

  • 1.扣逻辑,扣需要的代码

    image-20230730202532291从上图可以看出,第一次请求执行上面返回的js代码和session_id, wzws_cidjs代码里有逻辑写了,发起第二个验证请求,验证成功的话,返回302状态码,返回新的wzws_cid,然后带着正确的wzws_cidsessionid等参数进行跳转主页,才能成功请求。

    • 我们看一下,第一次返回的js代码:

    image-20230730203359023

    • 这些个在浏览器调试就会发现都是字符串加密之类的,而且整个代码进行了ob混淆,为了便于调试,使用反混淆工具,反混淆下:

    • image-20230730204008534

    • 格式前后的j:

      • `function u(k){function gR(v,A){return gE(A- -'0x92',v);}var P={'oQHKx':function(C,x,d){return A['cirRP'](C,x,d);},'LJXui':A[gD('93LV',-'0x127')],'JITOI':A['FJQMp'],'ktFbX':function(C,d){function gm(v,A){return Z(A- -'0x2ef',v);}return A[gm('0x40',-'0x3d')](C,d);},'nzZBi':A[gD('kdha',-'0xa7')]};function gD(v,A){return gY(A- -'0x5c',v);}function gO(v,A){return gE(v- -'0x3b6',A);}function gF(v,A){return ge(v,A-'0x48f');}if(A[gR('0x561','0x5b1')](A[gD('DT[N',-'0xab')],A[gF('M1Bv','0x635')])){var x=P['oQHKx'](P,C,x);P['oQHKx'](d,N,x);}else{if(A[gR('0x4d8','0x535')](typeof k,A[gR('0x4c5','0x540')]))return function(x){}['const'+gR('0x5d7','0x579')+'r'](A[gR('0x4e4','0x4d4')])[gR('0x539','0x4ee')](A[gF('Ux5v','0x657')]);else{if(A[gO('0x27e','0x218')](A[gF('UbQE','0x621')],A[gF('%4Ja','0x6ad')])){var d=C?function(){function gL(v,A){return gD(A,v-'0x69f');}if(d){var Y=J[gL('0x523','BpO(')](n,arguments);return z=null,Y;}}:function(){};return i=![],d;}else{if(A['OFxOf'](A[gF('Ms1O','0x5be')]('',A['yUkFe'](k,k))[A[gR('0x582','0x5bc')]],-0x1cbf+0x33*-0x8b+-0x1*-0x3871)||A[gR('0x590','0x509')](A[gD('xrrg',-'0xe2')](k,0x2189+-0x7*0x4dd+-0x4b*-0x2),0x42c*-0x8+-0x3*-0x66+0x202e))(function(){return!![];}[gR('0x5d4','0x5ba')+'ructo'+'r'](A['ChrtP'](A[gO('0x2c3','0x2af')],A[gR('0x556','0x51d')]))[gD('0sv]',-'0x6c')](A['bHBdS']));else{if(A[gR('0x585','0x500')](A[gR('0x4b1','0x50e')],A['zesRv'])){var N=A['RZobL'][gF('z6h!','0x6d4')]('|'),K=0x9a1+0x53*0x55+-0x2530;while(!![]){switch(N[K++]){case'0':var i=new K(J);continue;case'1':var J=n[gF('m7@A','0x62f')+'h'];continue;case'2':return z[gO('0x277','0x1e6')+'e'](i['buffe'+'r']);case'3':var n=A['MBcSp'](d,N);continue;case'4':for(var z=0x31f+-0x2e9+-0x36;A['HWTiM'](z,J);z++){i[z]=n['charC'+gF('xrrg','0x5b5')](z);}continue;case'5':if(!C)return x;continue;}break;}}else(function(){function gl(v,A){return gO(A-'0x1cf',v);}function gr(v,A){return gO(v-'0x3e8',A);}function gG(v,A){return gF(A,v- -'0x5bd');}function gT(v,A){return gD(v,A- -'0x80');}return P[gT('Ux5v',-'0x1e4')](P[gr('0x6b8','0x645')],P[gr('0x6b8','0x6ee')])?![]:function(K){}[gl('0x412','0x465')+gl('0x3ff','0x424')+'r'](P['LJXui'])['apply'](P[gG('0x12','*Ig5')]);}['const'+gR('0x51a','0x579')+'r'](A[gR('0x561','0x59a')](A[gR('0x67a','0x5e7')],A['HINSR']))[gO('0x1ca','0x14d')](A[gF('XuiA','0x5b1')]));}}}A[gO('0x1e8','0x238')](u,++k);}}`
        
        ``
      • 格式前后的j:

      • image-20230730212936815

    • 从上图中可以看出:

      • 1.进行了正则校验,V表达式,我就纳闷了,格不格式化的会返回true啊,有毒,应该用+来检测至少一个空格嘛,真是的。

      • image-20230730205538022

      • 第二个正则,p表达式,也是一样的,格式化前后我的都是++k,能能匹配到,这里他应该是想校验是否有++ k,那么也要用+号,我真服了,垃圾代码。

      • image-20230730205348294

      • 所以一定会进入else:

      • image-20230730213033609

      • 最终进入:

      • image-20230730213221828

      • ""+0/0='NaN',进入虚拟机中,执行debugger,然后继续u(++k),不断地自己调用自己,无限debugger;

      • 总结:可以看出,无论你是否格式化代码,我都会给你进入无限debugger,而debugger仅仅在打开F12时,才会起作用!也就是说和你格式化代码没有屁毛钱关系,只要打开F12就会无限debugger,大家也看出来了,两条分支,一条进入无限while循环,内存爆破,一条无限debugger,所以有意思的来了,如果你按照自己的先验主义,把下面的test校验 的感叹号删掉,你将收获内存被爆破,哈哈,有点道高一筹魔高一丈的感觉了

      • image-20230730214629041

  • 分析完了正则校验和debugger,我们书归正传,看看第二个请求里面的加密参数怎么来的,这里最简单的办法就是,直接使用它的js文件即可,没必要自己去扣了,毕竟解混淆之后的代码实在是太清晰了,如下图所示,生成了所需要的地址。

  • image-20230730214942380

  • 对该地址发起请求后,校验成功后,拿着返回的wzws_cidsessionid即可正确进行数据获取了

3.验证

image-20230730215644619

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/52284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Kubernetes故障篇:unable to retrieve OCI runtime error》

一、背景信息 1、环境信息如下: 操作系统K8S版本containerd版本Centos7.6v1.24.12v1.6.12 2、报错信息如下: Warning FailedCreatePodSandBox 106s (x39 over 10m) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: …

【Docker 学习笔记】Windows Docker Desktop 安装

文章目录 一、前言二、Windows Docker 安装1. 基于Hyper-V后端和Windows容器的安装2. 基于WSL2后端的安装(推荐)3. 安装Docker Desktop on Windows4. 启动并验证Docker Desktop 一、前言 Docker并非是一个通用的容器工具,它依赖于已存在并运…

《零基础入门学习Python》第070讲:GUI的终极选择:Tkinter7

上节课我们介绍了Text组件的Indexs 索引和 Marks 标记,它们主要是用于定位,Marks 可以看做是特殊的 Indexs,但是它们又不是完全相同的,比如在默认情况下,你在Marks指定的位置中插入数据,Marks 的位置会自动…

SAMBA 文件分享相关 笔记

目标说明 在Linux 安装Samba,然后在Windows端映射为网络硬盘 流程 Linux 端命令 apt install samba -y 默认情况下软件会询问是否迁移系统网络设置以搭建协议,选择迁移即可修改配置文件 vim /etc/samba/smb.conf Samba 的配置文件中会带一个名为 prin…

[VRTK4.0]将Unity输入系统与VRTKv4结合使用

学习目标: 展示了如何在Unity项目中设置Unity输入系统,以及如何导入输入系统Tilia包以支持VRTKTilia包与新的Unity输入系统操作一起工作。 流程: 步骤一: 首先我们需要再次检查项目设置是否具有新的Unity输入系统。通过Project S…

JAVA SE -- 第十三天

(全部来自“韩顺平教育”) 集合 一、集合框架体系 集合主要是两组(单列集合、双列集合) Collection接口有两个重要的子接口List 、Set,它们的实现子类都是单列集合 Map接口的实现子类是双列集合,存放的…

Java019-1——面向对象的三大特性

一、封装性 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。(这里说的信息就是类中的属性和方法) 1.1、封装性的体现 想要通过代码体现封装性之前,需要先…

使用vscode+platformio搭建arduino开发环境

存在的问题: Arduino编译时会将所有的C文件都编译一遍造成编译很慢,一个简单的工程稍加修改有可能都需要三四分钟才能编译完成,同时arduino也不支持代码跳转查看功能,不方便代码查看。 解决方法: 使用vscodeplatfor…

【c++】类和对象

类和对象 面向过程和面向对象的初步认识 我们用军事为例,要完成一次作战,需要侦察、后勤保障、战略部署、战术部署...等等 面向过程: 更加关注过程,关注如何侦察(无人机侦察、火力侦察、侦察小组侦察)&…

vue 文件扩展名中 esm 、common 、global 以及 mini 、 dev 、prod 、runtime 的含义

vue 文件扩展名中 esm 、common 、global 以及 mini 、 dev 、prod 、runtime 的含义 vue.js 直接用在 script 标签中的完整版本(同时包含编译器 compiler 和运行时 runtime),可以看到源码,适用于开发环境。 这个版本视图可以写在…

微服务的各种边界在架构演进中的作用

演进式架构 在微服务设计和实施的过程中,很多人认为:“将单体拆分成多少个微服务,是微服务的设计重点。”可事实真的是这样吗?其实并非如此! Martin Fowler 在提出微服务时,他提到了微服务的一个重要特征—…

【Chat GPT】用 ChatGPT 运行 Python

前言 ChatGPT 是一个基于 GPT-2 模型的人工智能聊天机器人,它可以进行智能对话,同时还支持 Python 编程语言的运行,可以通过 API 接口进行调用。本文将介绍如何使用 ChatGPT 运行 Python 代码,并提供一个实际代码案例。 ChatGPT …

【雕爷学编程】MicroPython动手做(18)——掌控板之声光传感器2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

[php-cos]ThinkPHP项目集成腾讯云储存对象COS

Cos技术文档 1、安装phpSdk 通过composer的方式安装。 1.1 在composer.json中添加 qcloud/cos-sdk-v5: >2.0 "require": {"php": ">7.2.5","topthink/framework": "^6.1.0","topthink/think-orm": "…

Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞

异常断电导致数据库无法启动,尝试对数据文件进行recover操作,报ORA-00283 ORA-00742 ORA-00312错误,由于redo写丢失无法正常应用 D:\check_db>sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on 星期日 7月 30 07:49:19 2023 Version 19.3.0.0.0 Copyrig…

NoSQL-Redis集群

NoSQL-Redis集群 一、集群:1.单点Redis带来的问题:2.解决:3.集群的介绍:4.集群的优势:5.集群的实现方式: 二、集群的模式:1.类型:2.主从复制: 三、搭建主从复制&#xff…

阿里云服务器全方位介绍_性能功能优势和租用费用

阿里云服务器全方位介绍包括云服务器ECS优势、云服务器租用价格、云服务器使用场景及限制说明,阿里云服务器网分享云服务器ECS介绍、个人和企业免费试用、云服务器活动、云服务器ECS规格、优势、功能及应用场景详细说明: 目录 什么是云服务器ECS&#…

细讲TCP三次握手四次挥手(三)

TCP/IP 协议族 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议,而往往是表示互联网所使用的整个 TCP/IP 协议族。 互联网协议套件(英语:Internet Pr…

29_互联网(The Internet)(IP数据包;UDP;TCP;DNS;OSI)

上篇介绍了计算机网络的基础知识,也提到互联网(The Internet),本篇将会详细介绍互联网(The Internet)。 文章目录 1. 互联网(The Internet)组成及数据包传输过程2. IP 数据包的不足3…

【AGI】Copilot AI编程辅助工具安装教程

1. 基础激活教程 GitHub和OpenAI联合为程序员们送上了编程神器——GitHub Copilot。 但是,Copilot目前不提供公开使用,需要注册账号通过审核,我也提交了申请:这里第一期记录下,开启教程,欢迎大佬们来讨论…