首页
社区
课程
招聘
[原创]关于某网站登录请求的分析并解密登录密码
发表于: 2022-5-27 17:26 613

[原创]关于某网站登录请求的分析并解密登录密码

2022-5-27 17:26
613

以下是用户登录密码的加密脚本(在点击登录按钮后,该脚本是从服务器请求回来的,并加密当前用户密码,再将登录名和加密后的密码发送给服务器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function encrypt(g, d) { // g为用户输入的密码,d为session 的值
    var e = string2Bytes(g);
    var c = string2Bytes(d);
    var a = [];
    var f = 1;
    var b = -1;
     f = Math.floor((Math.random() * 256));// 0~255 的随机数
 
 
    var a1 = ((f < 16) ? "0" : "") + f.toString(16);
 
    console.log("e="+e+",c="+c+",f="+f+",b="+b+",a0="+a1);
    a.push(a1); //第一个数是随机数,216进制表示的随机数
    console.log("a="+a);
 
    var i = 1;
    $(e).each(function() {
        if (b < c.length - 1) {
            b++
        } else {
            b = 0
        }
 
        console.log("开始加密")
        var t = c[b];
        var k = this + f;
        console.log(this+","+f+",c["+b+"]="+t+","+(((k) % 255)));
        f = ((k) % 255) ^ t; //0~254 0 ^ 127
 
 
        var add = ((f < 16) ? "0" : "") + f.toString(16);
        console.log("a"+(i++)+"="+add);
        a.push(add);
    });
 
     console.log("a="+a);
 
    return a.join("")
};

以下是解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// LoginPswd = 71a562ba53aa  , seesion = whuwk4uvwt0tkcftktkresk5
var pwd = decrpt('71a562ba53aa','whuwk4uvwt0tkcftktkresk5');
console.log('pwd='+pwd);
//解密
function decrpt(encryptHexStr, keyStr){
    var keyArr = string2Bytes(keyStr);
    var c = string2Bytes(keyStr);
    var b = -1;
    var firstRandom = hex2int(encryptHexStr[0]+encryptHexStr[1]);//第一个随机数
 
    var decrptPwd = [];
    var hex = '';
    for(var i = 2 ; i < encryptHexStr.length ; i+=2){
 
        hex  =     encryptHexStr[i]+encryptHexStr[i+1] ;
 
        var j = hex2int(hex);
        console.log("input="+j);
 
        if (b < keyStr.length - 1) {
            b++
        } else {
            b = 0
        }
        var t = c[b]; //取出要异或的密钥
        var o =  j ^ t ; // 再异或出原来的数
 
        if(o < firstRandom ){
           o = o +255 ; // 由于原来是”((k) % 255)” ,所以简单的补上255 ,逻辑不严谨
        }
 
        var out = int2CharCode((o-firstRandom));//减去原来加的随机数,解密出来的字符
        console.log('t='+t+",firstRandom="+firstRandom + ",correct="+ out );
        firstRandom = j ; //下一个随机数
 
        decrptPwd.push(out);
    }
 
    return decrptPwd.join("");
}
 
//int 转assi 码
function int2CharCode(i){
 
  return String.fromCharCode(i);
}
 
//16进制字符串转int 类型数据
function hex2int(hex) {
    var len = hex.length, a = new Array(len), code;
    for (var i = 0; i < len; i++) {
        code = hex.charCodeAt(i);
        if (48<=code && code < 58) {
            code -= 48;
        } else {
            code = (code & 0xdf) - 65 + 10;
        }
        a[i] = code;
    }
 
    return a.reduce(function(acc, c) {
        acc = 16 * acc + c;
        return acc;
    }, 0);
 
}
// 字符串 转对应assi 码的数组
function string2Bytes ( str ) { 
 
        var ch, st, re = [];
        for (var i = 0; i < str.length; i++ ) {
            ch = str.charCodeAt(i);  // get char 
            st = [];                 // set up "stack" 
 
           do { 
                st.push( ch & 0xFF );  // push byte to stack 
                ch = ch >> 8;          // shift value down by 1 byte 
            }   
 
            while ( ch ); 
            // add stack contents to result 
            // done because chars have "wrong" endianness 
            re = re.concat( st.reverse() );
        
        // return an array of bytes 
        return re; 
    }

总结:这种的加密是使用密钥和随机数,随机数和原密码字符相加,再和密钥字符异或运算(得到的密文字符作为下一个随机数),最后得出加密后的密文。密钥来自session id的值,第一个随机数已经在密文的第一位。该网站的请求是http 请求,所以会出现网络嗅探,抓取到用户登录名和加密后的密码。通过该加密算法分析可破解密码,得到登录名和原密码。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-5-27 17:35 被beyondcyx编辑 ,原因: 错别字
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//