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

news2024/11/24 17:55:23

目录

普通:

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

完结。

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

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

相关文章

C++中的erase()函数用法总结

在 C 中,erase() 是 std::string 和 std::vector 等容器中的成员函数,用于删除容器中的元素。erase可以删去容器中指定位置的元素,容器的size(大小)会改变,但是容器的容量不变。 常用用法: 1.…

全面解析:HTML页面的加载全过程(四)--浏览器渲染之样式计算

主线程遍历得到的 DOM 树,依次为树中的每个节点计算出它最终的样式,称之为 Computed Style。 通过前面生成的DOM 树和 CSSOM 树,遍历 DOM 树,为每一个 DOM 节点,计算它的所有 CSS 属性,最后会得到一棵带有…

Linux|内存级文件原理

目录 进程与文件 Linux下的文件系统 文件操作,及文件流 C语言函数 文件流 文件描述符 系统调用操作 系统调用参数 重定向与文件描述符 输出重定向 输入重定向 文件内容属性 Linux下一切皆文件 进程与文件 当我们对文件进行操作时,文件必须…

40分钟学 Go 语言高并发:Context包与并发控制

Context包与并发控制 学习目标 知识点掌握程度应用场景context原理深入理解实现机制并发控制和请求链路追踪超时控制掌握超时设置和处理API请求超时、任务限时控制取消信号传播理解取消机制和传播链优雅退出、资源释放context最佳实践掌握使用规范和技巧工程实践中的常见场景…

【SpringMVC - 1】基本介绍+快速入门+图文解析SpringMVC执行流程

目录 1.Spring MVC的基本介绍 2.大致分析SpringMVC工作流程 3.SpringMVC的快速入门 首先大家先自行配置一个Tomcat 文件的配置 配置 WEB-INF/web.xml 创建web/login.jsp 创建com.ygd.web.UserServlet控制类 创建src下的applicationContext.xml文件 重点的注意事项和说明…

neo4j图数据库community-5.50创建多个数据库————————————————

1.找到neo4J中的conf文件,我的路径是:D:\Program Files\neo4j-community-5.5.0-windows\neo4j-community-5.5.0\conf 这里找自己的安装路径, 2.用管理员模式打开conf文件,右键管理员,记事本或者not 3.选中的一行新建一…

如何最简单、通俗地理解Python的迭代器?

我们知道迭代器(iterator)可以用for循环去取数,这和列表取数有什么区别呢? 想理解Python迭起器的差异,有个很简单的例子 打个比方,你去玩街头投篮机,可以投5个球,这里有两种方式&a…

JavaEE 【知识改变命运】02 多线程(1)

文章目录 线程是什么?1.1概念1.1.1 线程是什么?1.1.2 为什么要有线程1.1.3 进程和线程的区别1.1.4 思考:执行一个任务,是不是创建的线程或者越多是不是越好?(比如吃包子比赛)1.1.5 ) Java 的线程…

Linux内核USB2.0驱动框架分析--USB包

一, 包的组成 每个包都由SOP(包起始域)、SYNC(同步域)、Packet Content(包内容)、EOP(包结束域)四部分组成,其中SOP、SYNC、EOP为所有包共有的域&#xff0c…

云轴科技ZStack亮相2024 IDC中国生态峰会,共塑AI时代IT生态新格局

11月21日,2024 IDC中国生态峰会在北京举办,吸引了超过300位生态伙伴齐聚一堂,聚焦行业内最前沿的热点话题。本届峰会以“创见先机,智领风云”为主题,深入探讨宏观经济趋势、技术革新以及如何融合AI与数据技术&#xff…

C0029.在Clion中解决Debug时,提示Process finished with exit code -1的错误

1.错误提示 Process finished with exit code -12.解决办法 如上在使用Debug进行代码调试时,直接出现如上报错,解决办法就是直接点击运行程序,即可查出报错编号,然后根据报错编号来查找问题; 然后在网上就可以根据该…

07-Making a Bar Chart with D3.js and SVG

课程链接 Curran的课程,通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom,根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据,可以使用通义千问,关于LinearScale与BandScale不懂的地方也可以在通义千…

读取各种来源格式单细胞数据集构建seurat分析对象,代做生信分析

参考资料和分析注意事项 全流程的分析指导视频 演示数据集网盘文件 分析参数文件路径格式的特别提示 大家给要分析用到的文件路径或目录路径的时候,以D:/omics_tools/demo_data/scrnaseq/GSE189125/GSE189125_5prime_scRNAseq_seqbatchA_counts.txt.gz 这个文件为…

SQL-多表操作

前文所介绍的sql操作都是基于单表进行的,接下来我们来学习多表操作。 多表设计 在实际的项目开发中,会根据业务需求和业务模块之间的关系进行数据库表结构设计,由于业务之间相互关联,所以各个表结构之间也存在着各种联系&#xf…

c++ STL线程安全使用

c STL不是线程安全的&#xff0c;因此在多线程中使用的时候&#xff0c;操作同一个容器&#xff0c;会崩溃&#xff0c;因此需要解决线程安全的问题&#xff1a; 使用实例类似于以下&#xff1a; #include <thread> #include <vector> #include "thread_safe…

Swift 实现判断链表是否存在环:快慢指针法

文章目录 前言摘要描述题解答案题解代码题解代码分析示例测试及结果时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 LeetCode - #141 环形链表 不积跬步&#xff0c;无以至千里&#xff1b;不积小流…

SpringCloud实用-OpenFeign 调用三方接口

文章目录 前言正文一、项目环境二、项目结构2.1 包的含义2.2 代理的场景 三、完整代码示例3.1 定义FeignClient3.2 定义拦截器3.3 配置类3.4 okhttp配置3.5 响应体3.5.1 天行基础响应3.5.2 热点新闻响应 3.6 代理类3.6.1 代理工厂3.6.2 代理客户端3.6.3 FeignClient的建造器 四…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

HarmonyOS:使用ArkWeb构建页面

一、简介 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 二、…

矩阵的拼接

矩阵的拼接分为横向拼接和纵向拼接 注意&#xff1a;横向拼接要求两矩阵行数相同&#xff0c;纵向拼接要求两矩阵列数相同 h o r z c a t horzcat horzcat和 v e r t c a t vertcat vertcat函数 h o r z c a t ( a , b ) horzcat(a,b) horzcat(a,b)将 a a a和 b b b横向拼接&a…