当前位置: 首页 > ops >正文

JS逆向实战四:某查查请求头逆向解密

声明:本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

网站概要

采集网站:www.qcc.com
逆向任务:破解请求头参数(key和value)
在这里插入图片描述

其他知识点

1.参数拼接

在进行参数拼接的时候,一般有两种方式:urlencode手动构建
urlencode 遵循标准的 URL 编码规范(RFC 3986),而手动构建的版本通常只做简单字符串拼接。
针对该数据data = {'name': 'John Doe', 'age': 25, 'special': '@#$'} 进行处理,对比如下:

urlencode手动拼接
方式urlencode(data)'&'.join(f"{k}={v}" for k, v in data.items())
结果‘name=John%20Doe&age=25&special=%40%23%24’‘name=John Doe&age=25&special=@#$’
空格编码urlencode 将空格编码为 %20手动拼接可能保留空格或错误编码为 +(表单编码风格)
特殊字符urlencode 会编码所有非安全字符(如 !@#$%^&*() 等)手动拼接可能遗漏部分字符的编码
参数值类型处理urlencode` 会自动将非字符串类型(如整数、布尔值)转换为字符串手动拼接需显式转换类型(如示例中的 str(value)
2.JS语法简化

var i = (0, o.default)(t, e.data)等同于var i = o.default(t, e.data)

  • var i = (0, o.default)(t, e.data)作用是调用模块 o 的默认导出函数default,并传入参数 te.data,然后将返回值赋给变量 i。其核心目的是通过间接调用确保函数执行时的上下文(this)与原模块解绑。
  • (0, o.default) 中的逗号操作符会依次执行所有表达式,并返回最后一个表达式的值。这里返回的是 o.default,即模块 o 的默认导出(通常是一个函数)。
  • 直接调用 o.default() 时,函数内的 this 可能指向 o 的上下文。而 (0, o.default) 会先将 o.default 提取为一个独立的函数引用,再通过 (0, o.default)(t, e.data) 调用它。这种写法确保函数执行时的 this 指向全局对象(非严格模式)或 undefined(严格模式),而非原模块 o

网站分析

加密参数定位
1. 确定加密参数

进入企查查网站之后,先登录,在随机搜索一个公司名称,在搜索的时候观察接口响应发现有一个接口是根据输入的内容实时变化的,进一步发现其请求头存在一直变化的key和value值,因此对该对键值对进行分析。
PS:一般,我们通过XHR进行断点分析加密参数,这里就不一一分析,感兴趣的朋友可以自行分析
具体可参考本博客最后参考学习的第一篇链接
在这里插入图片描述

2.确定加密参数的生成位置以及对应文件

知道加密的参数之后,这里直接进行定位搜索。headers[进行搜索,确定加密方式所在位置,并把对应的js文件在源面板中打开,然后开始进行加密分析。
在这里插入图片描述

加密参数分析

以“京东”的分支机构为例进行翻页分析,https://www.qcc.com/api/datalist/branchelist?isNewAgg=true&keyNo=b40ecf6c3e7e4e0414c501f6ce53dd37&pageIndex=2
在这里插入图片描述

  1. 进行断点分析,发现t和n与接口链接有关
    在这里插入图片描述

  2. 进行参数i的分析,需要进一步到o.default函数和a.default函数
    在这里插入图片描述

  3. o.default函数计算,需要传入一个参数e是去掉域名之后的接口链接,得到计算后的值n
    在这里插入图片描述

该函数转换为对应的Python代码为:

def getCodes(e):  codeList = {  "0": "W",  "1": "l",  "2": "k",  "3": "B",  "4": "Q",  "5": "g",  "6": "f",  "7": "i",  "8": "i",  "9": "r",  "10": "v",  "11": "6",  "12": "A",  "13": "K",  "14": "N",  "15": "k",  "16": "4",  "17": "L",  "18": "1",  "19": "8"  }  e = e.lower()  t = e + e  codes = ''  for k in t:  a = ord(k) % len(codeList)  codes += codeList[f'{a}']  return codes
  1. a.default函数计算,其中传入两个参数e和n,相比在o.default函数计算中传入的e,需要拼接一个{},然后再进入到a.default里面,发现是一个HMAC加密算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

借助HMAC加密破解网站发现是hmac的Sha512加密算法,python实现代码如下

def getHmacSha512(key, data):  # 获取十六进制表示的哈希值  hmac_obj = hmac.new(key.encode(), data.encode(), digestmod=hashlib.sha512).digest()  return hmac_obj.hex()

之后在对所得的结果变成小数再截取[8:28]位即可获得i值,用同样的方法可以计算value的值,其中tid,可以通过在控制台输入window.tid获得

arg1 = reqUrl.lower()  
# 获得key的编码值  
arg2 = getCodes(arg1)  
# 通过HMAC算法计算加密后的key的编码值  
key = getHmacSha512(arg2,arg1+'{}').lower()[8:28]  
# 拼接用于计算value的字段  
arg3 = arg1 + "pathString{}" + tid  
# 获得value的编码值  
arg4 = getCodes(arg1)  
val = getHmacSha512(arg4, arg3)

最终结果比对,得到正确的key和value值
在这里插入图片描述
在这里插入图片描述

后续分析使用

后续只需要更换接口和参数接口,其中需要注意参数拼接的时候直接手动拼接而不是使用urlencode否则无法得到正确结果。
在这里插入图片描述

参考教程:

JS逆向入门案例-某查查网请求头-03_抖查查 逆向-CSDN博客该博客通过Python代码的方式进行解密
最新企查查headers动态加密逆向算法 - 亦辰博客该博客通过JS代码的方式进行解密

http://www.xdnf.cn/news/5967.html

相关文章:

  • Java Garbage Collection: 深入解析自动内存管理机制
  • SpringBoot 3.0 开发简单接口
  • 芯片测试之Input Leakage Current(输入漏电流)Test全解析:从原理到实战
  • 火山引擎实时音视频 高代码跑通日志
  • AMS3xxi激光测距仪安装调试维护详解
  • LeetCode 热题 100 105. 从前序与中序遍历序列构造二叉树
  • OpenHarmony轻量系统--BearPi-Nano开发板网络程序测试
  • 图像识别与 OCR 应用实践
  • Spring Security与SaToken的对比
  • 分步启动容器操作指南
  • 一文辨析Java基本数据类型与包装类
  • 日志链路ID配置,traceId多线程不打印什么鬼?
  • 解锁 CPFR 潜力:电商智能补货优化算法的全链路设计与实战指南
  • 特征偏移、标签偏移、数量偏移、概念漂移分别是什么?
  • 不锈钢气动保温V型球阀:专为高粘度、颗粒介质设计的智能控温解决方案-耀圣
  • 【bag of n-grams】 N-gram词袋模型 简介
  • 物联网设备如何与互联网“牵手”
  • CSP认证准备第三天-差分及第36次CCF认证(BFS)
  • 第十七章:Llama Factory 深度剖析:易用性背后的微调框架设计
  • JavaScript实践(三)JavaScript序列化与反序列化深度解析
  • 线性投影层---将输入特征从一个空间映射到另一个空间
  • 【一次成功!】Ubuntu22.04安装cartographer
  • hashicorp vault机密管理系统的国产化替代:安当SMS凭据管理系统,量子安全赋能企业密钥管理
  • 数据擦除标准:1-Pass vs. 3-Pass vs. 7-Pass有什么区别,哪个更好?
  • mysql版本升级常见错误
  • 找客户软件如何实现精准定位?
  • 竞业禁止协议中AI技能限制的深度剖析
  • 【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
  • 如何检测和解决服务器端口被占用的问题
  • #降级监听#PASS THE HASH常见的利用方式#Relay HASH