【瑞数补环境实战】某网站Cookie补环境与后缀分析还原

news2024/11/28 16:32:58

文章目录

  • 1. 写在前面
  • 2. 特征分析
  • 3. 接口分析
  • 3. 补JS环境
  • 4. 补后缀参数

【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章

作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!

1. 写在前面

  瑞数相关的教程在网上可以说是层出不穷,各种技术方案均有!开源社区上多款针对瑞数定制的补环境框架,现在的过瑞数难度相比较于以前难度已经大大降低了!人均瑞数的成就人均可达成,本次我们使用补环境框架来过一下瑞数

2. 特征分析

在分析网站之前,我们需要去了解瑞数防护的一些特征。首先就是开局的无限debugger,然后4代的话请求是两次,一次的话是一个202状态码!在返回HTMl内容中包含动态加载的meta标签包含contentscript标签,如下图所示:

在这里插入图片描述

可以看到有一个外链的JS地址,_ts=window[…]可以直接请求获取JS代码,如下所示:

在这里插入图片描述

3. 接口分析

第一次请求页面我们可以监测一下,FSSBB…就是JS代码生成的Cookie,开头的数字表示它是瑞数几,如下所示:

在这里插入图片描述

这里我们可以直接在浏览器Curl请求出来,进行一下重放请求验证。如下所示:

在这里插入图片描述

标准的202,其实到这一步我们现在需要解决的一个问题就是过瑞数的反爬虫防护,让我们的请求能够正常的拿到页面的响应信息

3. 补JS环境

既然是使用补环境的框架(开源的rs框架很多,大家可以自行去查找测试),环境相关的东西基本都是借助Proxy模式让它自吐出来!

有时候使用框架并页不一定就好使,可能拿到的结果会跟你浏览器的不一样,这个时候就需要再回过头去分析JS,将框架监测到的环境尽可能跟浏览的一致!

这个地方还会有很多的细节坑,也是很多初学者或者rs新手经常补不出来的一个原因!JS的检测点很多,多次补的结果都跟浏览器的不一样,那就需要继续去分析,肯定是JS中没有补到或者监测到的环境

这里的补环境的JS源码很长。文章内作者不对其进行贴出,有需要的小伙伴可以找作者获取学习

这里我们直接运行补环境的框架,检测对象并进行自动代理。然后打印可以看到所有对象的属性信息,如下所示:

在这里插入图片描述

这里我们先使用Python来构造请求,将开始分析得到的content跟自执行JS提取出来(需要放到补出来的JS中执行调用),代码实现如下:

import requests
import re
import logging

logger = logging.getLogger(__name__)

class WebScraper:
    def __init__(self, head_url, headers):
        self.head_url = ""
        self.headers = headers = {
	        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
	        "Accept-Language": "zh-CN,zh;q=0.9",
	        "Cache-Control": "no-cache",
	        "Connection": "keep-alive",
	        "Pragma": "no-cache",
	        "Upgrade-Insecure-Requests": "1",
	        "User-Agent": "" # 自行获取
	    }

    def fetch_page(self):
        response = requests.get(self.head_url, headers=self.headers, verify=False)
        logger.info(f"请求响应状态: {response.status_code}")

        meta_content_match = re.search(r'<meta content="(.*?)">', response.text)
        js_code_match = re.search(r'r="m">(.*?)</s', response.text)

        if not meta_content_match or not js_code_match:
            logger.error("未能找到所需的meta内容或JavaScript代码")
            return None

        meta_content = meta_content_match.group(1)
        js_code = js_code_match.group(1)

        logger.info(f"获取meta_content: {meta_content}")
        logger.info(f"获取自执行JS: {js_code}")

运行上面的程序,在第一次请求响应失败时,提取信息,运行效果如下所示:

在这里插入图片描述

将第一次请求提取到的信息塞到补环境的JS中,全局导出后可直接拿最到新的Cookie信息,如下所示:

在这里插入图片描述

拿到生成的Cookie信息携带发送新的请求,可以看到上图已成功过了瑞数反爬。请求状态码已是200,成功拿到了页面信息

4. 补后缀参数

绕过瑞数反爬虫后,我们需要处理的另一个问题则是后缀!拿接口数据,参数是有加密的,也就是后缀的那个MmEwMD,如下所示:

在这里插入图片描述

这个参数的还原其实有多种方案,第一个就是分析JS对其进行算法还原。有一定的难度!第二个则比较简单,直接在补环境的基础之上,对XMLHttpRequest对象的open方法进行修改并对其进行拦截,以此获取到完整的URL(含后缀

重写open方法的这种方案目前看是比较常见的,针对部分瑞数的反爬虫场景,至少作者在开源社区看到了多种此类的方案

(function() {
    // 保存原始的open方法
    var originalOpen = XMLHttpRequest.prototype.open;

    // 创建一个变量来保存URL
    var lastURL;

    // 重写open方法
    XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
        // 记录URL
        lastURL = url;
        // 调用原始的open方法
        return originalOpen.apply(this, arguments);
    };

    // 提供一个函数来获取记录的URL
    window.getLastRequestURL = function() {
        return lastURL;
    };
})();

作者给出了一个示例,通过这个例子我们可以拦截到XMLHttpRequest对象的open方法,以此来记录传入的URL,并通过getLastRequestURL拿到完整的URL,使用示例如下所示:

// 创建一个XMLHttpRequest对象并调用open方法
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.xxx.com.cn/service/xxx/xxx.actionId", true);

// 获取最后一次请求的URL
console.log(getLastRequestURL());

最终作者对整个网站的请求进行了一个封装,测试了一下完整的流程,如下所示:

在这里插入图片描述

成功拿到后缀参数并提交接口获取到结构化数据,我们可以在此框架的基础去拓展,让其可以适用与所有瑞数的环境场景

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

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

相关文章

2.Python学习:数据类型和变量

1.标识符命名规则 只能由数字、字母、下划线组成不能以数字开头不能是关键字&#xff08;如class等python内部已经使用的标识符&#xff09;区分大小写 查看关键字&#xff1a; print(keyword.kwlist)2.数据类型 2.1常见数据类型 2.1.1Number数值型&#xff1a; 整数int&a…

LLM - 卷积神经网络(CNN)

1. 卷积神经网络结构&#xff1a;分为输入层&#xff0c;卷积层&#xff0c;池化层&#xff0c;全连接层&#xff1b; &#xff08;1&#xff09;首先进入输入层&#xff0c;对数据数据进行处理&#xff0c;将输入数据向量化处理&#xff0c;最终形成输入矩阵。 &#xff08;…

python-22-零基础自学python-数据分析基础 打开文件 读取文件信息

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 读取文件 、逐行读取文件信息等 练习内容&#xff1a; 练习10-1:Python学习笔记 在文本编辑器中新建一个文件&#xff0c;写几句话来总结一下你至此学到的Python知识&#xff0c;其中…

Android C++系列:Linux Socket编程(三)CS模型示例

1. TCP通信 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于 监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服 务器应答,服务器应答一个SYN-ACK段,客户…

【Python实战因果推断】22_倾向分2

目录 Propensity Score Propensity Score Estimation Propensity Score and ML Propensity Score and Orthogonalization Propensity Score 倾向加权法围绕倾向得分的概念展开&#xff0c;其本身源于这样一种认识&#xff0c;即不需要直接控制混杂因素 X 来实现条件独立性…

ARM架构和Intel x86架构

文章目录 1. 处理器架构 2. ARM架构 3. Intel x86架构 4. 架构对比 1. 处理器架构 处理器架构是指计算机处理器的设计和组织方式&#xff0c;它决定了处理器的性能、功耗和功能特性。处理器架构影响着从计算机系统的硬件设计到软件开发的各个方面。在现代计算技术中&#…

暑期备考2024年汉字小达人:吃透18道选择题真题(持续)

结合最近几年的活动安排&#xff0c;预计2024年第11届汉字小达人比赛还有3个多月就启动。那么孩子如何在2024年的汉字小达人活动中取得好成绩呢&#xff1f;根据以往成绩优秀学员的经验&#xff0c;利用暑假集中备考效率最高。把汉字小达人的备考纳入到暑期学习计划&#xff0c…

【Selenium配置】WebDriver安装浏览器驱动(ChromeEdge)

【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09; 文章目录 【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09;Chrome确认Chrome版本下载对应driver把解压后的chromedriver文件放在chrome安装目录下&#xff0…

blender 纹理绘制-贴花方式

贴画绘制-1分钟blender_哔哩哔哩_bilibili小鸡老师的【Blender风格化角色入门教程】偏重雕刻建模https://www.cctalk.com/m/group/90420100小鸡老师最新的【风格化角色全流程进阶教程】偏重绑定。早鸟价进行中&#xff01;欢迎试听https://www.cctalk.com/m/group/90698829, 视…

STM32-TIM定时器

本内容基于江协科技STM32视频内容&#xff0c;整理而得。 文章目录 1. TIM1.1 TIM定时器1.2 定时器类型1.3 基本定时器1.4 通用定时器1.4 高级定时器1.5 定时中断基本结构1.6 预分频器时序1.7 计数器时序1.8 计数器无预装时序1.9 计数器有预装时序1.10 RCC时钟树 2. TIM库函数…

基于单片机的多功能电子时钟的设计

摘要&#xff1a;提出了一种基于单片机的多功能电子时钟的设计方法&#xff0c;以 AT89C52单片机作为系统的主控芯片&#xff0c;采用DS1302作为时钟控制芯片&#xff0c;实现日期时钟显示并且提供精准定时的功能。此外&#xff0c;还可经由DHT22所构成的温湿度传感电路&#x…

JVM原理(十九):JVM虚拟机内存模型

1. 硬件的效率与一致性 数据不安全的原因&#xff1a;缓存一致性的问题 共享内存多核系统&#xff1a;在多路处理器系统中&#xff0c;每个处理器都有自己的高速缓存&#xff0c;而他们又共享同一主内存。 线程先后执行结果不一致问题&#xff1a;除了增加高速缓存之外&#…

Kotlin算法:把一个整数向上取值为最接近的2的幂指数值

Kotlin算法&#xff1a;把一个整数向上取值为最接近的2的幂指数值 import kotlin.math.ln import kotlin.math.powfun main(args: Array<String>) {val number intArrayOf(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)number.forEach {println("$…

IT高手修炼手册(3)程序员命令

一、前言 程序员在日常工作中&#xff0c;掌握一些高效的快捷键可以大大提高编码和开发效率。 二、通用快捷键 文本操作Ctrl A&#xff1a;全选当前页面内容 Ctrl C&#xff1a;复制当前选中内容 Ctrl V&#xff1a;粘贴当前剪贴板内的内容 Ctrl X&#xff1a;剪切当前选中…

【基于R语言群体遗传学】-8-代际及时间推移对于变异的影响

上一篇博客&#xff0c;我们学习了在非选择下&#xff0c;以二项分布模拟遗传漂变的过程&#xff1a;【基于R语言群体遗传学】-7-遗传变异&#xff08;genetic variation&#xff09;-CSDN博客 那么我们之前有在代际之间去模拟&#xff0c;那么我们就想知道&#xff0c;遗传变…

Java版Flink使用指南——安装Flink和使用IntelliJ制作任务包

大纲 安装Flink操作系统安装JDK安装Flink修改配置启动Flink测试 使用IntelliJ制作任务包新建工程Archetype 编写测试代码打包测试 参考资料 在《0基础学习PyFlink》专题中&#xff0c;我们熟悉了Flink的相关知识以及Python编码方案。这个系列我们将使用相对主流的Java语言&…

SQL Server 2022 中的 Tempdb 性能改进非常显著

无论是在我的会话中还是在我写的博客中&#xff0c;Tempdb 始终是我的话题。然而&#xff0c;当谈到 SQL Server 2022 中引入的重大性能变化时&#xff0c;我从未如此兴奋过。他们解决了我们最大的性能瓶颈之一&#xff0c;即系统页面闩锁并发。 在 SQL Server 2019 中&#x…

python函数和c的区别有哪些

Python有很多内置函数&#xff08;build in function&#xff09;&#xff0c;不需要写头文件&#xff0c;Python还有很多强大的模块&#xff0c;需要时导入便可。C语言在这一点上远不及Python&#xff0c;大多时候都需要自己手动实现。 C语言中的函数&#xff0c;有着严格的顺…

【pyhton学习】深度理解类和对象

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一、一切皆对象1.1 对象的概念1.2 如何创建类对象1.3 类型检测 二、属性与方法2.1 如何查看属性与方法2.2 属性和方法…

14-39 剑和诗人13 - 顶级大模型测试分析和建议

​​​​​ 随着对高级语言功能的需求不断飙升&#xff0c;市场上涌现出大量语言模型&#xff0c;每种模型都拥有独特的优势和功能。然而&#xff0c;驾驭这个错综复杂的生态系统可能是一项艰巨的任务&#xff0c;开发人员和研究人员经常面临选择最适合其特定需求的模型的挑战。…