目标:今天笔者分享的是一些加密函数的寻找以及解决方法。
环境 :Python2.7
声明:本篇文章是基于笔者之前分享的RSA加密的基础上进一步进阶,分享一些JavaScript的解析。
目标网站:https://qiye.ymm56.com 企业版的运满满,当然这个登录时做了Ajax判断如果账号或者密码不正确是无法进行登录,所以对于大家想要实践一下的愿望是不能满足你们了。账号和密码这里不提供,只分享一些解析加密的过程以及JavaScript的分析。
{"account":"账号",
"password":"XZbc2TeiUcVLD+/C0W/3zKEDOV5h1bBDVcLtMExTxVuRD3x+Kg1lWGtoOcMZ7xskzihRN5YUNMiGh1DAI4yQGFVZ0RCbFkKYcBE4p3cjYLNcCEHmNjXhBftC1iHF78G09WqWvggiIYSGvx+jazjYvnsQL0INhgrx2AX7UORGVnc="}
在这里笔者登录过后却发现,这个账号进行了加密,而我们如果想要提交表单进行模拟登录的时候就会一定麻烦了,那么一定会有人说,既然我们都知道了加密的密文,下次提交登录的时候直接使用密文进行登录呀,那么如果你这样想恭喜你,离失败又近了一步,那么怎么解决这个问题呢?那么我们继续使用我之前给大家说的情况通过fiddler
来找加密的js文件。在这里就不叙述了因为叙述的太多了,如果是第一次看我博客的小伙伴可以去看看我前几篇分享的加密的寻找方法,在这里直接分享找到的结果。
submit: function () {
var t = this,
e = "",
n = {};
if (!/^1\d{10}$/.test(t.form.loginAccount)) return this.errorMessage = "请输入正确的手机号码",
void(this.errorMessageFlag = !0);
if (1 == this.active) {
if (!this.passwordCheck()) return;
e = "password/login",
n = {
account: t.form.loginAccount,
password: this.JSEncryptCreate(t.form.passWord, 1)
} // 可知密码是通过 JSEncryptCreate 进行了加密,那么继续寻找这个方法
} else if (2 == this.active) {
if (!this.codeCheck()) return;
e = "login/login",
n = {
loginAccount: t.form.loginAccount,
captcha: t.form.captcha
}
}
this.sendTrack({
element_id: "login",
event_type: "tap"
}),
(0, g.
default)({
url: e,
method: "post",
needLoading: !0,
ignoreCode: !0,
data: n
}).then(function (e) {
1 === e.data.result ? (t.getPermissions(), t.loginSuccess()) : 70002 === e.data.result ? t.openDialog({
name: "d-addIdCard",
data: {
userName: e.data.errorMsg.split("&&")[1],
loginAccount: t.form.loginAccount,
captcha: t.form.captcha
},
methods: {
cb: function () {
t.getPermissions(),
t.loginSuccess()
}
}
}) : t.openTips("tip", e.data.errorMsg)
}).
catch (function (t) {
console.log(t)
})
},
通过寻找找到 JSEncryptCreate
方法可知我们必须要找到 encryptKey
这样我们就知道加密的公钥。那么继续寻找这个方法。
JSEncryptCreate: function (t, e) {
var n = "",
o = new this.$jsEncrypt;
return o.setPublicKey(this.encryptKey),
1 == e && (n = o.encrypt(t)),
n
},
通过进一步寻找发现这个方法
getEncryptkey: function () {
var t = this;
(0, g.default)({
url: "password/encryptkey", // getEncryptkey 获取公钥的路径,通过fiddler搜寻这个请求
method: "post", // post 请求
needLoading: !0,
ignoreCode: !0,
data: {} // 所需要的参数为空
}).then(function (e) { // 请求获得的内容传入到这个函数中
1 == e.data.result && (t.encryptKey = e.data.data.publickey)
}). // 通过判读e.data.result如果是1,那么继续走 (t.encryptKey = e.data.data.publickey)通过e.data.data.publickey,第一个e.data获取数据,
// 第二个.data是获取其中键为data的值,进而.publickey这个键的值
catch (function (t) {
console.log(t)
})
},
1 == e.data.result && (t.encryptKey = e.data.data.publickey)
拉出来这句话的意思是:如果1 == e.data.result
这部分成立则继续走(t.encryptKey = e.data.data.publickey)
,否则不走。既然我们知道了加密的公钥是存在` url: “password/encryptkey”,这个请求中的,那么首先进行请求这个路径。获取到的值通过RSA加密即可。这里笔者之前分享过RSA加密的方法,这里也直接上代码。
# coding=utf-8
import requests
import base64
from hashlib import md5
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
res = requests.session()
login_url = 'https://qiye.ymm56.com/key-customer-app/password/encryptkey'
login_headers = {
'Origin': 'https://qiye.ymm56.com',
'Referer': 'https://qiye.ymm56.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134',
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json;charset=utf-8',
'Accept-Language': 'zh-CN',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'qiye.ymm56.com',
}
login_data = '{}'
login_res = res.post(url=login_url, headers=login_headers, data=login_data, verify=False).json()
login_publickey = login_res['data']['publickey']
public_key = """-----BEGIN PUBLIC KEY-----
{rsaPublicKey}
-----END PUBLIC KEY-----""".format(rsaPublicKey=login_publickey)
rsakey = RSA.importKey(public_key)
cipher = PKCS1_v1_5.new(rsakey)
cipher_text =base64.b64encode(cipher.encrypt('加密的密码'))
ok,分享结束,今天笔者继续分享RSA加密的原因是自己更懂点js代码,后续会继续分享和学习,如有不正确欢迎来指正。