关于前端动态调试解密签名校验的分享

news2024/9/9 4:00:31

首先我们先来看一下,下面这张图是笔者近期测试遇到的问题,那就是程序每次生成请求都会生成signature的验签,该验签生成方式暂不可知,唯一知道的就是用一次就失效,这对测试的成本造成了很不好的影响,那么我们想要突破防护,最起码也要知道,这个signature是怎么生成的,他的算法是什么?
在这里插入图片描述
暂且忽略加密,因为实际上网站后面的内容加密部分并不多,我们主要是突破requestid、signature即可;想要知道requestid的生成、signature的生成,我们就需要对程序进行动态调试,动态调试我们建议使用google浏览器,火狐浏览器会出现卡顿…
首先F12打开调试器,然后全局搜索signature即可
在这里插入图片描述
双击选中的结果,然后代码格式化一下
在这里插入图片描述
CTRL + F 在当前app.xxx.js文件内再次搜索signature关键字,寻找我们觉得像的
在这里插入图片描述
此时,我们发现有个东西很像了

e.headers.signature = Object(u["a"])(encodeURIComponent(c.join(";"))),

我们直接在这里打断点看看
在这里插入图片描述
我们暂时无视上面的值,我们直接定位到这个代码的位置,该代码由多个函数组成,我们可以在控制台看一下他们是干什么的
首先看一下e里的内容
在这里插入图片描述
可以看到,e.headers里是没有signature的,说明此时signatuer还没来得及生成
在这里插入图片描述
在这里插入图片描述
继续程序(F10),观察signature
在这里插入图片描述
在这里插入图片描述
此时signature生成,说明我们的断点没问题;
此时回顾一下整个函数内容
在这里插入图片描述
我们拆分一下函数内容,首先是c c现在是一个数组类型,暂时里面包含了两个内容,一个是URL一个是Requestid;这两个是怎么来的我们稍后看;
c.join(“;”) 是将两个字符串拼接,用分号分割
encodeURIComponent(c.join(";")) 其实就是将特殊符号抓换成url编码,这样json类型就变成了字符串类型了
最后一步,u["a"](encodeURIComponent(c.join(";"))) u[“a”]()是关键函数,这个函数将收到的两个字符串合并在一起进行加密,最后生出了signature这个东西,但是我们并不知道里面的算法是什么
但是看他的位数,我们可以猜测大致的算法,这里推荐大家可以去调试,也可以猜解
随便打开一个在线的sha1加密,将我们拿到的字符串放进去,发现生出来的值与调试器里的验签值是一样的,那么我们可以确定,程序是sha1加密的

在这里插入图片描述
获取到了算法,我们接下来就需要知道,c的值是怎么来的(就是URL/Request),因为该程序会根据不同的场景,即登陆前、登录后(登陆后产生token)、有body和无doby
因为我们知道,关键的参数其实就是c,恰巧我们看到了程序上面有很多的c.push 看字面也能才出来这是再往里面加参数,所以这里可以将所有的c.push打断点
在这里插入图片描述
此时重新走一遍,这一次我们将分为3个场景对程序进行调试
登陆前
登录后
存在token且有body参数
登陆前的调试,我们需要确定requsetid、url怎么来的
在这里插入图片描述
第一步,程序首先生成了一个l ,这个l 其实就是数据包请求中的requestid;大家可以跟进这个d[“w”]()函数,核心代码如下,大家如果不知道是干啥的也不要紧,现在chatgpt这么现金,大家可以直接把代码粘进去生成一个python代码就行,这个代码其实就是生成requestid的,在python中有一个标准的库,uuid库
在这里插入图片描述
此时第一个被压入的就是l 也就是我们随机生成的requestid
在这里插入图片描述
在这里插入图片描述
我们步过后,此时程序进入下一步

if (c.push(Object(d["i"])()),
e.data && c.push(JSON.stringify(e.data))

不知道这个程序是干啥的,那么就直接放到控制台里
我们可以看出来,此时d[“i”]() 函数返回空,因为token现在是没有的
e.data() 其实就是我们的登录请求数据包体,JSON.string其实就是将数据包转换成了字符串类型
接下来进入到下一步

t.queryVal(f)
t.queryVal(a)

这两步应该是判断,url参数后边有没有东西,比如说 xxx/login?id=1
有的话就会给过滤掉,t.queryVal(a) 就是拿到url
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们现在查看一下c的内容
此时c里有3条,分别是requestid、body、url
在这里插入图片描述
c.sort() 其实就是将c重新排序
在这里插入图片描述
在这里插入图片描述
我们发现此时的顺序是

url  +  requestid  +  body

对应程序的就是

t.queryVal(a)   + d[“w”]()  +e.body && JSON.stringify(e.data)

最后回到

e.headers.signature = Object(u["a"])(encodeURIComponent(c.join(";")))

在这里插入图片描述
在这里插入图片描述
我们可以看出来,正如我们所想的那样,那么这个时候我们就可以看到,signature生成规则如下
在这里插入图片描述

这里面没有看到token,不过不要紧,我们现将登录请求通过,然后再看看登录后的请求
登录后生成token后,我们直接略过前面的调试过程

c.push(l)

Object(d["i"])() 获取token
在这里插入图片描述
在这里插入图片描述

c.push(JSON.stringify(e.data)

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

c.push(t.queryVal(a))

在这里插入图片描述
一直走到e.headers.signature
在这里插入图片描述

c.sort()

在这里插入图片描述

e.headers.signature = Object(u["a"])(encodeURIComponent(c.join(";")))

在这里插入图片描述
在这里插入图片描述
至此,全部捋顺

sha1(URL + token + requestid + body)

在这里插入图片描述
在这里插入图片描述
带token、带body
在这里插入图片描述
在这里插入图片描述
写在末尾:
致谢:AirSky
感谢来自实验室的好兄弟的指点
本文由AirSky 、Vlan911联合输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/841135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

setmap使用

目录 set使用 set的模板参数 构造函数 成员函数 insert iterator ​编辑 find count pair pair 的模板参数 make_pair multiset使用 multiset 的模板参数 set 与 multiset 的区别 count map使用 map 的模板参数 构造函数 insert iterator find ​编辑 cou…

ChatGPT: 人机交互的未来

ChatGPT: 人机交互的未来 ChatGPT背景ChatGPT的特点ChatGPT的应用场景结论 ChatGPT ChatGPT是一种基于大数据和机器学习的人工智能聊天机器人模型。它由国内团队发明、开发,并被命名为Mental AI。ChatGPT的目标是通过模拟自然对话的方式,提供高效、智能…

Zebec 创始人 Sam 对话社区,“Zebec 生态发展”主题 AMA 回顾总结

近日,Zebec Protocol 创始人 Sam 作为嘉宾,与社区进行了以“Zebec 生态发展”为主题的 AMA 对话。Sam 在线上访谈上对 Zebec 路线图、Zebec 质押、NautChain通证进行了解读,并对 Zebec 的进展、生态建设的愿景进行了展望。本文将对本次 AMA 进…

【C++】语法小课堂 --- auto关键字 typeid查看实际类型 范围for循环 空指针nullptr

文章目录 🍟一、auto关键字(C11)🍩1、auto的简介🍩2、auto的使用细则🚩auto与指针和引用结合起来使用🚩 在同一行定义多个变量 🍩3、auto不能推导的场景1️⃣auto不能作为函数的参数…

GD32F103VE窗口看门狗定时器

GD32F103VE窗口看门狗定时器 看门狗定时器(WDGT)有两个: 1,独立看门狗定时器(FWDGT) 2,窗口看门狗定时器(WWDGT) 窗口看门狗定时器开启后,其7位向下递减计数器工作。 当"向下递减计数器"的计数值达到"预设的窗口…

【Unity3D】消融特效

1 前言 选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢弃片元,本文通过 alpha 测试丢弃片元…

Linux中su/su -/sudo的区别

参考Linux中su/su -/sudo的区别 - 知乎 Linux中su/su -/sudo的区别 程序员张同学 ​ 深圳市悦照琉璃科技有限公司 全栈工程师 6 人赞同了该文章 在linux中会经常使用到su/su -/sudo这三个命令,总结一下这三个命令的区别。 su 使用root密码,切换到…

动力节点|Java零基础教程,老杜带你一套通关Java基础

对于零基础自学Java来说,Java的学习过程可能会有一些困难,但只要掌握了相关的基础知识和技能,就可以很快地上手。 Java需要循序渐进而且系统的学习,基础不牢地动山摇,一套全面且适合零基础自学的入门教程,尤…

类的定义

一、定义类 类(class)是用户自定义数据类型。如果程序中要使用类类型,必须根据实际需要定义,或者使用已设计好的类。 class 类名 {成员列表 }; 类可以没有成员,也可以有多个成员。类成员可以是数据或者函数。所有成…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求: 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作。 以下是站点表的建表语句: CREATE TABLE websites (id int(11) NOT N…

动态路由协议 ospf

动态路由协议的分类 rip : 距离矢量路由协议(容易产生环路)ospf: 链路状态路由协议(比较耗费资源,但是链路准确性好)bgp: 外部网关协议 RIP OSPF LSA泛洪 LSDB维护 SPF计算(最短路…

指令重排相关

指令流水线所带来的一些问题 结构冒险 流水线中出现硬件资源竞争 数据冒险 流水线中后面的指令需要等待前面指令完成数据的读写 控制冒险 流水线需要个怒前面指令的执行结果来决定下一步去哪儿之行 为了解决指令流水线的数据冒险所带来的停顿、CPU 搞了个乱序执行。 在遇到数…

关于Godot游戏引擎制作流水灯

先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序(如FL中TB-303的步进灯) FL Studio Transistor Bass

TypeScript 中【class类】与 【 接口 Interfaces】的联合搭配使用解读

导读: 前面章节,我们讲到过 接口(Interface)可以用于对「对象的形状(Shape)」进行描述。 本章节主要介绍接口的另一个用途,对类的一部分行为进行抽象。 类配合实现接口 实现(impleme…

8.7工作总结

一、我们想自定义一个titileBar出现如下这种情况,发现他原来的titileBar还未隐藏。 后来我尝试修改主题使得他没有主题noActionBar发现也不行,后来我参考原先我看过的项目使用了如下代码 this.getActionBar().hide();发现会报这个错误java.lang.NullPoi…

30.基于XML的声明式事务

基于XML的声明式事务 主要是使用XML去代替注解&#xff0c;来实现起到代替注解的作用&#xff0c;实际使用频率很低 将BookServiceImpl.java中的Transactional注解删除&#xff0c;确保用户余额充足 spring-tx-xml.xml <?xml version"1.0" encoding"UTF-8…

Android AccessibilityService研究

AccessibilityService流程分析 AccessibilityService开启方式AccessibilityService 开启原理 AccessibilityService开启方式 . 在Framework里直接添加对应用app 服务component。 loadSetting(stmt, Settings.Secure.ACCESSIBILITY_ENABLED,1); loadSetting(stmt, Settings.Se…

mybatis-plus的update方法,到底会不会更新null值?看这一篇就够了

普通的设置值。需要传入一个Wrapper对象 默认情况下是不会更新null值的&#xff0c;也就是只更新设置值的字段 LambdaUpdateWrapper<OrderChildRoom> orderChildRoomUpdateWrapper new LambdaUpdateWrapper<>();orderChildRoomUpdateWrapper.set(OrderChildRoo…

【PDF密码】PDF文件不能打印,为什么?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…