当前位置:
首页 > Python基础教程 >
-
Python实战案例:这是你见过的最详细的JS加密登录某博
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, "10001"); 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': '1', 'client': 'ssologin.js(v1.4.19)', '_': '1578127327125', } 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': '1', 'from':'', 'savestate': '7', 'qrcode_flag': 'false', 'useticket': '1', 'pagerefer': '', 'vsnf': '1', '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)
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式