0x00 抓包分析

简单的搜索之后发现,很多参数都是登陆上面这个请求返回的值,这个请求在输入完账号光标到达密码框时就会生成!

0x01 加密逻辑分析

搜索su=可以很快找到加密的位置,上图看到e.su和e.sp都是由sinaSSOEncoder这个函数生成的,搜索sinaSSOEncoder发现就是这个js,也就是说把当前js全部拷贝下来就可用


这里可以得知su是由账号加密得到

function getSu(user) {
return sinaSSOEncoder.base64.encode((user))
}

me.rsaPubkey,me.servertime,me.noce这三个值都是由服务器返回的值,不多做解释!

最后这个b则是我们的密码,e.sp也就是处理完后的b值

function getSp(me,pwd) {
var f = new sinaSSOEncoder.RSAKey;
f.setPublic(me.pubkey, "");
b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + pwd);
return b
}

在当前js文件中搜索prelt得知是由preloginTime生成

preloginTime就是一个时间戳减一个停顿后的时间戳,其实可以设置为一个随机数

function getPrelt() {
exectime = Math.floor(Math.random() * (20 ‐ 300 + 1) + 300)
return exectime
}

0x02 代码编写

1.获取nonce、rsakv等参数

import json
import re
import requests
import execjs
session = requests.session()
prelogin_url = 'https://login.sina.com.cn/sso/prelogin.php'
login_url = 'https://login.sina.com.cn/sso/login.php'
username = 'username'
password = 'password'
with open('login.js','r',encoding='utf‐8') as f:
login_js = execjs.compile(f.read())
su = login_js.call('getSu',username)
params = {
'entry': 'weibo',
'callback': 'sinaSSOController.preloginCallBack',
'su': su,
'rsakt': 'mod',
'checkpin': '',
'client': 'ssologin.js(v1.4.19)',
'_': '',
}
prelogin_resp = requests.get(prelogin_url,params=params)
result = re.search(r'sinaSSOController.preloginCallBack\((.*?)\)',prelogin_resp.text).group(1)
result_json = json.loads(result)
print(result_json)

2.获取跳转链接

data = {
'entry': 'weibo',
'gateway': '',
'from':'',
'savestate': '',
'qrcode_flag': 'false',
'useticket': '',
'pagerefer': '',
'vsnf': '',
'su': su,
'service': 'miniblog',
'servertime': result_json['servertime'],
'nonce': result_json['nonce'],
'pwencode': 'rsa2',
'rsakv': result_json['rsakv'],
'sp': login_js.call('getSp',result_json,self.password),
'sr': '1920*1080',
'encoding': 'UTF‐8',
'prelt': login_js.call('getPrelt'),
'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META',
}
resp = session.post(login_url,data=data)
print(resp.text)

3.获取跳转链接

location = re.search(r'replace\("(.*?)"\);',resp.text).group(1)
resp = session.get(location)
print(resp.text)

4.最后请求

location = re.search(r'replace\(\'(.*?)\'\);', resp.text).group(1)
resp = self.session.get(location)
print(resp.text)

5.登陆验证

到此为止已经是成功登陆了,最后再请求一下主页,如果返回的源代码中有自己的用户名,那么说明我们已经登陆成功了

#Python学习群592539176
resp = self.session.get('https://weibo.com/')
print(resp.text)

Python实战案例:这是你见过的最详细的JS加密登录某博的更多相关文章

  1. python实战案例--银行系统

    stay hungry, stay foolish.求知若饥,虚心若愚. 今天和大家分享一个python的实战案例,很多人在学习过程中都希望通过一些案例来试一下,也给自己一点动力.那么下面介绍一下这次 ...

  2. Python实战案例系列(一)

    本节目录 烟草扫码数据统计 奖学金统计 实战一.烟草扫码数据统计 1. 需求分析 根据扫码信息在数据库文件中匹配相应规格详细信息,并进行个数统计 条码库.xls 扫码.xlsx 一个条码对应多个规格名 ...

  3. 源码篇:Python 实战案例----银行系统

    import time import random import pickle import os class Card(object): def __init__(self, cardId, car ...

  4. Python 小案例实战 —— 简易银行存取款查询系统

    Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...

  5. 部署Ambari Server实战案例

    部署Ambari Server实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备三台虚拟机(需要自行安装jdk环境) 1>.角色分配 NameNode节点: h ...

  6. 【Redis3.0.x】实战案例

    Redis3.0.x 实战案例 简介 <Redis实战>的学习笔记和总结. 书籍链接 初识 Redis Redis 简介 Redis 是一个速度非常快的键值对存储数据库,它可以存储键和五种 ...

  7. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

  8. (转)awk数组详解及企业实战案例

    awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...

  9. Flume实战案例运维篇

    Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...

随机推荐

  1. Centos7 忘记密码解决方法

    一.Centos7 忘记密码解决方法 1.进入单用户模型 重启 Linux 系统主机并出现引导界面时,按下键盘上的 e 键进入内核编辑界面 然后按向下键,找到以“Linux16”开头的行,在该行的最后 ...

  2. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  3. C语言笔记 14_标准库&assert&ctype&errno&float&limits

    C 标准库 <assert.h> 简介 C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息. 已定义的宏 ass ...

  4. 115、Java中String类之使用concat进行字符串连接

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. HBase基准测试

    执行命令: hbase org.apache.hadoop.hbase.PerformanceEvaluation 返回信息: [root@node1 /]# hbase org.apache.had ...

  6. luogu P2765 魔术球问题

    题目中没有说球的上限是多少,只告诉了柱子,那么我们就应该以柱子为界去增加球,考虑将每两个能组成完全平方数的点连边,就形成了一个DAG(有向无环图),由于是DAG,可以转换为最小覆盖问题,即最多有n条路 ...

  7. 如何利用TableView显示自定义nib中创建的UITableViewCell或子类?

    1.创建nib文件 cell.xib 2.在nib中拖一个UITableView出来,设置其reuse Identifier,再根据cell UI需要拖出view摆放好 3.创建ViewControl ...

  8. Spark 读 Hive(不在一个 yarn 集群)

    方法一 1. 找到目标 Hive 的 hive-site.xml 文件,拷贝到 spark 的 conf 下面. 在我的情况下 /etc/hive/conf/hive-site.xml -> / ...

  9. nodejs(12)Express 中间件middleware

    中间件 客户端的请求到达服务器时,他的生命周期是:request -- 服务器端处理 -- 响应 在服务器端处理过程中,业务逻辑复杂时,为了便于开发维护,需要把处理的事情分成几步,这里每一步就是一个中 ...

  10. 嵊州普及Day4T1

    题意:从n个数中选出k个数,使他们任意两数之差都等于m. 思路:任意差值都等于m,不就等价于k个数模m余数相同吗? 然后桶排储蓄一下各数余数即可. 见代码: #include<iostream& ...