JS逆向实战5--JWT TOKEN x_sign参数

2022-12-01,,,

什么是JWT

JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式)。它是在Web环境下两个实体之间传输数据的一项标准。实际上传输的就是一个字符串。广义上讲JWT是一个标准的名称;狭义上JWT指的就是用来传递的那个token字符串

JWT用来做什么?怎么来的?

由于http协议是无状态的,所以客户端每次访问都是新的请求。这样每次请求都需要验证身份,传统方式是用session+cookie来记录/传输用户信息,而JWT就是更安全方便的方式。它的特点就是简洁,紧凑和自包含,而且不占空间,传输速度快,而且有利于多端分离,接口的交互等等

JWT是一种Token规范,主要面向的还是登录、验证和授权方向,当然也可以用只来传递信息。一般都是存在header里,也可以存在cookie里。

爬虫

为什么要介绍jwt呢 因为这次本人爬取的网站就需要token headers里面传了一个x-sign的值

话不多说直接进行分析

抓包分析

由上图可以看到,这个包就是外面所需要的数据

然后看他的请求参数和请求头

由分析可知,我们可以看到 这有些变量是需要我们去伪装的 比如请求体里的时间戳

比如这个x-sign

寻找断点

因为这个headers加密 所以我们直接进入堆栈中找请求参数

我们通过翻页进入断点

由此可知这个确实是请求所需参数 但是x-sign还没由生成

我们不停的打断点 找到这个值

这个过程需要耐心

其实我们如果了解JWT 看到x-sign的值就应该敏感 直接搜JWT 就能搜到

然后再打几个断掉 找到加密参数的地方

分析参数

由上述图所知,我们需要传一个参数进去 ,其他值随笔伪装伪装即可

我们反推参数找到下面这段代码

我们看到这个值 可以确定 是用这个值然后通过md5加密 最后得到Headers的值的

python代码如下:

import hashlib
import time import execjs
import requests session = requests.session() print(client_id)
# 生成node对象
node = execjs.get()
start_time = int(time.time())
end_time = int(time.time() - 365 * 24 * 3600)
ctx = node.compile(open(file="1.js", encoding="utf-8").read()) data1 = '{"pageNumber":2,"pageSize":25,"provinceId":0,"searchType":"TITLE","sourceTimeStart":' + str(
end_time) + ',"sourceTimeEnd":' + str(start_time) + '}' data = f'/purchase/search{data1}'
print(data)
has_sub = hashlib.md5(data.encode('utf-8')).hexdigest() sign = ctx.call("makeJwt", has_sub)
print(sign)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
'x-sign': sign
} response = session.post('post请求地址', headers=headers, data=data1)
print(response.text)

JS逆向实战5--JWT TOKEN x_sign参数的相关教程结束。

《JS逆向实战5--JWT TOKEN x_sign参数.doc》

下载本文的Word格式文档,以方便收藏与打印。