[JS逆向] 福建电子交易平台

article/2025/8/12 17:36:20

 博客配套代码发布于github:福建电子交易平台

相关知识点:[爬虫知识] 密码学:通往JS逆向路上必会的一环

相关爬虫专栏:JS逆向爬虫实战  爬虫知识点合集  爬虫实战案例


此案例目标为对福建省电子公共服务平台逆向,并爬取前20页。

(如不熟悉加密算法,强烈建议先在相关知识点的密码学中完整学习,不然很多地方是看不懂的)

一、目标网站分析

打开开发者工具,清空其他包后,能看到这里大概是个ajax请求,我们点击其他页数:​,能看到对应的数据包刷新:

​直接将其copy到Convert curl commands to Python,并复制粘贴到py,再加上下面俩行测试下:

data = response.json()
print(response.text)

​很明显返回的data数据被加密了。首先我们观察下这个Data:

大概猜测它是base64编码(里面有+和/这俩特殊符号),对它进行b64解密逻辑复现:

# base64编码
encrypt_data_bytes = base64.b64decode(data['Data'].encode())
print(encrypt_data_bytes)

发现还是密文,这时我们基本可以确定:这是AES/DES加密算法。心里大概有底后,开始寻找key/iv(AES加解密必需的俩参数)。

二、解密逻辑

先来完成这个解密逻辑,逆向掉这个加密参数。

1.网站JS分析

既然都猜到这是AES算法了,咱也别客气,直接搜一下:

​哎,这不正好搜到了一个好地儿:旁边还有iv,mode,而且还有个大大的decrypt,不是这还能是哪?开始断点并按其他页刷新:

很明显被传入的t就是那个加密密文,其中r["e"]是key,r["i"]是iv,​我们分别将这两个取出

(key与iv可能有动态算法,此处是经动态调试后发现二者均为静态所以能直接用),

之后开始进入py算法

2.py算法复现

# 浏览器代码复现
key = b'EB444973714E4A40876CE66BE45D5930'
iv = b'B5A8904209931867'
aes = AES.new(key, AES.MODE_CBC, iv)
contents = json.loads(unpad(aes.decrypt(encrypt_data_bytes), 16).decode())# json.loads是将json格式的字符串转化为py对象的字典
print(contents)

看到没问题,顺便将我们想要的内容取出下:

for i in contents['Table']:print(i['NAME'])

搞定。

但咱能开心了吗?并不行。

我们的确完成了解密逻辑的破解,但这个加密算法并没有解决。这一页的数据是取到了,那其他页的数据呢?想要批量爬取每一页的数据,还是得干掉这个加密参数。收拾收拾,我们开始搞加密。

三、加密逻辑

一般处理网页算法逻辑有两种做法:扣JS/PY算法复现

通常来讲扣JS会简单点,不需要理解所有的js代码逻辑。而PY算法逻辑复现需要对大部分关键点js代码逻辑做具体分析。

这里我们选择py算法复现

1.网站JS分析

回到网站处,我们再分析下网站请求参数里哪些是比较特殊的:

​json_data里这个一眼时间戳,好处理,暂时不用管。

​哎,你看headers里这个portal-sign,又有sign长的还像个加密参数(一眼md5),不搞它还能搞谁?开搜:

​正好就这一处位置也省的再找了。

断住这行(它都写赋值headers并且这么大个getSign了,百分之八百是这)

看看getSign的上层栈点:

看到后先把这个return断了

大概看下这段代码的逻辑:

for一行用于遍历t(t就是传入的载荷参数),并且判断,如果某个t的值为false,那么去除

所以之后的t中的空值都被去除了。

这样的t再被传入u(),正常来讲我们要接着分析u(),但别急,我们看下u(t):

发现这里u(t)就是把所有t的键值拼接到一块,那就正好不用慢慢分析u()了。

接着再看r['a']:​发现这就是个固定字符串,

由上得到了n,再看这个s(),调栈点到其上层:

就是很正常的md5算法,把之前这个n放进来了而已。

算法已经理解完成,接下来进py复现js逻辑即可。

2.py算法实现

t = int(time.time() * 1000) # 时间戳def get_sign():# 排序sorted_items = dict(sorted(json_data.items()))a = ''for key_, value_ in sorted_items.items():if not value_:continuea += key_ + str(value_)# 合并b = 'B3978D054A72A7002063637CCDF6B2E5'c = b + a# 加入MD5obj = md5()obj.update(c.encode('utf8'))data_ = obj.hexdigest()return data_my_sign = get_sign()

再把my_sign与时间戳放到对应位置,运行:

​如图,加密算法逆向完成。

这里讲解一下排序的逻辑:

观察之前js代码中我们提到的t(json_data),发现它的排序是按照ASCII,也就是从a-z,而原本的json_data并非这种排序:

这是因为字典本身就是无序的,所以我们才需要上面的排序逻辑,把字典排好位置才能进行之后的拼接。

四、完整逻辑构建与数据抓取

加解密逻辑都完成,剩下的逻辑就很简单了:
写一个for循环,并依次改变打印的每个载荷(pageNo)作为变动的页码即可。同时别忘加个time.sleep降低点请求频率,咱要做个礼貌爬虫!

for i_ in range(1, 21):# 之前代码放于此处print(f'正在打印第{i_}页...')for i in contents['Table']:print(i['NAME'])time.sleep(random.uniform(0.4, 0.7))
print(f'打印完成!一共打印20页!')

​至此,逆向完成。

五、小结

这个案例难度尚可,非常适合刚接触js逆向的新人练手。推荐看完本文后立刻上手自己复刻一遍操作。本案例代码已经放到github上了,欢迎点赞收藏本文并star我的仓库!后续js案例仍会继续更新,想持续学习其他案例的不妨给我个关注吧。


http://www.hkcw.cn/article/ZWXUCqPnqh.shtml

相关文章

Mask_RCNN 环境配置及训练

目录 一、Mask_RCNN代码及权重 1、源码下载 2、权重获取 二、环境配置 1、创建虚拟环境 2、安装必要的包 三、测试环境 1、使用coco 2、使用balloon 四、测试 1、使用coco 2、使用balloon 一、Mask_RCNN代码及权重 均从github获取,以下是相关链接&#…

72.编辑用户消息功能之前端实现

大体设想 我想实现的一个功能是在用户发出的消息下面有一个图标是编辑,按下那个图标之后,用户可以修改对应的那个消息,修改完成点击确认之后,用户下面对用的那个AI的回答可以重新生成 之前已经介绍了后端实现,这篇博…

第303个Vulnhub靶场演练攻略:Thales1

Thales1 Vulnhub 演练 “Thales”是 Vulnhub 上的夺旗挑战赛。MachineBoy 开发了这款机器,功不可没。https://www.vulnhub.com/entry/thales-1,749/在本教程中,我们将学习如何利用 Tomcat 应用程序管理器实例中的漏洞获取系统访问权限,以及如…

vscode + cmake + ninja+ gcc 搭建MCU开发环境

vscode cmake ninja gcc 搭建MCU开发环境 文章目录 vscode cmake ninja gcc 搭建MCU开发环境1. 前言2. 工具安装及介绍2.1 gcc2.1.1 gcc 介绍2.1.2 gcc 下载及安装 2.2 ninja2.2.1 ninja 介绍2.2 ninja 安装 2.3 cmake2.3.1 cmake 介绍2.3.2 cmake 安装 2.4 VScode 3. 上手…

GNSS终端授时之四:高精度的PTP授时

我们在GNSS终端的授时之三:NTP网络授时中介绍了NTP网络授时的基本原理。我们知道了NTP授时的精度跟网络环境相关,即使在局域网中NTP授时的精度也只能到ms级别。如果广域网,经过多级交换机,路由器,由于传输路径和延时的…

Amazon Augmented AI:人类智慧与AI协作,破解机器学习审核难题

在人工智能日益渗透业务核心的今天,你是否遭遇过这样的困境:自动化AI处理海量数据时,面对模糊、复杂或高风险的场景频频“卡壳”?人工审核团队则被低效、重复的任务压得喘不过气?Amazon Augmented AI (A2I) 的诞生&…

OS10.【Linux】yum命令

目录 1.安装软件的几种方法 直接编译源代码,得到可执行程序 使用软件包管理器 2.yum yum list命令 参数解释 yum install命令 yum remove命令 下载链接存放的位置 扩展yum源 实验:安装sl小火车命令 sl命令的选项 方法1:man sl 方法2:读源代码 3.更新yum源 查看…

网络协议的原理及应用层

网络协议 网络协议目的为了减少通信成本,所有的网络问题都是传输距离变长的问题。 协议的概念:用计算机语言来发出不同的信号,信号代表不同的含义,这就是通信双方的共识,便就是协议。 协议分层(语言层和…

【计算机网络】第3章:传输层—可靠数据传输的原理

目录 一、PPT 二、总结 (一)可靠数据传输原理 关键机制 1. 序号机制 (Sequence Numbers) 2. 确认机制 (Acknowledgements - ACKs) 3. 重传机制 (Retransmission) 4. 校验和 (Checksum) 5. 流量控制 (Flow Control) 协议实现的核心:滑…

RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加:就是在一张图片上放上自己想要的图片,如LOGO,时间等。有点像之前提到的OSD原理一样。例如:下图一张图片,在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…

Java流【全】

IO流分类 AA、根据数据流动的方向:输入流和输出流 如:打开一个新的记事本并输入一些内容,而这些内容是在内存里面的,没有存储到磁盘中,当点击保存之后,数据才会从内存流向磁盘;当双击打开磁盘文件的时候,数据才会从磁盘流向内存【数据存储有一个特点:内存一旦断电数…

大模型登《情报学报》!大模型驱动的学术文本挖掘!

武汉大学信息管理学院、武汉大学信息检索与知识挖掘研究所的陆伟、刘寅鹏、石湘、刘家伟、程齐凯、黄永和汪磊共同研究的《大模型驱动的学术文本挖掘——推理端指令策略构建及能力评测》在《情报学报》中发表。论文以学术文本挖掘任务为切入点,构建涵盖文本分类、信…

UI 设计|提高审美|极简扁平过时吗?

​在做UI界面时,极简扁平一直是个稳妥又高适配的选择。它没有复杂的质感和装饰,更强调清晰、直接和功能导向,能快速搭建出干净、有秩序的界面,适合大多数场景落地。 但是也确实有太多太相似的极简导致确实辨识度,这中…

哈尔滨工业大学提出ADSUNet—红外暗弱小目标邻帧检测新框架

ADSUNet: Accumulation-Difference-Based Siamese U-Net for inter-frame Infrared Dim and Small Target Detection 作者单位:哈尔滨工业大学空间光学工程研究中心 引用: Liuwei Zhang, Yuyang Xi, Zhipeng Wang, Wang Zhang, Fanjiao Tan, Qingyu Hou, ADSUNet: A…

#14 【Kaggle】 Drawing with LLMs 金牌方案赏析

用大模型画svg的比赛结束了,本来还是银牌的,shake down成了铜牌… 痛定思痛,瞻仰一下第一名的金牌解决方案。 🍕 比赛简单介绍 给定一段描述图像的文本提示,你的任务是生成可缩放矢量图形(SVG)代码,将其尽可能准确地渲染为一幅图像。 本次竞赛旨在构建既实用又可复用…

多任务——进程

1.进程的介绍 1. 进程的基本概念 在 Python 中,进程是操作系统分配资源和调度的基本单位,代表一个独立的程序执行实例。Python 的 multiprocessing 模块支持多进程编程,允许在单个程序中并行运行多个进程。每个进程拥有: 独立的…

Baklib加速企业AI数据治理实践

企业知识中台构建路径 在数字化转型进程中,企业需通过知识中台实现知识资产的系统性整合与价值释放。Baklib作为典型解决方案,以智能化技术为支撑,通过标准化数据接口打通CRM、ERP等异构系统,构建全域知识图谱。其核心实施路径包…

设计模式——状态设计模式(行为型)

摘要 状态设计模式是一种行为型设计模式,核心在于允许对象在内部状态改变时改变行为。它通过状态对象封装不同行为,使状态切换灵活清晰。该模式包含环境类、抽象状态类和具体状态类等角色,具有避免大量分支判断、符合单一职责和开闭原则等特…

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)

1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性,搜索schema,agg,表达式搜索映射,本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为…

【项目记录】登录认证(上)

前面已经实现了部门管理、员工管理的基本功能,但并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以这次的主题就是登录认证。最终要实现的效果是: 如果用户名密码错误,不允许登录系统。 如…