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


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

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去訪問一些需要登錄才能訪問的信息。

學習交流,勿作他用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM