记一次很普通的签名校验破解

前言

在漏洞挖掘中经常会遇到 sign (签名) sign的出现是为了防止数值的篡改,但是身为学习安全,我们就是要进行篡改,不能改的地方我们偏要改 233

签名校验

首先在知道签名校验之前,我们需要思考为什么会出现签名校验这个东西,签名校验出现的目的就是为了防止url中的参数被修改,如果在一些特定的接口中我们不进行签名的校验很有可能就会存在安全问题(当然就算设置了签名校验我们也是可以破解和绕过的就是比正常的要复杂一些)
据一个例子:
首先我们假设 这个idcode=1001这个参数可以获取对应的id的用户的个人信息
https://www.xxxx.com?idcode=1001
那么如果我们把idcode这个参数进行一个遍历那么我们是不是就可以做到水平越权了
所以为了防止这种情况我们会进行一个签名的添加,我们可以对参数进行一个整合然后加入我们自己设定的密钥
例如
idcode=1001&key=secret-hahahah
然后再做一个md5加密生成一个签名校验,这样的话我们发到服务端,服务端可以对我们的参数进行一个加密然后比对参数加密之后的数值和签名是否一致从而判断参数有没有被进行修改
例子如下:
https://www.xxxx.com?idcode=1001&sign=2bc6ffb03b1acea0c053a24bbf3f0f69
附上图片:

红框部分就是我们的secret啦
但是但是但是!!!重要的事情说三遍
这样还是存在安全性问题的!如果我们这个链接没有对时间进行一个校验那么黑客只要获取了这个链接那么就一直有效了!
所以我们需要在之前对基础上加一个timestamp(时间戳)然后服务器那边判断的时候会将时间进行一个比对以此来判断这个请求包是否在合法时间范围内
https://www.xxxx.com?idcode=1001×tamp=1584713406
然后我们在对前面的参数进行一个排序然后在最后面加上我们的key然后在md5加密就可以了
https://www.xxxx.com?idcode=1001×tamp=1584713406&sign=a057a10cc979b52a3b78e53cd63e9f40
加密过程如图

签名校验一般是这样的
先对参数进行一个获取
a=1&c=2&b=3
然后进行一个简单的排序
a=1&b=3&c=2
然后在最后加上我们自己的secret-key
a=1&b=3&c=2&key=nibuzhidaolalalala
最后把这个整体进行一个md5加密生成签名跟在url参数中一般是
&sign=xxxxxxxxxx跟在后面比较多

签名校验的破解

前面刚刚讲过签名校验的安全性现在就来破解刺不刺激233
毕竟搞安全的嘛 总要想方设法搞事情对不对哈哈
好的那么我们直接上手例子来看
对某src的页面进行一个抓包

有sign呢! 干他就完事了!奥力给
首先我们需要知道既然我们数据包传输过程中sign已经存在那么说明sign的生成肯定是前端的js的功劳了!所以我们需要找到对应的js文件(有时候这是一个漫长的过程)

那么正常情况下我们如何进行定位呢
通常使用 crtl + f 进行全局搜索 搜索encrypt 类似的词有可能就会比较快的定位到对应的代码位置,这里我是直接搜索md5来进行一个定位的,因为之前的数据包里面有个alg=md5这个参数

这里我把代码弄到本地了因为白天一直在捣鼓(因为思路错了一直尝试把代码看明白,代码又是通过压缩的所以浪费了很多时间)

红框部分是关键的代码,这里他将参数进行了一个排序然后加上key
这里可以看到这里的key就是secret-haha 我一开始还以为是假的233(愚蠢的自己)
然后本地终端使用node来进行重现

总结

虽然最终步骤很简单但是过程中陆陆续续的遇到了很多困难,一开始由于js代码被压缩所以一直在尝试阅读js代码,但是非常的吃力,好再后面看了一些大师傅的文章,重新改变了方向,然后多尝试了几次总算是出来了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注