cookie反爬----普通服务器,阿里系

目录

普通:

1. 简介

2. 加密原理

二.实战案例

1. 逆向目标

2. 逆向分析

1. 逆向目标

2. 逆向分析

实战:

无限debugger原理

1. Function("debugger").call()

2. XXX.constructor("debugger").call("action")

3. (function(){return !![];})["constructor"]("debugger")["call"]("action")

总结

如何过

通杀代码:


普通:

1. 简介

  • Cookie 反爬虫指的是服务器端通过校验请求头中的 Cookie 值来区分正常用户和爬虫程序的手段,这种

    手段被广泛应用在 Web 应用中。

  • image.png

2. 加密原理

  • cookie加密分为大致两种方式

    • 浏览器向服务器发送请求,服务器在响应头带上响应cookie,下次请求的时候需要再带上cookie去进行请求

    • 浏览器向服务器发送请求,服务器返回的是一段js代码,浏览器需要解析js代码,在通过js代码在生成cookie信息
       

二.实战案例

  • 学习响应cookie和session的处理

  • 学习基于首页返回的cookie值

1. 逆向目标
  • 地址:互动交流 - 麻章区政府网站

  • 接口:http://www.zjmazhang.gov.cn/hdjlpt/letter/pubList

  • 对抗: cookie 反爬虫处理

2. 逆向分析
  • 可以先测试当前网站的接口,可以发现,当前的接口需要一个cookie值,一个token值

    image.png

    image.png

    确定为cookie反爬,第一步先清除cookie

  • image.png

  • 重新请求

    image.png

  • 发现published中的

    image.png

  • _csrf为

    image.png

    publist中的X_Csrf-Token

    先请求published这个接口

    image.png

  • 发现publist中的cookie也是这个里面带出来的

  • 那我们首先请求published,再请求publist即可

    image.png

  • import requests
    import re
    
    def get_cookie():
        url = 'http://www.zjmazhang.gov.cn/hdjlpt/published?via=pc'
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
        }
        res = requests.get(url, headers=headers)
        csrf = re.findall("var _CSRF = '(.*?)';", res.text)[0]
        # print(res.cookies)
        cookie = res.cookies.get('szxx_session')
        return csrf, cookie
    
    
    csrf, cookie = get_cookie()
    url = 'http://www.zjmazhang.gov.cn/hdjlpt/letter/pubList'
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
        'X-Csrf-Token': csrf
    }
    
    cookies = {'szxx_session': cookie}
    data = {
        "offset": "0",
        "limit": "20",
        "site_id": "759010",
        "time_from": "1669564800",
        "time_to": "1701014399"
    }
    res = requests.post(url, headers=headers, cookies=cookies, data=data)
    
    print(res.text)
  • 阿里系cookie
    
        请求两次    第一次会得到一个响应的cookie   会返回一个js代码   通过js代码会生成一个新的cookie
        第二次请求需要拿到两次生成的cookie才能访问
        自动的断点
    • 学习JS设置的cookie处理

    • 学习轻度JS混淆处理

    1. 逆向目标

    • 首页:aHR0cHM6Ly90YW5nLmNkdC1lYy5jb20vbm90aWNlL21vcmVDb250cm9sbGVyL3RvTW9yZT9nbG9ibGVUeXBlPTA=

    • 目标:cookie: acw_sc__v2

    2. 逆向分析

    • 逆向cookie时需要先清空cookie,让网页重新生成

    • 阿里系的cookie在重新刷新之后,会进入到debugger模式

    • 过无限debugger

    Function.prototype.__constructor_back = Function.prototype.constructor;
    Function.prototype.constructor = function() {
        if(arguments && typeof arguments[0]==='string'){
            if("debugger" === arguments[0]){
                return
            }
        }
       return Function.prototype.__constructor_back.apply(this,arguments);
    }
    • 可以直接通过调试断点的方式,找到加密的位置

    实战:

  • 发现他是getlist这个请求,加密参数是要带上cookie的acw_sc_v2

  • image.png

  • image.png

    我们先把这个cookie去掉,重发请求

  • image.png

  • image.png

  • 如我们所料,发了两个包,第一个是js代码,第二个是正常的包

  • image.png

  • image.png

    下面我们下script断点:

    image.png

    断到这个地方了,继续执行接下来断到

  • image.png

    继续执行会到无限debugger里面去

  • image.png

  • 进去,看是如何调用的

    image.png

  • 发现debugger是这样的

  • 无限debugger原理

  • 下面是基本原理:

  • 这些代码示例利用了JavaScript中的Function构造函数和对象的constructor属性来动态执行字符串形式的代码。这些方法通常用于执行任意代码,但也可以用于注入和执行恶意代码。下面我将解释每个示例的原理,并提供一些例子。

    1. Function("debugger").call()

    这个示例使用Function构造函数来创建一个新的函数,该函数包含一个debugger语句。然后使用call方法执行这个新函数。

    // 创建并执行一个包含debugger的函数
    Function("debugger").call();

    这行代码会立即执行debugger,导致浏览器在调试模式下暂停执行。

    2. XXX.constructor("debugger").call("action")

    这个示例首先获取某个对象XXXconstructor属性,这是一个指向创建该对象的构造函数的引用。然后,它使用这个构造函数来创建一个新的函数,该函数包含一个debugger语句,并尝试用call方法执行这个新函数。

    // 假设有一个对象obj
    const obj = {};
    
    // 使用obj的constructor(即Object)来创建并执行一个包含debugger的函数
    obj.constructor("debugger").call();

    这行代码同样会执行debugger,导致浏览器在调试模式下暂停执行。

    3. (function(){return !![];})["constructor"]("debugger")["call"]("action")

    这个示例稍微复杂一些。它首先创建一个立即执行函数表达式(IIFE),该函数返回一个布尔值。然后,它获取这个函数的constructor属性,这是一个指向Function构造函数的引用。接着,它使用这个构造函数来创建一个新的函数,该函数包含一个debugger语句。最后,它使用call方法执行这个新函数。

    // 创建一个IIFE,返回一个布尔值
    const boolFunc = (function() {
        return !![];
    })();
    
    // 使用boolFunc的constructor(即Function)来创建并执行一个包含debugger的函数
    boolFunc.constructor("debugger").call();

    这行代码也会执行debugger,导致浏览器在调试模式下暂停执行。

    总结

    这些示例展示了如何使用Function构造函数和对象的constructor属性来动态执行代码。这些技术可以用于测试、调试或执行动态代码,但也可能被用于恶意目的,如代码注入和执行恶意代码。因此,在使用这些技术时需要谨慎,并确保代码的安全性。

这段代码是一个混淆过的JavaScript代码片段,它使用了多种技巧来隐藏其真实意图。让我们逐步分析这段代码:

  1. (function() {}:这是一个空的立即执行函数表达式(IIFE)。

  2. ['\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72']:这是一个数组,其中包含一个字符串,该字符串是"constructor"的十六进制编码。

  3. (undefined + '')[0x2]:这是一个技巧,用于获取字符串"undefined"的第三个字符,即d

  4. (!![] + '')[0x3]:这是一个技巧,用于获取字符串"true"的第四个字符,即e

  5. ([][_0x55f3('0x1f', '\x4c\x24\x28\x44')]() + '')[0x2]:这部分代码看起来是调用了一个名为_0x55f3的函数(可能是一个混淆后的函数名),并传递了两个参数。这个函数可能返回一个方法名,然后调用该方法,并将其结果与空字符串拼接,最后取第二个字符。由于_0x55f3函数的具体实现未知,我们无法确定这部分代码的确切行为。

  6. (![] + [0x0] + String)[0x14]:这是一个技巧,用于获取字符串"false"的第十五個字符,即s

  7. (!![] + '')[0x3]:这是一个技巧,用于获取字符串"true"的第四个字符,即e

  8. (!![] + '')[0x1]:这是一个技巧,用于获取字符串"true"的第二个字符,即r

将这些部分组合起来,这段代码实际上是在构造一个字符串,该字符串通过连接上述字符来形成"constructor"。然后,它使用这个字符串作为键来访问当前上下文中的一个对象的constructor属性。

如何过

我们可以这么过:

Function.prototype.__constructor_back = Function.prototype.constructor;
Function.prototype.constructor = function() {
    if(arguments && typeof arguments[0]==='string'){
        if("debugger" === arguments[0]){
            return
        }
    }
   return Function.prototype.__constructor_back.apply(this,arguments);
}

过了这个进入我们之前打的断点

image.png

看上一层堆栈,发现是由settimeout执行函数,加密位置在arg2,arg2加密也在上面

image.png

开始扣代码

      var _0x23a392 = arg1[_0x55f3('0x19', '\x50\x67\x35\x34')]();
        arg2 = _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')](_0x5e8b26);

扣的过程中随时替换

image.png

arg1是变化的

扣完的成品:

image.png

通杀代码:

​​​​​https://articles.zsxq.com/id_bblrs5mvwdit.html,见知识星球

包装成一个方法后,在python先把加密参数删除掉,请求第一次,用re提取arg1形成加密参数,请求第二次

image.png

完结。

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

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

相关文章

大数据新视界 -- 大数据大厂之 Impala 性能优化:跨数据中心环境下的挑战与对策(上)(27 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

width设置100vh但出现横向滚动条的问题

在去做flex左右固定,中间自适应宽度的布局时, 发现这样一个问题: 就是我明明是宽度占据整个视口, 但是却多出了横向的滚动条 效果是这样的 把width改成100%,就没有滚动条了 原因: body是有默认样式的, 会有一定的默认边距, 把默认边距清除就是正常的了 同时, 如果把高度设…

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻,今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”,百度文心智能体平台入选。 这个智能体平台我最近也有所关注,接下来我就来讲讲它。 百度在下一盘大棋…

探索 RocketMQ:企业级消息中间件的选择与应用

一、关于RocketMQ RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统&…

Android 基于Camera2 API进行摄像机图像预览

前言 近期博主准备编写一个基于Android Camera2的图像采集并编码为h.264的应用,准备分为三个阶段来完成,第一阶段实现Camera2的摄像机预览,第二阶段完成基于MediaCodec H.264编码,第三阶段完成基于MediaCodec H.264解码,针对不同…

QT 线程 QThread QT5.12.3环境 C++实现

一、线程 QT主线程称为GUI线程,负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。如果把一些比较复杂或者费时的操作放在主线程中,界面就会出现卡顿或者无响应的现象。一般主线程负责影响界面上的操作, 子线程负责负…

【LLM】一文学会SPPO

博客昵称:沈小农学编程 作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在…

Vue3-后台管理系统

目录 一、完成项目历程 1、构建项目 2、项目的自定义选项 3、 封装组件 4、配置对应页面的路由 5、从后端调接口的方式 二、引入Element Plus、Echarts、国际化组件 1、Element Plus安装 2、Echarts安装 3、国际化 三、介绍项目以及展示 1、项目是基于Vue3、Element …

C0030.Clion中运行提示Process finished with exit code -1073741515 (0xC0000135)解决办法

1.错误提示 2.解决办法 添加环境变量完成之后,重启Clion软件,然后就可以正常调用由mingw编译的opencv库了。

【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解

vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为&#xff0…

Python浪漫之画明亮的月亮

目录 1、效果展示 2、完整版代码 1、效果展示 2、完整版代码 import turtledef draw_moon():# 设置画布turtle.bgcolor("black") # 背景颜色为黑色turtle.speed(10) # 设置绘制速度# 绘制月亮的外圈turtle.penup()turtle.goto(0, -100) # 移动到起始…

《线性代数的本质》

之前收藏的一门课,刚好期末复习,顺便看一看哈哈 课程链接:【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量,需要先明白什么是向量 不同专业对向量的看法 物理专…

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony,需要使用linux环境进行代码的编译,为兼顾日常办公需要,可采用WindowsUbuntu虚拟机的混合开发的环境,通过网络及文件夹共享,在主机和虚拟机之间共享文件数据。 工具准备&#x…

智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建

hello~这里是维小帮,如有项目需求和技术交流欢迎大家私聊我们!点击文章最下方获取智慧停车场方案~撒花! 随着城市化进程的加速,停车难问题日益凸显。智能停车系统作为缓解停车压力的有效手段,其核心技术与架构的构建至…

(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统

摘 要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下,开发一…

IDEA2023版本中如何启动项目的多个实例

假设现在要启动多个服务,例如简单的客户端和服务端,默认的idea是只能启动一个的,那么我们需要进行配置允许多个项目的同时启动,现在进行多实例的配置。 第一步 点击Edit Configurations 第二步 点击Modify options 第三步 勾选…

图的邻接矩阵和邻接表存储

目录 邻接矩阵存储法 简介 ​编辑 邻接矩阵举例 无向图邻接矩阵 有向图邻接矩阵 当各条边带有权值时 邻接矩阵算法实现 结构体定义和函数声明 函数的实现 邻接表存储法 简介 邻接表的算法实现 结构体定义和函数声明 函数的实现 邻接矩阵和邻接表的差别 邻接矩阵存…

【Linux命令】grep

Linux命令-grep GREP命令:进行字符串数据的比对,并将符合指定模式的字符串行打印出来。1.命令介绍基础正则表达式原始文档如下: 2.练习题:2.1 练习(一):2.1.1 读取加行号的文件内容:…

WMS 如何实现智能仓储与自动化物流的无缝对接

【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。】 在当今高度竞争的商业环境中,企业对于物流效率和仓储管理的要求日益严苛。智能仓储和自动化物流作为现代物流领域的重要发展方向,能够显著提高物流运作的速度、准确性和成…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具,是由JAVA开发而成 2. Jenkins是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…