逆向目的

‘{“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逆向模拟相关推荐

  1. 详解token已过期含义及解决方 token过期是否需要重新登录

    详解token已过期含义及解决方 token过期是否需要重新登录Web应用和用户的身份验证息息相关,从单一服务器架构到分布式服务架构再到微服务架构,用户安全认证和授权的机制也一直在演进,下文对各个架构 ...

  2. python爬虫 房天下js逆向模拟登录

    js逆向学习后跟着教程第一次实战.目标链接 这次用到的是requests和execjs,execjs主要是用来执行js代码,win系统直接在命令行pip install execjs安装就ok了. 网 ...

  3. token 过期刷新令牌_token已过期怎么办

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. token已过期的解决方法是: token已过期代表证书等过期的意思.需要重新获取code,然后得到access_token,即要 ...

  4. JS逆向分析新浪某站登录处RSA加密

    文章目录 前言 RSA加解密 核心思想 Pyhon实现 NoPadding 新浪网实战 JS加密分析 JS函数调试 Py调用脚本 BurCrypto爆破 插件介绍 实战案例 总结 前言 在渗透测试过程 ...

  5. JS逆向 -- 分析某站aid、cid、w_rid和sid的加密过程

    接上节课内容 JS逆向 -- 分析某站buvid3和_uuid的加密过程 JS逆向 -- 分析某站b_lsid值加密过程 一.清除cookie信息,刷新网页,ctrl+f搜索sid,这样找到的数据是在 ...

  6. js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集

    点击上方"咸鱼学Python",选择"加为星标" 第一时间关注Python技术干货! 嘿,大家好,截止今天咸鱼零零散散分享爬虫.数据分析基础和 Web 的内容已 ...

  7. JS逆向之x讯视频wasm的ckey分析

    篇幅有限 完整内容及源码关注公众号:ReverseCode,发送 冲 起因 最近对腾讯视频下手了,因为公众号中的视频来源都是腾讯视频,也就是说通过2分钟阅读本文,腾讯视频下整站视频都可以下载下来,也是 ...

  8. jwt判断token是否过期_前端也得搞懂 JWT 这个知识点

    什么是 JWT 概念 JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案. JWT 原理 JWT 组成 JWT 由三部分组成:Header,Payload,Signature ...

  9. php jwt token刷新方案,解决使用jwt刷新token带来的问题

    前后端分离,使用token的方式校验用户信息,我选择了jwt,使用的教程在网上可以找到很多,不做介绍. 这里说明一个使用过程中,最重要的的一个环节刷新token带来的问题. 业务要达到的目标: 用户登 ...

最新文章

  1. 数据库51年来十八件大事年表
  2. 蓝桥杯 ALGO-76 算法训练 十进制数转八进制数
  3. 团队协助 开源项目_适合小团队的协作工具,良心开源项目管理工具
  4. 【渝粤教育】广东开放大学 建筑专业 形成性考核 (57)
  5. CODE Unicode roleName_字符类型数据 人物名子
  6. 离散数学考点之度序列简单图化
  7. jQuery基础-定位与修改
  8. SOFTICE之后继有人——Syser
  9. 半监督分类算法简述,self-trainning,co-trainning
  10. 漫谈程序员(十二)IT程序猿之猿体是革命的本钱
  11. 富芮坤FR801xH蓝牙协议栈启动流程和notify实现温度数据主动上传
  12. 不知道为什么额头上老是长痘痘?
  13. prometheus搭建
  14. Ubuntu学习 cut
  15. ADC0804的使用
  16. PHP 微信网页授权获取用户信息
  17. VBA发送email
  18. 滴滴实时数据链路建设组件选型实践篇
  19. 春天到了,携程能否春暖花开?
  20. 简单算法-bellman最短路

热门文章

  1. WPF 获取DataGrid 控件选中的单元格信息
  2. Java 大小端转换(基于ByteBuffer)
  3. 【系统收藏】分析Windows 8系统三种安装方式的利弊
  4. sql 指定服务器名称,SQL语句实现查询SQLServer服务器名称和IP地址
  5. python自动化测试错误代码解释,来人救一下啊
  6. PythonChallenge
  7. python随机生成八位数密码_五种方法实现python3-随机生成10位包含数字和字母的密码...
  8. 华为畅享20 Plus和华为畅享20pro 的区别 哪个好
  9. 支付宝道歉,承认抄了微信小程序文档;谷歌全新 AI 去水印算法 全自动消除水印...
  10. PNG,GIF,JPG,JPG的区别及如何选用