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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 现在很多项目都进行了签名校验或者是使用例如RSA的方式对传输流量进行加密,那么我们可以通过本地的动态调试获取程序的加密逻辑、加密方法,从而绕过系统的防护对系统进行测试

首先我们先来看一下,下面这张图是笔者近期测试遇到的问题,那就是程序每次生成请求都会生成signature的验签,该验签生成方式暂不可知,唯一知道的就是用一次就失效,这对测试的成本造成了很不好的影响,那么我们想要突破防护,最起码也要知道,这个signature是怎么生成的,他的算法是什么?

图片.png暂且忽略加密,因为实际上网站后面的内容加密部分并不多,我们主要是突破requestid、signature即可;想要知道requestid的生成、signature的生成,我们就需要对程序进行动态调试,动态调试我们建议使用google浏览器,火狐浏览器会出现卡顿......

首先F12打开调试器,然后全局搜索signature即可

图片.png

双击选中的结果,然后代码格式化一下

图片.png

CTRL + F 在当前app.xxx.js文件内再次搜索signature关键字,寻找我们觉得像的

图片.png

此时,我们发现有个东西很像了

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

我们直接在这里打断点看看

图片.png

我们暂时无视上面的值,我们直接定位到这个代码的位置,该代码由多个函数组成,我们可以在控制台看一下他们是干什么的

首先看一下e里的内容

图片.png

可以看到,e.headers里是没有signature的,说明此时signatuer还没来得及生成

图片.png

图片.png

继续程序(F10),观察signature

图片.png

图片.png

此时signature生成,说明我们的断点没问题;

此时回顾一下整个函数内容

图片.png

我们拆分一下函数内容,首先是c   c现在是一个数组类型,暂时里面包含了两个内容,一个是URL一个是Requestid;这两个是怎么来的我们稍后看;

c.join(“;”)   是将两个字符串拼接,用分号分割

encodeURIComponent(c.join(";"))   其实就是将特殊符号抓换成url编码,这样json类型就变成了字符串类型了

最后一步,u["a"](encodeURIComponent(c.join(";")))    u[“a”]()是关键函数,这个函数将收到的两个字符串合并在一起进行加密,最后生出了signature这个东西,但是我们并不知道里面的算法是什么

但是看他的位数,我们可以猜测大致的算法,这里推荐大家可以去调试,也可以猜解

随便打开一个在线的sha1加密,将我们拿到的字符串放进去,发现生出来的值与调试器里的验签值是一样的,那么我们可以确定,程序是sha1加密的

图片.png

获取到了算法,我们接下来就需要知道,c的值是怎么来的(就是URL/Request),因为该程序会根据不同的场景,即登陆前、登录后(登陆后产生token)、有body和无doby

因为我们知道,关键的参数其实就是c,恰巧我们看到了程序上面有很多的c.push 看字面也能才出来这是再往里面加参数,所以这里可以将所有的c.push打断点图片.png

此时重新走一遍,这一次我们将分为3个场景对程序进行调试

登陆前

登录后

存在token且有body参数

登陆前的调试,我们需要确定requsetid、url怎么来的

图片.png

第一步,程序首先生成了一个l ,这个l 其实就是数据包请求中的requestid;大家可以跟进这个d[“w”]()函数,核心代码如下,大家如果不知道是干啥的也不要紧,现在chatgpt这么现金,大家可以直接把代码粘进去生成一个python代码就行,这个代码其实就是生成requestid的,在python中有一个标准的库,uuid库

图片.png

此时第一个被压入的就是l 也就是我们随机生成的requestid

图片.png

图片.png

我们步过后,此时程序进入下一步

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

图片.png

图片.png

图片.png

图片.png

我们现在查看一下c的内容

此时c里有3条,分别是requestid、body、url

图片.png

c.sort() 其实就是将c重新排序

图片.png

图片.png

我们发现此时的顺序是

url  +  requestid  +  body

对应程序的就是

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

最后回到

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

图片.png

图片.png

我们可以看出来,正如我们所想的那样,那么这个时候我们就可以看到,signature生成规则如下

图片.png

这里面没有看到token,不过不要紧,我们现将登录请求通过,然后再看看登录后的请求

登录后生成token后,我们直接略过前面的调试过程

c.push(l)

Object(d["i"])()    获取token

图片.png

图片.png

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

图片.png

图片.png

c.push(t.queryVal(a))

图片.png

一直走到e.headers.signature

图片.png

c.sort()

图片.png

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


图片.png

图片.png

至此,全部捋顺

sha1(URL + token + requestid + body)

图片.png

图片.png

带token、带body

图片.png

图片.png


写在末尾:

致谢:AirSky  

感谢来自实验室的好兄弟的指点

本文由AirSky  、Vlan911联合输出

相关文章
|
6月前
|
前端开发
调试前端时,在浏览器上修改参数并重新调用接口
有时候我们的页面点击过了,但是接口出问题,想修改参数再调用一次,一般是用apiPost工具把接口复制,再加上token和参数,但是这样非常的效率比较低。
678 0
|
6月前
|
缓存 前端开发 JavaScript
【第22期】 一文读懂前端调试利器whistle
【第22期】 一文读懂前端调试利器whistle
124 0
|
6月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
1113 1
|
5月前
|
JSON 前端开发 JavaScript
前端上传文件前校验文件数据
该文介绍了如何在Vue项目中实现批量导入Excel数据的校验。使用Element UI的`el-upload`组件上传文件,通过FileReader读取内容,结合XLSX库解析Excel为JSON。解析过程包括将二进制数据转换为workbook对象,提取worksheet并转化为JSON。之后,遍历JSON数据进行字段校验,若发现空值则记录错误。提供的Demo展示了选择Excel文件后控制台显示校验结果。技术栈包括vue 2.6.14、element ui 2.15.14和xlsx 0.17.0。建议将此类功能封装为通用组件以复用。
99 2
前端上传文件前校验文件数据
|
3月前
|
前端开发 JavaScript 数据安全/隐私保护
前端JS正则校验密码之3种实现方式
这篇文章展示了三种使用JavaScript正则表达式来校验密码的方法,密码需要满足包含大写字母、小写字母、数字及特殊字符,并在8到16位之间,同时提供了示例代码和实现效果。
100 1
前端JS正则校验密码之3种实现方式
|
4月前
|
前端开发 JavaScript 开发工具
前端优化之路:git commit 校验拦截
前面在git分支规范那篇文章里,介绍了commit提交规范,但是想要做到高效落地执行,就需要做些别的功课。
|
4月前
|
Web App开发 前端开发 JavaScript
前端必备的浏览器调试技巧
【7月更文挑战第18天】 Chrome开发者工具是前端调试的关键,包括快捷键Ctrl+Shift+I/Cmd+Option+I打开它,DOM和CSS调试如编辑元素、样式,JS调试如断点、条件断点和监视变量,网络请求分析,性能评估如Lighthouse和性能面板,及截图、模拟设备等实用技巧,助力开发者提升效率。
125 1
|
4月前
|
开发框架 前端开发 JavaScript
在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理
在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理
|
4月前
|
Web App开发 存储 监控
如何使用 Chrome DevTools 进行前端性能监控和调试?
如何使用 Chrome DevTools 进行前端性能监控和调试?
|
4月前
|
前端开发 JavaScript
前端 JS 经典:函数签名
前端 JS 经典:函数签名
44 0