背景
login_api中对password进行了加密,整个逆向过程还是比较简单的,加密过程也是一目了然,没有什么坑点。无论是js定位,还是js代码的阅读,对初学者都比较友好,很适合练手
url:(base64) aHR0cHM6Ly94anNray5vcGVuLmNvbS5jbi9zdHVzcGFjZS1hdXRoLyMvbG9naW4=
逆向过程
一、首先进行抓包分析,随便输入各项值,其中密码为"123456"。
模拟登录后肯定是显示登录失败的,得到该api参数如下,pwd被进行了加密
其中的key为验证码的key,点击"换一张"可抓包到相关接口
二、
- 直接全局搜索password, 发现并不多。直接看吧,其中的jquery/axios/vue可先不看,这三个都是前端框架,一般来说,加密不会置于其中,尤其是对于小站来说,大站除外,这种情况建议都先pass掉,去其他js文件里找。
- 然后我们看app.3bd8519c.js和chunk-4168xxx.js两个文件,可以看出后者更像是注册操作。所以我们先去app.3bd8519c.js文件里挨个看,对你觉得怀疑的地方都打上断点找找看吧。如下,可得
t中包含了username,pwd(明文)等元素。
Object(d.a)是个方法,将pwd传入后就变成了密文,且跟我们的login_api一致
到这基本就可以确认加密位置了
三、我们开始进入Object(d.a)函数中寻找加密过程,可以看到加密过程还是简单的,就两个加密函数c和r,挨个进入查看
toUpperCase(): 将字符串全转成大写
其中e参数是我们的明文pwd
函数c是md5加密、函数r是sha1加密(下图可见)
至此,我们知道了我们的明文-密文过程:pwd转大写后先经过c(md5)加密得到t --> 对t转大写后再经过r(sha1)加密得到n --> 对n转大写后再进行一次r(sha1)加密则得到最终的pwd密文。
直接上代码验证:
a = '123456'
x = md5()
x.update(a.encode(encoding='utf-8'))
aa = x.hexdigest()
# print(aa)
y = sha1()
y.update(aa.upper().encode(encoding='utf-8'))
aaa = y.hexdigest()
# print(aaa)
z = sha1()
z.update(aaa.upper().encode(encoding='utf-8'))
aaaa = z.hexdigest()
print(aaaa.upper())
# >>> 8EFC459F5837CCE06914D8C41AFDBC47A5B2AD5D
结果一致