前言
该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~
需求
模拟登录
目标网站:
aHR0cHM6Ly93d3cud2VpLWxpdS5jb20vdXNlci9sb2dpbi5odG1s
正文
登录后会触发2个接口,一个是对密码进行了加密。另外一个是返回一个32位的public key
看启动器,明显有个login
可以看到此处为密码加密的代码
var password = encrypt.encrypt(pubCode + sha512(password))
sha512经过测试为标准算法加密
pubCode可以在上面看到生成的方法:
res是后台返回的数据
那么pudCode其实就是访问/apo/v1/Token/code这个接口,返回的数据的data的item2。
那这个值就是我们一开始看到的32位的public key。pub同理
那么可以用JS模拟还原
npm install jsencrypt 可以实现 JSEncrypt()
jsencrypt 最后使用3.2.1版本,不然有可能会报错
然后会报一个window未定义的错误
我们需要找到node_modules里的jsencrypt.js,加上 window = global;
var JSEncrypt = require('jsencrypt')
var CryptoJS = require('crypto-js')
// pub = '-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo0nnZ/9wVN7HV/VeepE3\r\nIVAlAT6n1fmkXrHxbA08Olv+nYp7QlTW3heOEsOWTEMKRcYU1xAIMwt7pZ+qbyFD\r\nitnHkQUqneYs6PKeK2nDxGXR4MIRUz/MFJ4I3QRzmmklFPkJpfxnL0HnwNHw0fm4\r\nuX3GD9qxEcVsqSdhQMvgrW7gFQMD9tSiaXflgyQv1CZjCPNW2xSpWVoFl0+ODpFT\r\nsEmEt+uRiBD1ZVJnTVTCI0txqFLzFw/JwhUcUgflFRovtkcXTU+8aUCtnAAW019U\r\n5Anw6S4S6Ct2PTO0ZFwRNgjboRmT/0x/zdUfn/h6otQSllRfdqF1RVG4HoDf1U0s\r\neQIDAQAB\r\n-----END PUBLIC KEY-----'
// pubCode = '0afb100f5cb7448989f3ba532bb8508e'
// password = 'sadasd'
function sha512(t) {
var text = t
return CryptoJS.SHA512(text).toString();
}
function get_pwd(pub, pubCode, password) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(pub);
var encrypted = encrypt.encrypt(pubCode + sha512(password));
return encrypted
}
然后用python访问第一个接口获得pub和pubcode两个值,在调用js代码的get_pwd方法即可
import requests
import execjs
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
def login1():
url = 'https://api.wei-liu.com/api/v1/Token/code'
resp = requests.get(url=url, headers=headers)
pub = resp.json()['data']['item1']
pubCode = resp.json()['data']['item2']
return pub, pubCode
def login(password):
url = 'https://api.wei-liu.com/api/v1/Token'
data = {
'code': "",
'grant_type': "password",
'language': "zh-CN",
'password': password,
'userType': 1,
'username': "sadas"
}
resp = requests.post(url=url, headers=headers, json=data)
print(resp.json())
with open('03 微流云模拟登录.js', encoding='utf-8') as f:
ctll = execjs.compile(f.read())
password = 'vsdfa'
item = login1()
pwd = ctll.call('get_pwd', item[0], item[1], password)
login(pwd)
注,网站定义了请求参数需要是Json格式,所以我们在request中需要传入json
最后
欢迎联系作者交流更多