js加密(八)新浪微博登录

1. url: https://weibo.com/

2. target: 登录

js加密(八)新浪微博登录

3. 分析。由于需要填写验证码,本篇只分析破解用户名和密码加密部分,不做验证码识别。

3.1 老规矩,F12,随便输入一个帐号密码,点击登录,看看都发起了哪些请求。找到其中的post请求(一般登录都是post请求)。我们找到了登录请求之后,看看都需要哪些参数,加密的参数基本如下:

js加密(八)新浪微博登录

也就su,servertime,nonce,rsakv,sp几个参数作了加密。而servertime是时间戳,over。nonce,rsakv这两个都是可以在上一个请求的响应中找到的,over。只剩下su和sp。猜测一个是帐号一个是密码。就先破sp吧。

3.2 直接搜sp肯定是不方便的,目标太大,那就搜一下它上下看起来相关的,而且唯一性比较强的参数,pwencode。看名字也知道跟密码编码有关,那就搜它吧。

很快就找到了下面这些东西:

js加密(八)新浪微博登录

3.3 打断点调试,su就是su,b就是sp 。

3.4 扣js代码过程,略。就一个一个函数地搞就可以。

4. python代码:

from afterWork.config import proxies, userAgent
import requests
import json
import execjs
import time
import re
import random def getJsCode():
with open('jsCode.js', 'r') as f:
jsCode = f.read()
return jsCode def getSu(ctx, account):
su = ctx.call('getUser', account)
# print(su)
return su def getServerTimeNoncePubkey(su):
# print('1577263612028')
ts = re.sub(r'\.', '', str(time.time()))
ts = ts[:13]
data = {
'entry': 'weibo',
'callback': 'sinaSSOController.preloginCallBack',
'su': su,
'rsakt': 'mod',
'checkpin': '',
'client': 'ssologin.js(v1.4.15)',
'_': ts
} res = requests.get(url='https://login.sina.com.cn/sso/prelogin.php',
params=data)
# print(res.text)
# print(json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')')))
nonce = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['nonce']
pubkey = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['pubkey']
servertime = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['servertime']
rsakv = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['rsakv']
pcid = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['pcid']
return servertime, pubkey, nonce, rsakv, ts, pcid def getLoginData(su, serverTime, nonce, rsakv, sp, ts):
# print('1577263612028')
ts = re.sub(r'\.', '', str(time.time()))[:-4]
# url='https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_={}'.format(ts)
headers = {
'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',
'Host': 'login.sina.com.cn',
'Referer': 'https://www.weibo.com/login.php',
}
data = {
'entry': 'sso',
'gateway': '',
'from': 'null',
'savestate': '',
'useticket': '',
'pagerefer': 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)',
'vsnf': '',
'su': su,
'service': 'sso',
'servertime': serverTime,
'nonce': nonce,
'pwencode': 'rsa2',
'rsakv': rsakv,
'sp': sp,
'sr': '1536*864',
'encoding': 'UTF-8',
'cdult': '',
'domain': 'sina.com.cn',
'prelt': '',
'returntype': 'TEXT',
} res = requests.post(url='https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_={}'.format(ts),
data=data,
headers=headers,
timeout=10) res.encoding = 'GBK'
# print(res.text)
loginResult = json.loads(res.text)
print(loginResult)
return def getSp(ctx, pw, serverTime, nonce, pubKey):
sp = ctx.call('getPw', pw, serverTime, nonce, pubKey)
# print(sp)
return sp def mainFun():
account = '你的帐号'
pw = '你的密码'
ctx = execjs.compile(getJsCode())
su = getSu(ctx, account) serverTime, pubKey, nonce, rsakv, ts, pcid = getServerTimeNoncePubkey(su)
sp = getSp(ctx, pw, serverTime, nonce, pubKey)
getLoginData(su, serverTime, nonce, rsakv, sp, ts)
# login(account, sp, pcid, serverTime, nonce) if __name__ == '__main__':
mainFun()

结果:

js加密(八)新浪微博登录

到这里,已经完成了登录,可以用session会话携带cookie去访问一些需要登录才能访问的信息。

学习交流,勿作他用。

上一篇:MT【326】曲线中的爱恨情仇


下一篇:Python爬虫教程-16-破解js加密实例(有道在线翻译)