Python实战案例:这是你见过的最详细的JS加密登录某博

Posted chengxyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实战案例:这是你见过的最详细的JS加密登录某博相关的知识,希望对你有一定的参考价值。

0x00 抓包分析

技术图片

 简单的搜索之后发现,很多参数都是登陆上面这个请求返回的值,这个请求在输入完账号光标到达密码框时就会生成!

技术图片

技术图片

 

 

技术图片

0x01 加密逻辑分析

搜索su=可以很快找到加密的位置,上图看到e.su和e.sp都是由sinaSSOEncoder这个函数生成的,搜索sinaSSOEncoder发现就是这个js,也就是说把当前js全部拷贝下来就可用


技术图片

这里可以得知su是由账号加密得到

function getSu(user) {
return sinaSSOEncoder.base64.encode((user))
}

 


技术图片

me.rsaPubkey,me.servertime,me.noce这三个值都是由服务器返回的值,不多做解释!

技术图片

 

最后这个b则是我们的密码,e.sp也就是处理完后的b值

function getSp(me,pwd) {
var f = new sinaSSOEncoder.RSAKey;
f.setPublic(me.pubkey, "10001");
b = f.encrypt([me.servertime, me.nonce].join("	") + "
" + pwd);
return b
}

 


技术图片

 在当前js文件中搜索prelt得知是由preloginTime生成

技术图片

preloginTime就是一个时间戳减一个停顿后的时间戳,其实可以设置为一个随机数

function getPrelt() {
exectime = Math.floor(Math.random() * (20 ‐ 300 + 1) + 300)
return exectime
}

 

0x02 代码编写

1.获取nonce、rsakv等参数

import json
import re
import requests
import execjs
session = requests.session()
prelogin_url = https://login.sina.com.cn/sso/prelogin.php
login_url = https://login.sina.com.cn/sso/login.php
username = username
password = password
with open(login.js,r,encoding=utf‐8) as f:
login_js = execjs.compile(f.read())
su = login_js.call(getSu,username)
params = {
entry: weibo,
callback: sinaSSOController.preloginCallBack,
su: su,
rsakt: mod,
checkpin: 1,
client: ssologin.js(v1.4.19),
_: 1578127327125,
}
prelogin_resp = requests.get(prelogin_url,params=params)
result = re.search(rsinaSSOController.preloginCallBack((.*?)),prelogin_resp.text).group(1)
result_json = json.loads(result)
print(result_json)

 

技术图片

2.获取跳转链接

data = {
entry: weibo,
gateway: 1,
from:‘‘,
savestate: 7,
qrcode_flag: false,
useticket: 1,
pagerefer: ‘‘,
vsnf: 1,
su: su,
service: miniblog,
servertime: result_json[servertime],
nonce: result_json[nonce],
pwencode: rsa2,
rsakv: result_json[rsakv],
sp: login_js.call(getSp,result_json,self.password),
sr: 1920*1080,
encoding: UTF‐8,
prelt: login_js.call(getPrelt),
url: https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack,
returntype: META,
}
resp = session.post(login_url,data=data)
print(resp.text)

 

技术图片

3.获取跳转链接

location = re.search(rreplace("(.*?)");,resp.text).group(1)
resp = session.get(location)
print(resp.text)

 

技术图片

4.最后请求

location = re.search(rreplace(‘(.*?)‘);, resp.text).group(1)
resp = self.session.get(location)
print(resp.text)

 

技术图片

5.登陆验证

到此为止已经是成功登陆了,最后再请求一下主页,如果返回的源代码中有自己的用户名,那么说明我们已经登陆成功了

#Python学习群592539176
resp = self.session.get(https://weibo.com/)
print(resp.text)

 

技术图片

以上是关于Python实战案例:这是你见过的最详细的JS加密登录某博的主要内容,如果未能解决你的问题,请参考以下文章

八个JS中你见过的类型。

你见过的最全面的 Python 重点

这应该是你见过的最全前端下载总结

你见过最大的Python项目是多大?十万行的你见过?还说代码量少?

什么是区块链?这是我见过的最通俗易懂的解释

文案在人间,牛X的文案你见过几条?