zoukankan      html  css  js  c++  java
  • 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去访问一些需要登录才能访问的信息。

    学习交流,勿作他用。

  • 相关阅读:
    C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧
    神经网络中的降维和升维方法 (tensorflow & pytorch)
    论文翻译:2020_Residual Acoustic Echo Suppression Based On Efficient Multi-Task Convolutional Neural Network
    论文翻译:2018_Deep Learning for Acoustic Echo Cancellation in Noisy and Double-Talk Scenarios
    十分钟入门Apollo
    SpringSecurity实现OAuth2+JWT
    实现Vue的多页签组件
    原生redis命令
    .NET Core学习笔记(8)——Entity Framework Core之Database First
    函数极限的计算_计算机程序化实现的理论基础
  • 原文地址:https://www.cnblogs.com/zrmw/p/12097931.html
Copyright © 2011-2022 走看看