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

一、数据接口分析

主页地址:某网站

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()

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python进行数据分析:数据预处理

六大数据类型 见python基本功 import numpy as np import pandas as pd数据预处理 缺失值处理 float_data pd.Series([1.2, -3.5, np.nan, 0]) float_data0 1.2 1 -3.5 2 NaN 3 0.0 dtype: float64查看缺失值 float_data.isna()0 False 1 …

Linux 发行版 Debian 宣布支持龙芯 LoongArch 架构

近期,龙芯发布了 3A6000 桌面处理器,芯片的性能又一次大幅度提升,成为国产芯片的又一里程碑。 同期,LoongArch 架构的生态建设也迅速提升,开源网络引导固件 iPXE、QQ Linux 版、摩尔线程等软硬件都官宣支持龙芯 Loong…

linux 设置与命令基础(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、系统基本操作 二、命令类型 三、命令语法 四、命令补齐 五、命令帮助 六、系统基本操作命令 总结 前言 这是本人学习Linux的第二天,今天主…

leetcode刷题(字符串相加、包含每个查询的最小区间、模拟行走机器人、环形子数组的最大和、满足不等式的最大值、四数之和、树中距离之和)

目录 1、字符串相加 2、包含每个查询的最小区间 3、模拟行走机器人 4、环形子数组的最大和 5、满足不等式的最大值 6、四数之和 7、 树中距离之和 1、字符串相加 class Solution:def addStrings(self, num1: str, num2: str) -> str:i len(num1) - 1 # num1的末…

软考A计划-网络工程师-必考知识点-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

听力总结易错点+口语准则

目录 听力总结易错点 where are you come from?其实是错的 杯子的大小表达 口语准则 一些常见蔬菜的英文名称: To get a lot out of 英语复述句子题 听力总结易错点 1,在section 1 ,很容易把a读成n 2. silver colored cloth 这个clo…

2023高教社杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

Java学数据结构(2)——树Tree 二叉树binary tree 二叉查找树 AVL树 树的遍历

目录 引出什么是树Tree?树的实现二叉树binary tree查找树ADT——二叉查找树Binary Search Tree1.contains方法2.findMax和findMin方法3.insert方法4.remove方法(复杂)二叉查找树的深度 AVL(Adelson-Velskii和Landis)树——平衡条件(balance c…

运算符(个人学习笔记黑马学习)

算数运算符 加减乘除 #include <iostream> using namespace std;int main() {int a1 10;int a2 20;cout << a1 a2 << endl;cout << a1 - a2 << endl;cout << a1 * a2 << endl;cout << a1 / a2 << endl;/*double a3 …

时空数据挖掘精选23篇论文解析【AAAI 2023】

今天和大家分享时空数据挖掘方向的资料。 时空数据挖掘是人工智能技术的重要分支&#xff0c;是一种采用人工智能和大数据技术对城市时空数据进行分析与挖掘的方法&#xff0c;旨在挖掘时空数据&#xff0c;理解城市本质&#xff0c;解决城市问题。 目前&#xff0c;时空数据…

相机SD卡数据丢失如何恢复?

出门在外&#xff0c;相机是人们记录生活点滴的重要工具&#xff0c;是旅游的最佳玩伴。人们每到一个地方&#xff0c;都喜欢用相机来见证自己来过的痕迹&#xff0c;拍好的照片都会被放到相机卡里&#xff0c;但在使用相机时&#xff0c;有时我们会意外删除了重要的照片或视频…

​LeetCode解法汇总57. 插入区间

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个 …