前段时间,一直有身边的朋友问我:小Q啊,你会不会这种js逆向啊,我们最近不知道老大哪根筋搭错了,让我去整这个破玩意,脑袋都有点不太够用了,求解救啊,更多内容首发公众号:Java架构师联盟
那今天我就整理了一下如何完成网站加密参数的逆向分析,通过一个案例来告诉大家,进行js逆向的一个基本思路是什么样子的,本次的网站案例为www.hh1024.com/
背景
前面我们讲过了,网站为什么会设置加密的参数,简单来讲一是加快网站框架的加载速度,二是屏蔽一些低端的爬虫程序,对于无法解密参数构成的程序是无法发起正常的网络请求的。
下面我们就正式开始对该网站的接口进行分析,准备好了嘛?
\
\
接口分析
在分析接口信息之前,首先通过浏览器自带的开发者工具,捕获多个不同的请求。
\
请求参数内容
\
响应数据结果
根据抓包请求显示的内容可以发现,想要获取到榜单数据,则必须要模拟发送请求。
想要模拟发送请求,则必须要先理解每一个参数的含义,其中每次请求会发生变化的参数为sign和timestamp。
经过观察分析之后可以发现timestamp为时间戳,因此我们只需要得到参数sign的加密方式,就能够模拟发送请求。
参数加密分析
在知道需要获取的加密参数之后,通过搜索请求参数的方式找到js加密的位置。
具体的搜索过程如下图所示:
\
搜索过程
依次多所有的请求参数进行搜索之后,可以发现在搜索参数tenant时,搜索返回的结果只有一个。
\
tenant
进入唯一的js文件之后,继续通过ctrl+f搜索tenant可以看到如下的内容:
\
\
可以清楚地看到sign参数的构成成分,下面我们一起简单地分析一下,加密之前的sign由什么内容组成。
首先是参数param,也就是我们这次请求压迫提交的参数,一个键值对格式的数据,然后再拼接了一个时间戳和一个固定的字符H, 得到原始数据之后调用了sha256加密的方式对数据进行了处理。
python模拟加密过程
现在我们已经知道了sign参数的加密方式以及加密的原始内容,接下来我们通过python构造出同样的内容以及同样的加密算法,来检查一下能否完成模拟加密的过程。
import hashlib
H = "kbn%&)@<?FGkfs8sdf4Vg1*+;`kf5ndl$"
param = '{"no":"dy0019","data":{"rankType":5}}'
timestamp = '1613885007548'
# 需要加密参数
encrypt_data = "param=" + param + "×tamp=" + timestamp + "&tenant=1&salt=" + H
hs = hashlib.sha256()
hs.update(encrypt_data.encode('utf-8'))
sign = hs.hexdigest()
print(sign)
根据代码运行的结果,加密后结果与需要验证的sign一致,加密完成。
看到这里,我们的第一篇js网站逆向的内容就结束了,主要给大家分享了,遇到请求参数加密之后,如何冷静地对参数进行分析,以及如何查找参数的加密过程。
想要深入学习可以继续关注,接下来还会更新一系列具体的网站反爬虫的解决方案。
感谢关注~