Python实战案例:这是你见过的最详细的JS加密登录某博
2024-09-25 16:51:01
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)
最新文章
- HTML插入FLASH
- Puppet自动化部署-安装及配置(3)
- cocos2d-x 图片性能测试
- Urllib2 总结
- 提高Java代码质量:使用枚举定义常量(转)
- C# 通过自定义特性 实现根据实体类自动创建数据库表
- 用httpPost对JSON发送和接收
- 使用calabash测试开源中国Android客户端
- Linux内核结构分析与移植
- Köln-keith jarrett
- Jquery插件placeholder的用法
- spring可以get到bean,注入却为空
- Java线程中yield()的用法
- rabbitmq重装之后无法加入原有cluster的bug解析
- supervisor配置文件详解
- 基于JSP servlet mysql 的登陆页面
- apache2.4 文件浏览服务器页面配置
- POJ - 1321 棋盘问题 简单搜索 dfs 格子
- luogu 1026 统计单词个数
- pureftpd.passwd解析
热门文章
- window查看连接过的无线密码
- java-jpa-criteriaBuilder使用
- Springboot 项目启动设置
- 格式化JSON插件
- #写一个登陆的程序 ( 1.最多登录失败3次 2.登陆成功,提示欢迎XX登录,今天的日期是XXX,程序结束 3.要检验输入是否为空,账户和密码不能为空 4.账户不区分大小写)
- json序列化(重要)
- vue 移动端屏幕适配
- Nginx配置详解 http://www.cnblogs.com/knowledgesea/p/5175711.html
- Java 变参函数的实现
- POJ1471 Tree/洛谷P4178 Tree