Sign签证绕过
Sign的简介
Sign是指一种类似于token的东西 他的出现主要是保证数据的完整性,防篡改 就是一般的逻辑是 sign的加密的值和你输入的数据是相连的(比如sign的加密是使用输入的数据的前2位数字配合SHA1 等这样的)
绕过 :碰运气可以置空 最常见的就是找到sign的算法逻辑然后进行反推 (因为这个签证是需要在前端验证的 所以前端有他的生成逻辑)
实验一 认识Sign和他的功能以及基本的绕过方式
靶场环境是 yakit的自带靶场 需要进行下载使用
配置 建议是使用本机的ip 不要使用 localhost 或者127
这个验证第一关
输入内容检测
响应多了点东西 一般不就只有你登录之后判断你的账号密码是否正确 但是这个是首要判断的是 你的签证是否正确
本地抓包
发现荷载 多了几个 sign和key这些数据
根据xhr路径 直接进行搜寻
向上一番找 :
中间涉及到了key但是我们不知道啊 不知道就是搜索就完了
找到原生的key Tostring之后的key是16进制的 但是我们需要的就是 16进制的key所以key就是 3开头的那个 其实调试也可以得出
word是什么 就是我们提交的账号密码啊 这说明sign的一个特点 1、为了保证数据的完整性(一旦我们进行修改 一下账号密码但是使用的是 上一次的 sign 就会报错签名验证失败)
开始模拟 sign的加密逻辑 :根据加密逻辑进行模拟
然后响应包 :
这样其实就是我们可以预知到 sign了 比如我们要进行爆破 密码是xiaodi
我们知道了正确的密码但是如果不知道 sign的话是登录不了的
这样就能预支我们改密码的同时修改sign就可以了
实验二 复杂性的sign加密练习
kaoshibao.com
这个的sign和上边的差别很大
这个sign是在 hppt.header上的 他的作用就是确保这个 考试宝的数据的唯一性 不让进行大规模的改包,发包
像这样的一大串 程序的这样的我们一般就是尝试 xhr断点
就看这个 根据这个 encry的数据进行判断 堆栈中sign的位置
得到sign的算法 :
h = _s()(o + c + r + n + o)
先找参数o
12b6bb84e093532fb72b4d65fec3f00b
c: 类似于等于 cookie中的uu值
值 '1a1db471-e071-4796-babc-ff48ded474dd'
r: r = t.url.replace("/api", "") 也是固定的值
n: n = (new Date).getTime() 使用时间戳
o:12b6bb84e093532fb72b4d65fec3f00b
前面的函数 :
return function(t) {return new Md5(!0).update(t)[e]()}
类似于进行MD5的数据
实际上这个sign的验证就是看看你访问他的这个api是不是实施的这样子其实可以防护 csrf 确保用户数据的完整性 sign是根据cookie进行算法的 所以就和token是一样类型的
总结 :
h = _s()(o + c + r + n + o)
_s() 进行MD5加密
o是固定的值 :12b6bb84e093532fb72b4d65fec3f00b
c是cookie中 uu的数值 :1a1db471-e071-4796-babc-ff48ded474dd
r : /finalCategory/getSecondCatAndThirdSons
n : n = (new Date).getTime() 获取当前的时间戳
让ai帮我们写脚本模拟发包 然后呈现数据的回显 :
拿下了 u8fd0\u7ef4\u4e09\u79cd\u4eba 都是汉字需要对脚本返回的内容进行 utf 加密