js逆向-某米商城登陆分析

前言

本文仅供参考学习,如有侵权请联系本人删除!

本文参考:https://blog.csdn.net/Yy_Rose/article/details/125767465

目标网址

aHR0cHM6Ly9hY2NvdW50LnhpYW9taS5jb20vZmUvc2VydmljZS9sb2dpbi9wYXNzd29yZD9fcXJzaXplPTE4MCZzaWQ9bWlfZXNob3AmcXM9JTI1M0ZjYWxsYmFjayUyNTNEaHR0cCUyNTI1M0ElMjUyNTJGJTI1MjUyRm9yZGVyLm1pLmNvbSUyNTI1MkZsb2dpbiUyNTI1MkZjYWxsYmFjayUyNTI1M0Zmb2xsb3d1cCUyNTI1M0RodHRwcyUyNTI1MjUzQSUyNTI1MjUyRiUyNTI1MjUyRnd3dy5taS5jb20lMjUyNTI1MkYlMjUyNTI2c2lnbiUyNTI1M0ROelkzTURrMVl6Y3pObVV3TUdNNE9EQXhPV0UwTmpSaU5UVTVaR1F5TXpGaFlqRm1PR1UwTnclMjUyNTJDJTI1MjUyQyUyNTI2c2lkJTI1M0RtaV9lc2hvcCUyNTI2X3Fyc2l6ZSUyNTNEMTgwJmNhbGxiYWNrPWh0dHAlM0ElMkYlMkZvcmRlci5taS5jb20lMkZsb2dpbiUyRmNhbGxiYWNrJTNGZm9sbG93dXAlM0RodHRwcyUyNTNBJTI1MkYlMjUyRnd3dy5taS5jb20lMjUyRiUyNnNpZ24lM0ROelkzTURrMVl6Y3pObVV3TUdNNE9EQXhPV0UwTmpSaU5UVTVaR1F5TXpGaFlqRm1PR1UwTnclMkMlMkMmX3NpZ249dzFSQk02Y0c4cTJ4ajVKekJQUGE2NVFLczl3JTNEJnNlcnZpY2VQYXJhbT0lN0IlMjJjaGVja1NhZmVQaG9uZSUyMiUzQWZhbHNlJTJDJTIyY2hlY2tTYWZlQWRkcmVzcyUyMiUzQWZhbHNlJTJDJTIybHNycF9zY29yZSUyMiUzQTAuMCU3RCZzaG93QWN0aXZlWD1mYWxzZSZ0aGVtZT0mbmVlZFRoZW1lPWZhbHNlJmJpekRldmljZVR5cGU9Jl9sb2NhbGU9emhfQ04=

接口网址aHR0cHM6Ly9hY2NvdW50LnhpYW9taS5jb20vcGFzcy9zZXJ2aWNlTG9naW5BdXRoMg==


逆向分析

在这里插入图片描述

经过多次抓包发现只有userhash这两个地方是加密变化的。user就不用说都知道是用户了。那这个hash是什么呢,其实就是密码的hash值。其实在这里我一眼就可以看出它是什么加密。在这里有一个小技巧,选择一个常用的数字作为密码,然后记住它的加密特征就能够知道属于什么加密了。

加密点分析

打上xhr断点,寻找userhash的加密地方。

在这里插入图片描述

堆栈跟上九层就能看到:

 user: v.user,
 hash: j()(a.password).toUpperCase()

打上断点分析看一下。

在这里插入图片描述

确实能够断下来,说明找的位置没有错,往上找找它的加密逻辑。

hash参数分析

在这里插入图片描述

这几行很关键,首先确定是一个AES加密,加密函数赋值给了变量u,然后加密后赋值给对象f,最后用v变量接收加密参数。
在这里插入图片描述

加密是在Pt函数中,仔细看一下就知道最后的g是我们需要的加密后的user,再看一下o()(e = a()(t))是什么玩意。
在这里插入图片描述
o() 是一个forEach循环,t={user: ‘13888888888’},==a()(t)==取了对象的键。
改写一下

Object.keys(t).forEach(function (e) {
	dosomething……
}

代码放在最后,接着看一下hash参数的分析。

hash参数分析

之前说过能够看出是什么加密,方法也告诉小伙伴们了。很显然是一个MD5加密,然后将加密结果大写。分析一下代码看一下是不是吧。
在这里插入图片描述
进去看一下。
在这里插入图片描述
在返回值l处打上断点,跳进去。
在这里插入图片描述

3825行使用了三目运算符的嵌套,一层层扒开看看调用了哪个方法。
前面都是False,所以最后调用了t.bytesToHex(r)实现加密逻辑。其中参数r定义在上方。
最终的加密逻辑是:

var r = t.wordsToBytes(l(e, n))
t.bytesToHex(r)

这里就不细扣了,因为已经知道了加密方法。

代码复现

使用前安装

npm install js-md5
npm install crypto-js
//user
var CryptoJS = require('crypto-js');

function Pt(t) {
    var i = function (t) {
        for (var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*", r = "", i = 0; i < t; i++) {
            var n = Math.floor(Math.random() * e.length);
            r += e.substring(n, n + 1)
        }
        return r;
    }(16)

    var u = CryptoJS.enc.Utf8.parse("0102030405060708")
        , f = CryptoJS.enc.Utf8.parse(i);
    var encryptUser;
    Object.keys(t).forEach(function (e) {
        var r = t[e]
            , i = CryptoJS.AES.encrypt(r, f, {
            iv: u,
            padding: CryptoJS.pad.Pkcs7
        });
        encryptUser = i.toString();
    });
    return encryptUser;
}

console.log(Pt({user: "your phone"}));
//hash
const md5 = require('js-md5');
function md5Encryption(pwd){
  return md5(pwd) 
}
console.log(md5Encryption('abc123')); //e99a18c428cb38d5f260853678922e03

搞清楚思路还是不难的。

如果觉得本文对你有帮助,可以点个赞再走。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值