声明:本文仅限学习交流使用,禁止用于非法用途、商业活动等。否则后果自负。如有侵权,请告知删除,谢谢!本教程也没有专门针对某个网站而编写,单纯的技术研究
案例分析
目标案例:aHR0cDovL2JhY2t0ZXN0LjEwanFrYS5jb20uY24vYmFja3Rlc3QvYXBwLmh0bWwjL215c3RyYXRlZ3k=
1.对应参数和接口
滑块接口
滑块处理完之后的接口
加滑块提交的接口
参数分享
首先我们来查看那个只有一个参数的接口,老规矩上搜索大法
通过点击登录之后发现到这里已经生成了,那么我们往上看可以看到thsencrypt.encode是对我们输入的东西进行的加密
这里可以看到他是对账号进行了rsa加密, rsa的key是那个b长度是c,之后在进行了hex2b64, hex2b64我是直接扣下来的,这玩意可以看下自己还原下
可以看到这里就已经对上了,到这里第一个参数就已经搞定了,那么我们继续往下看
那么我们来看第二个接口,还是搜索大法下断点
这里可以看到,密码是对我们输入的密码进行了md5然后在进行了rsa之后进行hex2b64
这里可以看到它是对密码和账号进行的加密
我们往下跟可以看到通过对之前返回的数据和入参进行了sha256,可通过python还原
这里可以看到是对第一次返回的数据进行了base64解码后进行的getStrXOR,这个我是扣下来的
通过对n值和密码的md5和dsv的sha256进行的sha256加密在进行getStrXOR最后在进行编码然后在走一边thsencrypt.encode,嵌套的加密有点多哈
到这里基本所有的加密都已经搞定了,那么我们来看滑块、第一次是请求缺口,第二次是校验,入参都是在请求滑块接口里面可以找到,那么我们来看phrase就行
这里可以看到,没什么加密哈
难点就到这里就全部结束了,在dologinreturnjson2里面的入参讲解
Hexin-V有点小坑如果不带上它你登录请求不到,通过分析发现他是cookie中的值
通过hook技术可以看到
可自行分析下,进行寻找
本期滑块和登录结合的入门案例到这里就结束了,我们下期见!!!
拜拜!!!
效果展示
部分js代码分享
const crypto = require('crypto');
const md5 = require('md5');
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
, b64padchar = "=";
function hex2b64(b) {
var a, c, d = "";
for (a = 0; a + 3 <= b.length; a += 3)
c = parseInt(b.substring(a, a + 3), 16),
d += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
a + 1 == b.length ? (c = parseInt(b.substring(a, a + 1), 16),
d += b64map.charAt(c << 2)) : a + 2 == b.length && (c = parseInt(b.substring(a, a + 2), 16),
d += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4));
for (; 0 < (d.length & 3); )
d += b64padchar;
return d
}
function getStrXOR(e, t) {
for (var n, s = e.length, r = t.length, o = "", d = 0; d < s; d++)
n = d % r,
o += String.fromCharCode(e.charCodeAt(d) ^ t.charCodeAt(n));
return o
}
function hmac_(keys, values) {
const hmac = crypto.createHmac('sha256', keys);
hmac.update(values);
return hmac.digest('hex')
}
function encodeDataSaltOnce(e, t, n, ssv, dsv) {
n = getStrXOR(atob(ssv), n).toString();
n.split("$")[1];
n = n.split("=")[1];
n = getStrXOR(hmac_(n.toString(), md5(e).toString()), dsv);
return btoa(n);
}
console.log(encodeDataSaltOnce('1231', "12312312343", 'ed32b85f205edd7090065e2012537c484d1a90d65a702f1011853e0deb69eb71', "QQxeUwEVXQdBWAdQUkBcVUANZ2VDE2ZgUl55fn0zZWBNCHI3V2g", "ee690f22f66d7666de70f45158c0997452bf9bdbd0d1137d78d4ca1bda2224bd"))