【Cookie反爬虫】某采购网站动态Cookie加点选验证码校验分析与实战

news2024/11/16 17:43:09

文章目录

  • 1. 写在前面
  • 2. 请求分析
  • 3. JS反混淆
  • 4. 深度分析

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  爬虫一途,艰且险阻。稍有不慎就会令你抓耳挠腮!相信很多爬虫工程师们在职业生涯中遇到过各式各样的反爬虫操作,可以说是五花八门!本期教程难度并不高,但是仍然可以阻拦绝大部分的爬虫操作,赶紧动手跟作者学起来吧!

看似Cookie反爬、实则只是开胃小菜!核心防护在翻页点选验证码验证并生成验证加密参数用以后续翻页请求!

分析目标

aHR0cDovL3d3dy55bmdwLmNvbS8=


在这里插入图片描述


在这里插入图片描述

2. 请求分析

一般针对Cookie反爬虫,应该如何判断?这里我们可以尝试清除Cookie记录,点击鼠标右键Replay XHR再次重放请求,如下再次请求无效:

在这里插入图片描述

这里我们也可以直接Curl请求到本地终端测试,尝试请求网站,得到如下反馈:

在这里插入图片描述

这说明是有Cookie反爬的!初看开局刷新页面那张显示加载动作的图,是不是发现跟那个Cloudflare加载的时候异曲同工之妙~

通过上述分析大概率可以判断该网站对Cookie进行了判断检测,导致爬虫无法正常的流程获取到页面数据,既然是Cookie有问题做了手脚,那么我们先分析Cookie尝试多次测试看看有什么变化,经过测试发现PYCCS是在二次请求中更新的,如下所示:

在这里插入图片描述

3. JS反混淆

到了这一步,一般有经验的已经知道该从哪里入手分析了!它这个现象跟我之前做的这个小网站有点相似之处的:某网站搜索接口参数MD5加密又加盐逆向实战分析

它们的相似点就是JS操作的代码放在了请求响应内!并且是混淆过的。就是上面测试请求那块返回的eval(function(…

在这里插入图片描述

这里我们拿出来进行一个反混淆,反混淆之后使用AST普通解密来进行还原,如下所示:

var _$ = ["#challenge", "#waf_answer", "#ChallengeForm"];
$(_$[0]).show();
$(function () {
  setTimeout(function () {
    var x06dd1a = {};
    var x0fcad9;
    var x08c924 = 38;
    var x01c264 = navigator.userAgent.toLowerCase();
    x08c924 = x08c924 * 99;

    if (x0fcad9 = x01c264.match(/msie ([\d.]+)/)) {
      x06dd1a.ie = x0fcad9[1];
    } else {
      if (x0fcad9 = x01c264.match(/firefox\/([\d.]+)/)) {
        x06dd1a.firefox = x0fcad9[1];
      } else {
        if (x0fcad9 = x01c264.match(/chrome\/([\d.]+)/)) {
          x06dd1a.chrome = x0fcad9[1];
        } else {
          if (x0fcad9 = x01c264.match(/opera.([\d.]+)/)) {
            x06dd1a.opera = x0fcad9[1];
          } else {
            if (x0fcad9 = x01c264.match(/version\/([\d.]+).*safari/)) {
              x06dd1a.safari = x0fcad9[1];
            } else {
              0;
            }
          }
        }
      }
    }

    x08c924 = x08c924 + 46;

    if (x06dd1a.ie || x06dd1a.firefox || x06dd1a.chrome || x06dd1a.opera || x06dd1a.safari) {
      x08c924 = x08c924 * 3 + 7;
      if (x08c924 < 123) x08c924 = x08c924 + 2345;
      var x0b515d = $(_$[1]);
      if (x08c924 > 2345) x08c924 = Math.floor(x08c924 / 123);
      x0b515d.val(x08c924);
      $(_$[2]).submit();
    }
  }, 1000);
});

上面的代码AST后是无法直接运行的,需要修改一下,修改之后如下:

navigator = {'userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'}
var _$ = ["#challenge", "#waf_answer", "#ChallengeForm"];
var x06dd1a = {};
var x0fcad9;
var x08c924 = 38;
var x01c264 = navigator["userAgent"]["toLowerCase"]();
x08c924 = x08c924 * 99;

if (x0fcad9 = x01c264.match(/msie ([\d.]+)/)) {
  x06dd1a.ie = x0fcad9[1];
} else {
  if (x0fcad9 = x01c264.match(/firefox\/([\d.]+)/)) {
    x06dd1a.firefox = x0fcad9[1];
  } else {
    if (x0fcad9 = x01c264.match(/chrome\/([\d.]+)/)) {
      x06dd1a.chrome = x0fcad9[1];
    } else {
      if (x0fcad9 = x01c264.match(/opera.([\d.]+)/)) {
        x06dd1a.opera = x0fcad9[1];
      } else {
        if (x0fcad9 = x01c264.match(/version\/([\d.]+).*safari/)) {
          x06dd1a.safari = x0fcad9[1];
        } else {
          0;
        }
      }
    }
  }
}

x08c924 = x08c924 + 46;

if (x06dd1a.ie || x06dd1a.firefox || x06dd1a.chrome || x06dd1a.opera || x06dd1a.safari) {
  x08c924 = x08c924 * 3 + 7;
  if (x08c924 < 123) x08c924 = x08c924 + 2345;
  if (x08c924 > 2345) x08c924 = Math.floor(x08c924 / 123);
}

4. 深度分析

截止到这里,上面还原的JS代码中x08c924所计算出来的值就是下面POST请求获取PYCCS需要提交的参数,提交以后可以拿到Set-Cookie中新的Cookie信息,最后访问网站正常!

在这里插入图片描述
在这里插入图片描述

每一次请求混淆的JS代码是动态生成的,发现变化的地方在数字上所以answer字段所计算出来的结果也是不固定的!

前面的Cookie反爬虫小烟雾弹只是开胃小菜,真正的重头戏在采购板块下相关的信息,这里面的每一项内容在开始翻页之前必须过一个点选验证码,因为后续的翻页请求中携带提交验证检测通过的加密参数,如下所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完成首次的验证是后续请求的必要条件!并且在后续过程中会要求不定时验证检测!每一次点选验证通过以后获取captchaCheckId,它就是检测的加密参数!这个地方全局搜索验证码的那个加密参数,然后可以直接找到一个叫做verify的JS文件,分析如下所示:

在这里插入图片描述
在这里插入图片描述

这里需要注意的是验证码通过验证之后的captchaCheckId参数是有时效性的!测试的话应该是在30分钟内,过期以后会出现验证校验不通过。重新验证即可,如此往复便可顺利进行后续的工作。如下采集所示:

在这里插入图片描述

这个小站的话,除了刚开始的Cookie迷惑操作稍微流程绕了一些外,没有太多的难点!但是本文中规中矩的操作并非最优方案!

爬虫之路、条条可通罗马!

好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS7中安装ElasticSearch

文章目录 检测是否安装了Elasticsearch安装JDK下载java配置 下载Elasticsearch解压安装Elasticsearch修改配置文件启动Elasticsearch常见问题 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasti…

Kotlin 协程1:深入理解withContext

Kotlin 协程1&#xff1a;深入理解withContext 引言 在现代编程中&#xff0c;异步编程已经变得非常重要。在 Kotlin 中&#xff0c;协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中&#xff0c;我们将深入探讨 Kotlin 协程中的一个重要函数&#xff1a;wi…

SpringMVC实现对网页的访问,在请求控制器中创建处理请求的方法

目录 测试HelloWorld RequestMapping注解 RequestMapping注解的位置 RequestMapping注解的value属性 RequestMapping注解的method属性 SpringMVC支持路径中的占位符&#xff08;重点&#xff09; SpringMVC获取请求参数 1、通过ServletAPI获取 2、通过控制器方法的形参…

华为VRP系统简介

因为现在国内主流是华为、华三、锐捷的设备趋势&#xff0c;然后考的证书也是相关的&#xff0c;对于华为设备的一个了解也是需要的。 一、VRP概述 华为的VRP(通用路由平台)是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太…

Narak靶机渗透

靶场下载地址&#xff1a;https://download.vulnhub.com/ha/narak.ova 一、靶机配置 导入靶机 攻击机kali的IP为192.168.245.131&#xff0c;靶机的IP设置成NAT模式。 二、信息搜集 用攻击机对存活主机进行扫描及端口探测 对发现的存活主机进行全端口扫描&#xff0c;还是只开…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”&#xff0c;这就是ABC输入法&#xff0c;点击上面的Delete按钮&#xff0c;删除整项ABC内容&#xff0c…

设置frp在ubuntu开机自启

要在 Ubuntu 上启动 FRP&#xff0c;您可以按照以下步骤进行操作&#xff1a; 下载适用于 Ubuntu 的 FRP。您可以从官方网站下载最新版本的 FRP&#xff1a;https://github.com/fatedier/frp/releases 解压下载的 FRP 文件。您可以使用以下命令从终端解压文件&#xff1a; t…

面试篇-SpringBoot自动配置原理

在Spring Boot中&#xff0c;自动装配是一种强大的功能&#xff0c;它允许开发者快速、简单地配置和管理应用程序的组件。以下是对Spring Boot自动装配原理的详细解释&#xff1a; Spring BootApplication注解源码&#xff1a; SpringBootApplication注解是一个复合注解&#x…

91 C++对象模型探索。RTTI运行时类型识别回顾 与 存储位置介绍

一&#xff0c;RTTI 运行时类型识别&#xff0c;简单回顾 C运行时类型识别RTTI&#xff0c;要求父类这种必须 至少有一个虚函数&#xff0c;如果父类中没有虚函数&#xff0c;那么得到的RTTI就不准确&#xff1b; RTTI就可以在执行期间查询一个多态指针&#xff0c;或者多态应…

初始化和赋值

列表初始化 #include <iostream>struct test{int a; };class object{ public:object(int v10):a{v}{}int a; };int main(){test t1;test t2{};std::cout<<t1.a<<std::endl;std::cout<<t2.a<<std::endl;object b2{11};std::cout<<b2.a<…

详解SpringCloud微服务技术栈:深入ElasticSearch(4)——ES集群

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;深入ElasticSearch&#xff08;3&#xff09;——数据同步&#xff08;酒店管理项目&a…

C++ 之LeetCode刷题记录(二十四)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 119. 杨辉三角 II 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowI…

TI AM5708工业派

文章目录 一、TI AM5708工业派简介二、主要使用的功能三、J12 扩展接口四、NFS代码实现总结 一、TI AM5708工业派简介 TI AM5708工业派是基于美国德州仪器&#xff08;TI&#xff09;的AM5708处理器所开发的智能硬件工业派&#xff0c;主要面向工业生产、图像处理、智能人机交…

基于单片机的烟草干燥温度控制系统设计

摘 要&#xff1a;烟草干燥研究一直备受国内外烟草工作者的重视&#xff0c;在烟草干燥的方法中热风管处理法是利用热空气对流使烟草达到干燥的效果&#xff0c;这样可以控制烟草干燥时的温度&#xff0c;使烟草能够更好更快地干燥&#xff0c;因此温度的检测和控制是很重要的。…

C语言基础14

今天是学习嵌入式相关内容的第十五天&#xff0c;以下是今日所学内容 1.内存管理: 1.malloc void *malloc(size_t size); 2.free void free(void *ptr); 练习:要求申请堆区空间,将"hello world"存放到堆区空间,完成打印 2.内存溢出: 内存溢出也…

Java多线程--线程安全问题练习题

文章目录 &#xff08;1&#xff09;练习题1&#xff08;2&#xff09;练习题2&#xff08;3&#xff09;练习题3 现在咱们线程一共说了这么几件事情&#xff0c;如下&#xff1a; 具体文章见专栏。 接下来看几个练习题吧。 &#xff08;1&#xff09;练习题1 &#x1f30b;题…

会议会务报名签到互动抽奖视频图片直播公众号开发

会议会务报名签到互动抽奖视频图片直播公众号开发 现在越来越多的人进行网络签到&#xff0c;特别是大型的会务/展会&#xff0c;网络签到进场形式应用的越来越广泛也是发展的趋势&#xff1b;会助力智能会议管理系统&#xff1a;可以实现在线报名&#xff08;免费/付费/后台导…

结构体的学习

结构体与共用体&#xff0c;枚举 1.数据类型复习&#xff1a; 2结构体. eg&#xff1b;统计全校同学信息 需要记录的点--- 姓名&#xff0c;班级&#xff0c;性别&#xff0c;成绩&#xff0c;年龄 统计名字&#xff1a;char s[ ] [ 100 ] { "Tmo" } …

Linux ---- Shell编程三剑客之sed

一、sed工具概述 1、sed概念 Sed&#xff08;Stream EDitor&#xff09;是一个强大而简单的文本解析转换工具可以读取文本&#xff0c;并根据指定的条件对文本内容进行编辑&#xff08;删除、替换、添加、移动等&#xff09;&#xff0c;最后输出所有行或者仅输出处理的某些行…

ONLYOFFICE文档8.0现已发布,功能全新升级!

本文目录-ONLYOFFICE 前言&#xff1a;ONLYOFFICE介绍一、经济实惠的开源选择二、自主部署保证数据安全三、灵活的定制与集成四、强大的跨平台全面支持ONLYOFFICE文档8.0更新内容更新一&#xff1a;显示协作者头像更新二&#xff1a;插件UI界面更新更新三&#xff1a;可填写的P…