当前位置: 首页 > news >正文

爬虫逆向实战(二十七)--某某招标投标网站招标公告

一、数据接口分析

主页地址:某网站

1、抓包

通过抓包可以发现数据接口是page
在这里插入图片描述

2、判断是否有加密参数

  1. 请求参数是否加密?
    通过查看“载荷”模块可以发现,请求参数是一整个密文
    在这里插入图片描述
  2. 请求头是否加密?
  3. 响应是否加密?
    通过查看“响应”模块可以发现,响应数据是加密的
    在这里插入图片描述
  4. cookie是否加密?

二、加密位置定位

1、看启动器

查看启动器发现里面包含异步,所以无法正确找到加密位置
在这里插入图片描述

2、搜索关键字

因为加密参数是一整个密文,所以无法搜索关键字

3、hook

因为“载荷”是一整个密文,所以网站大概率会使用JSON.stringify将数据转换为json字符串再进行加密,所以我们可以hookJSON.stringify,hook代码:

var my_stringify = JSON.stringify;
JSON.stringify = function (params) {debuggerconsole.log("json_stringify params:",params);return my_stringify(params);
};

运行hook代码,再次点击翻页,发现可以断住
在这里插入图片描述
接着调试执行,我们就可以找到加密位置了,并且可以看到,在下面的回调方法中对响应进行了解密操作。
在这里插入图片描述

三、解决密钥

1、分析网站密钥的获取

在定位到加密以及解密位置后,我们可以看到网站加解密时需要密钥,并且网站的密钥获取是从本地存储中获取logo1logo2
在这里插入图片描述
所以我们可以通过hooklocalStorage.setItem来找到网站是怎么生成的这两个参数。
hook代码:

var my_setItem = localStorage.setItem;
localStorage.setItem = function (key, value) {debuggerreturn my_setItem.call(localStorage, key, value);
};

同时,为了让网站可以再次生成这两个参数,我们需要先将本地存储中的删除。在控制台中,进入“应用”这个标签页,再点击“本地存储空间”,然后点击清除按钮,就可以清除了。
在这里插入图片描述
然后运行hook脚本,点击浏览器上方的后退按钮。注意:此处不能刷新页面,因为刷新页面hook代码将不再运行,同时,此网站是在首页向本地存储中放入的参数,所以我们要回退到首页生成。
在这里插入图片描述
点击回退后,发现可以断住
在这里插入图片描述
接着调试执行,我们就可以找到网站设置的位置了,同时,可以发现这个位置好像是在一个回调中。
在这里插入图片描述
再次观察发包,可以发现网站确实是从一个bj.css的响应中提取的。所以我们就可以通过请求这个接口,按照网站的提取方法提取出密钥,或者自己写正则表达式将密钥提取出来。
在这里插入图片描述

四、验证码

1、获取数据错误

在扣完js之后,我们发送请求会发现,获取到的数据与网站抓包获取到的数据不太一致,网站抓包获取到的数据是一整个密文,而我们获取到的数据是一个json数据并且code是511
在这里插入图片描述
在这里插入图片描述
此时我们再次回到网站,发现网站在收到code为511的响应时,会出现一个验证码
在这里插入图片描述

2、处理验证码

点击刷新验证码可以发现,网站是发送一个请求cms/validateCode/undefined获取的验证码,响应中的data是base64编码的图片数据。
在这里插入图片描述
当我们输入一个错误的验证码时,可以发现,网站是将我们输入的内容拼接到路径中进行请求。
在这里插入图片描述
所以我们可以先请求undefined接口获取到一个验证码,然后破解验证码(我是使用的第三方打码平台),将破解的验证码拼接到路径中,再次发送请求,然后再获取数据即可。

五、扣js

将加密以及解密位置的代码扣出,缺啥补啥即可。
该网站使用的是webpack,我们可以发现,网站加密时使用的lm都是来自于webpack中的模块,
在这里插入图片描述
所以我们可以在f = n("e2b4")打断点,然后进入到n方法中,扣出加载器,然后再将需要的模块扣出即可。

六、源代码

js源代码因为字数太多无法上传,所以就放在了资源中,在文章最上方点击“立即下载”即可
在这里插入图片描述

python源码:

"""
Email:912917367@qq.com
Date: 2023/8/29 11:41
"""
import timeimport execjs
import requestsfrom utils.chaojiying import ChaojiyingClientclass Spider:def __init__(self):self.session = requests.session()self.session.headers = {"MACHINE_CODE": str(int(time.time() * 1000)),"Origin": "https://www.cnpcbidding.com","Referer": "https://www.cnpcbidding.com/","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",}with open('reverse.js', 'r', encoding='utf-8') as f:self.js_obj = execjs.compile(f.read())self.bj = ''self.pic_str = ''def get_bj(self):url = "https://www.cnpcbidding.com/cms/css/bj.css"response = self.session.get(url)self.bj = response.textdef get_img_code(self):url = "https://www.cnpcbidding.com/cms/validateCode/undefined"response = self.session.get(url)cjy = ChaojiyingClient('lan8sjk', 'lan8@2023', '946014')pic_data = cjy.post_pic_base64(response.json()['data'], 6001)self.pic_str = pic_data['pic_str']url = "https://www.cnpcbidding.com/cms/validateCode/" + str(self.pic_str)response = self.session.get(url)print(response.text)print(response)def get_data(self):data = self.js_obj.call('get_params', self.bj)self.session.headers['Content-Type'] = "application/json;charset=UTF-8"url = "https://www.cnpcbidding.com/cms/article/page"response = self.session.post(url, data=data)data = self.js_obj.call('get_data', self.bj, response.text)print(data)if __name__ == '__main__':s = Spider()s.get_bj()s.get_img_code()s.get_data()

相关文章:

爬虫逆向实战(二十七)--某某招标投标网站招标公告

一、数据接口分析 主页地址:某网站 1、抓包 通过抓包可以发现数据接口是page 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现,请求参数是一整个密文 请求头是否加密? 无响应是否加密? 通…...

线程和之间的通讯方式、进程之间的通讯方式、线程之间如何同步

通信是指线程之间以何种机制来交换信息,同步是指程序中用于控制不同线程间操作发生相对顺序的机制 进程由线程组成,所以进程中有的通讯机制线程中全都有 线程的通讯方式: 1. 锁机制:包括互斥锁、条件变量、读写锁 互斥锁提供了以…...

CRM线索公海如何管理?

对于销售和CRM客户管理而言,公海线索的管理极为重要,今天本文将告诉大家: 1、如何合理设置公海线索规则和流程?2、手把手教你完成公海管理系统的搭建 关于CRM的公海管理问题,需要根据企业的具体情况和销售流程来设置…...

创建web应用程序,React和Vue怎么选?

React和Vue都是创建web应用程序的绝佳选择。React得到了科技巨头和庞大的开源社区的支持,代码库可以很大程度地扩展,允许你创建企业级web应用程序。React拥有大量合格甚至优秀的开发人员粉丝,可以解决你在开发阶段可能遇到的任何问题。 毫无疑…...

【每日一题】1267. 统计参与通信的服务器

【每日一题】1267. 统计参与通信的服务器 1267. 统计参与通信的服务器题目描述解题思路 1267. 统计参与通信的服务器 题目描述 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有…...

Python入门教程29:字符串前加r、u、b、f是什么意思?

★★★★★博文原创不易,我的博文不需要打赏,也不需要知识付费,可以白嫖学习编程小技巧,喜欢的老铁可以多多帮忙点赞,小红牛在此表示感谢。★★★★★ 关键字参数字符串前加上r、u、b和f,分别表示不同的字…...

java8 IntStream.range

简介 IntStream.range是Java 8中的一个方法,它是java.util.stream.IntStream类中的静态方法。这个方法用于生成一个顺序排列的整数流,包含起始值但不包含结束值。可以使用以下代码调用IntStream.range方法: IntStream.range(int startInclu…...

数据库集群的简单了解

Update 关于操作的日志 1.0 redo log 读一次写一次 一共2次, 不安全 注意redo log是顺写 而file是随机 所以Mysql做出类似HDFS的操作 行为日志和数据分离,但是不同的是,Mysql在内存中操作修改,如果不出事故,由内存中的行为来直接…...

CSS中如何实现文字阴影效果(text-shadow)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现思路⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前…...

Nginx从入门到精通(超级详细)

文章目录 一、什么是Nginx1、正向代理2、反向代理3、负载均衡4、动静分离 二、centos7环境安装Nginx1、安装依赖2、下载安装包3、安装4、启动5、停止 三、Nginx核心基础知识1、nginx核心目录2、常用命令3、默认配置文件讲解4、Nginx虚拟主机-搭建前端静态服务器5、使用nignx搭建…...

为何反射探针关闭Mipmap后变成了白图

1)为何反射探针关闭Mipmap后变成了白图 2)2021.3 Android从AssetBundle中加载视频播放失败问题 3)SBP是否可以解决打包时FBX等模型文件中额外的GameObject 4)Addressables加载已打包过的Prefab后Mono脚本丢失 这是第349篇UWA技术知…...

成都睿趣科技:抖音开网店前期的流程是什么

随着互联网的快速发展,电子商务成为了商业领域中的一大利器,而在电商领域中,抖音作为一个强大的平台,也吸引了众多商家的目光。然而,要在抖音上开设一家成功的网店,并不是一件简单的事情,需要经…...

机房安全之道:构筑坚固的网络防线

引言: 在数字化时代,机房成为了许多组织和企业的核心基础设施,承载着重要的数据和应用。然而,随着网络攻击日益猖獗,机房的安全性显得尤为重要。本文将深入探讨如何构建坚固的网络防线,保护机房免受攻击的方…...

使用GoLand进行远程调试

对部署进行配置 在此配置远程服务器地址,映射,是否自动上传(更新)等 选择SFTP类型 选择上传 另外给自动上传选项打钩 此时在本地修改某个文件,远程机器相应目录的文件,也会被同步修改 对远程调试进行配置 远程机器需要安装delve 而…...

C++通过JNI调用JAVA方法返回ArrayList对象

运行效果: JAVA实现: 获取系统已安装应用列表并返回List<String>对象 //使用系统API获取安装包列表public List<String> getAppList(MainActivity act) {List<String> packages = new ArrayList<String>();try {//取包信息列表List<PackageInf…...

.netcore grpc截止时间和取消详解

一、截止时间概述 截止时间功能让 gRPC 客户端可以指定等待调用完成的时间。 超过截止时间时&#xff0c;将取消调用。 设定一个截止时间非常重要&#xff0c;因为它将提供调用可运行的最长时间。它能阻止异常运行的服务持续运行并耗尽服务器资源。截止时间对于构建可靠应用非…...

React组件间数据传递(弹框和高阶组件(HOC)特性实现)

前言 在现代前端开发中&#xff0c;React 已经成为了最受欢迎的 JavaScript 库之一。而在复杂的应用中&#xff0c;不同组件之间的数据传递问题显得尤为关键。在本文中&#xff0c;我们将探讨一种高效的方法&#xff0c;即如何利用弹框和高阶组件特性来实现 React 组件间的数据…...

只考一门数据结构,计算机学硕复录比1:1的山东双非学校考情分析

青岛理工大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1420字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 青岛理工…...

SpringMVC之异常处理器

文章目录 前言一、基于配置的异常处理二、基于注解的异常处理总结 前言 SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口&#xff1a;HandlerExceptionResolver。 HandlerExceptionResolver接口的实现类有&#xff1a;DefaultHandlerExceptionResolver&#x…...

【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)

​&#x1f47b;内容专栏&#xff1a; 《数据结构与算法篇》 &#x1f428;本文概括&#xff1a; 利用数据结构栈(Stack)来模拟递归&#xff0c;实现快排的非递归版本&#xff1b;递归版本测试OJ题时&#xff0c;有大量重复元素样例不能通过&#xff0c;导致性能下降&#xff0…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

StarRocks 全面向量化执行引擎深度解析

StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计&#xff0c;相比传统行式处理引擎&#xff08;如MySQL&#xff09;&#xff0c;性能可提升 5-10倍。以下是分层拆解&#xff1a; 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...

新版NANO下载烧录过程

一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...