js加密(八)新浪微博登录
程序员文章站
2022-06-22 15:50:26
1. url: https://weibo.com/ 2. target: 登录 3. 分析。由于需要填写验证码,本篇只分析破解用户名和密码加密部分,不做验证码识别。 3.1 老规矩,F12,随便输入一个帐号密码,点击登录,看看都发起了哪些请求。找到其中的post请求(一般登录都是post请求)。我 ......
1. url:
2. target: 登录
3. 分析。由于需要填写验证码,本篇只分析破解用户名和密码加密部分,不做验证码识别。
3.1 老规矩,f12,随便输入一个帐号密码,点击登录,看看都发起了哪些请求。找到其中的post请求(一般登录都是post请求)。我们找到了登录请求之后,看看都需要哪些参数,加密的参数基本如下:
也就su,servertime,nonce,rsakv,sp几个参数作了加密。而servertime是时间戳,over。nonce,rsakv这两个都是可以在上一个请求的响应中找到的,over。只剩下su和sp。猜测一个是帐号一个是密码。就先破sp吧。
3.2 直接搜sp肯定是不方便的,目标太大,那就搜一下它上下看起来相关的,而且唯一性比较强的参数,pwencode。看名字也知道跟密码编码有关,那就搜它吧。
很快就找到了下面这些东西:
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': '1', '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': '1', 'from': 'null', 'savestate': '30', 'useticket': '0', 'pagerefer': 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)', 'vsnf': '1', 'su': su, 'service': 'sso', 'servertime': servertime, 'nonce': nonce, 'pwencode': 'rsa2', 'rsakv': rsakv, 'sp': sp, 'sr': '1536*864', 'encoding': 'utf-8', 'cdult': '3', 'domain': 'sina.com.cn', 'prelt': '113', '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()
结果:
到这里,已经完成了登录,可以用session会话携带cookie去访问一些需要登录才能访问的信息。
学习交流,勿作他用。
上一篇: css中如何使用border属性与display属性
下一篇: Linux 特殊权限