欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-22 15:50:26
1. url: https://weibo.com/ 2. target: 登录 3. 分析。由于需要填写验证码,本篇只分析破解用户名和密码加密部分,不做验证码识别。 3.1 老规矩,F12,随便输入一个帐号密码,点击登录,看看都发起了哪些请求。找到其中的post请求(一般登录都是post请求)。我 ......

1. url: 

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': '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()

结果:

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

 

 

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

学习交流,勿作他用。