解决TOKEN已过期,TOKEN加密的js逆向模拟
逆向目的
‘{“code”:10004,“count”:null,“data”:null,“message”:“TOKEN已过期”}’
逆向过程
网址
https://jzsc.jst.zj.gov.cn/PublicWeb/index.html#/company
翻页网址
打断点
翻页
在该断点之前,token参数已经生成,因此在call stack里从上往下找token的生成方法
token=s,因此分析s的生成过程
i是一个时间戳
进入上图选择p.b里的这个app.28f742b的js文件,到以下加密的位置
utf8(unicode编码)
密码 *
255B675CDF21B04F923992E0E9F4A498
偏移量 *
255B675CDF21B04F
模式 *
CBC
填充 *
Pkcs7Padding
编码 *
Base64
AES加密
在线工具
https://www.ssleye.com/ssltool/aes_cipher.html
推荐一个加密博客
结果一致,说明token就是一个用AES加密的时间戳。
用js模拟出来就行
pip install PyExecJS
在node环境安装加密解密库crypto-js
npm install crypto-js
出现如下结果则安装成功
added 1 package, and audited 2 packages in 1s
found 0 vulnerabilities
var CryptoJS = require('crypto-js');var a = new Date;
var i = new Date(a).getTime().toString()// 一定要用utf8生成密钥,不然无法用java解密
// 长度128bit,192bit,256bit之一
var key = CryptoJS.enc.Utf8.parse('255B675CDF21B04F923992E0E9F4A498');
var iv = CryptoJS.enc.Utf8.parse('255B675CDF21B04F');
var cipher = CryptoJS.AES.encrypt(i, key, {iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
console.log(cipher.ciphertext.toString(CryptoJS.enc.Base64));
token1=cipher.ciphertext.toString(CryptoJS.enc.Base64)
import execjswith open('aestest.js', 'r', encoding='utf-8') as f:data = f.read()
docjs = execjs.compile(data) #用execjs编译返回的js代码
res = docjs.eval('a')
print(res)
res1 = docjs.eval('i')
print(res1)
token1 = docjs.eval('token1')
print(token1)
2022-10-03T11:01:17.582Z
1664794877638
JxietRwOtUgDB5g7HGRFNg==
import execjswith open('aestest.js', 'r', encoding='utf-8') as f:data = f.read()
docjs = execjs.compile(data) #用execjs编译返回的js代码
res = docjs.eval('a')
print(res)
res1 = docjs.eval('i')
print(res1)
token1 = docjs.eval('token1')
print(token1)import requestscookies = {'Hm_lvt_a499288f9faf7b5e5c13c17092030489': '1663830112,1664503799,1664759096','Hm_lpvt_a499288f9faf7b5e5c13c17092030489': '1664760677',
}headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'no-cache','Connection': 'keep-alive','Content-Type': 'application/json','Origin': 'https://jzsc.jst.zj.gov.cn','Pragma': 'no-cache','Referer': 'https://jzsc.jst.zj.gov.cn/PublicWeb/index.html','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-origin','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36','X-Requested-With': 'XMLHttpRequest','sec-ch-ua': '"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','token': token1,'x-forwarded-for': '192.168.1.1',
}params = (('appKey', 'c9406731-50bc-4e23-b3f5-b7e7d3093875'),('time', '1628557817533'),('sign', '/OZ2b8tUcAgLQitEwk3Q3w=='),
)data = '{"CertID":"","EndDate":"","Zzmark":"","City":"","COUNTY":"","pageIndex":7,"pageSize":10}'# response = requests.post('https://jzsc.jst.zj.gov.cn/publishserver/ZJJGManagerWebApi/api/EnterpriseInfo/GetEnterpriseInfo', headers=headers, params=params, cookies=cookies, data=data)#NB. Original query string below. It seems impossible to parse and
#reproduce query strings 100% accurately so the one below is given
#in case the reproduced version is not "correct".
response = requests.post('https://jzsc.jst.zj.gov.cn/publishserver/ZJJGManagerWebApi/api/EnterpriseInfo/GetEnterpriseInfo?appKey=c9406731-50bc-4e23-b3f5-b7e7d3093875&time=1628557817533&sign=%2FOZ2b8tUcAgLQitEwk3Q3w%3D%3D', headers=headers, cookies=cookies, data=data)
print(response.text)
{“code”:200,“Message”:“响应成功!”,“data”:[{“LEGALMANNAME”:“郑经杰”,“SCUCODE1”:“91330110MABXB6NR02”,“CORPCODE1”:“91330110MABXB6NR02”,“CORPNAME”:“杭州宜杰劳务有限公司”,“CITY”:“杭州市”,“COUNTY”:“余杭区”,“OPINIONDATETIME1”:“2022-09-15”,“OPINIONDATETIME”:“2022-09-15”,“SCUCODE”:“VrTPfdoWFT+IZnyhNj7WFOw7aQ1AMoCf35Wln/JVS1w=”,“CORPCODE”:“VrTPfdoWFT+IZnyhNj7WFOw7aQ1AMoCf35Wln/JVS1w=”},{“LEGALMANNAME”:“陈世清”,“SCUCODE1”:“91330802MABXUN3H12”,“CORPCODE1”:“91330802MABXUN3H12”,“CORPNAME”:“衢州盛珩建筑劳务有限公司”,“CITY”:“衢州市”,“COUNTY”:“柯城区”,“OPINIONDATETIME1”:“2022-09-14”,“OPINIONDATETIME”:“2022-09-14”,“SCUCODE”:“9Qt7qWyfxVWXjcEwsu+uTQm3v6etpnueasST/OjAncM=”,“CORPCODE”:“9Qt7qWyfxVWXjcEwsu+uTQm3v6etpnueasST/OjAncM=”},{“LEGALMANNAME”:“方小龙”,“SCUCODE1”:“91330122MABWFBC04Q”,“CORPCODE1”:“91330122MABWFBC04Q”,“CORPNAME”:“杭州红龙建筑劳务有限公司”,“CITY”:“杭州市”,“COUNTY”:“桐庐县”,“OPINIONDATETIME1”:“2022-09-14”,“OPINIONDATETIME”:“2022-09-14”,“SCUCODE”:“L5brDXNHm+2doJw9eK7FKrlDWaHlw1zcvHd82DK8ERA=”,“CORPCODE”:“L5brDXNHm+2doJw9eK7FKrlDWaHlw1zcvHd82DK8ERA=”
Process finished with exit code 0
补充说明
这里为什么没有用扣JS的方法,是因为jquery前端框架把js打包成webpack这种类型,导致这里函数依赖太多,扣起来太麻烦,因此既然知道加密的生成过程,因此用crypto-js模拟就行。
解决TOKEN已过期,TOKEN加密的js逆向模拟相关推荐
- 详解token已过期含义及解决方 token过期是否需要重新登录
详解token已过期含义及解决方 token过期是否需要重新登录Web应用和用户的身份验证息息相关,从单一服务器架构到分布式服务架构再到微服务架构,用户安全认证和授权的机制也一直在演进,下文对各个架构 ...
- python爬虫 房天下js逆向模拟登录
js逆向学习后跟着教程第一次实战.目标链接 这次用到的是requests和execjs,execjs主要是用来执行js代码,win系统直接在命令行pip install execjs安装就ok了. 网 ...
- token 过期刷新令牌_token已过期怎么办
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. token已过期的解决方法是: token已过期代表证书等过期的意思.需要重新获取code,然后得到access_token,即要 ...
- JS逆向分析新浪某站登录处RSA加密
文章目录 前言 RSA加解密 核心思想 Pyhon实现 NoPadding 新浪网实战 JS加密分析 JS函数调试 Py调用脚本 BurCrypto爆破 插件介绍 实战案例 总结 前言 在渗透测试过程 ...
- JS逆向 -- 分析某站aid、cid、w_rid和sid的加密过程
接上节课内容 JS逆向 -- 分析某站buvid3和_uuid的加密过程 JS逆向 -- 分析某站b_lsid值加密过程 一.清除cookie信息,刷新网页,ctrl+f搜索sid,这样找到的数据是在 ...
- js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集
点击上方"咸鱼学Python",选择"加为星标" 第一时间关注Python技术干货! 嘿,大家好,截止今天咸鱼零零散散分享爬虫.数据分析基础和 Web 的内容已 ...
- JS逆向之x讯视频wasm的ckey分析
篇幅有限 完整内容及源码关注公众号:ReverseCode,发送 冲 起因 最近对腾讯视频下手了,因为公众号中的视频来源都是腾讯视频,也就是说通过2分钟阅读本文,腾讯视频下整站视频都可以下载下来,也是 ...
- jwt判断token是否过期_前端也得搞懂 JWT 这个知识点
什么是 JWT 概念 JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案. JWT 原理 JWT 组成 JWT 由三部分组成:Header,Payload,Signature ...
- php jwt token刷新方案,解决使用jwt刷新token带来的问题
前后端分离,使用token的方式校验用户信息,我选择了jwt,使用的教程在网上可以找到很多,不做介绍. 这里说明一个使用过程中,最重要的的一个环节刷新token带来的问题. 业务要达到的目标: 用户登 ...
最新文章
- 数据库51年来十八件大事年表
- 蓝桥杯 ALGO-76 算法训练 十进制数转八进制数
- 团队协助 开源项目_适合小团队的协作工具,良心开源项目管理工具
- 【渝粤教育】广东开放大学 建筑专业 形成性考核 (57)
- CODE Unicode roleName_字符类型数据 人物名子
- 离散数学考点之度序列简单图化
- jQuery基础-定位与修改
- SOFTICE之后继有人——Syser
- 半监督分类算法简述,self-trainning,co-trainning
- 漫谈程序员(十二)IT程序猿之猿体是革命的本钱
- 富芮坤FR801xH蓝牙协议栈启动流程和notify实现温度数据主动上传
- 不知道为什么额头上老是长痘痘?
- prometheus搭建
- Ubuntu学习 cut
- ADC0804的使用
- PHP 微信网页授权获取用户信息
- VBA发送email
- 滴滴实时数据链路建设组件选型实践篇
- 春天到了,携程能否春暖花开?
- 简单算法-bellman最短路
热门文章
- WPF 获取DataGrid 控件选中的单元格信息
- Java 大小端转换(基于ByteBuffer)
- 【系统收藏】分析Windows 8系统三种安装方式的利弊
- sql 指定服务器名称,SQL语句实现查询SQLServer服务器名称和IP地址
- python自动化测试错误代码解释,来人救一下啊
- PythonChallenge
- python随机生成八位数密码_五种方法实现python3-随机生成10位包含数字和字母的密码...
- 华为畅享20 Plus和华为畅享20pro 的区别 哪个好
- 支付宝道歉,承认抄了微信小程序文档;谷歌全新 AI 去水印算法 全自动消除水印...
- PNG,GIF,JPG,JPG的区别及如何选用