哔哩哔哩在登录时,参数如下:
今天主要对password密文进行逆向剖析:
插桩
t 为输入的明文密码
i = e.sent,
a = i.JSEncrypt,
c = new a
c.setPublicKey(o.data.key)用于实现 RSA 加密,这段代码中主要是准备设置公钥以进行加密操作
console下key是多少呢
PublicKey和hash
key (公钥)
'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n'
hash (salt)
'1c5346622adfd989'
Encrypt
加密的参数:hash + t ;即hash拼接输入的密码
1c5346622adfd989111111
继续跟栈c.enrypt
webpack代码
(("undefined" !== typeof self ? self : this)["webpackJsonpminiLogin"] = ("undefined" !== typeof self ? self : this)["webpackJsonpminiLogin"] || []).push([[1], {
....代码
"24e5":function(){
}
}]);
webpackJsonpminiLogin这几个字就明显的告知这是一个webpack文件 ,webpack文件相当于来说就不要去扣算法了(对于强迫症的我的确很难受),那么对文件进行改造一下。
构建webpack
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
self = window;
_global = this;
!function(s) {
"use strict";
var u = {}
function l(e) {
var a = u[e];
if (void 0 !== a)
return a.exports;
var c = u[e] = {
id: e,
loaded: !1,
exports: {}
};
// console.log(e);
return s[e].call(c.exports, c, c.exports, l),
c.loaded = !0,
c.exports
}
_global = l;
}({
"24e5":function(){
...完整代码
}
})
copy下来,直接run!!不出意外的出现了意外,提示navigator is not defined,看来webpack文件获取了浏览器环境,对于大厂来说这很常见。
navigator = { "appCodeName": "Mozilla", "appName": "Netscape", "appVersion": "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" }具体的navigator参数还需要自己去conole打印
再次运行:
看到没有报错了,已经解决了99%的问题,webpack环境就补完整了,接下来就需要模拟构造
猜想验证
s = new _global("24e5")["JSEncrypt"]['prototype'] s.setPublicKey(data.key) password = "111111" encrypt_str = data.hash + password console.log(s.encrypt(encrypt_str)) PS: new _global("24e5")["JSEncrypt"]['prototype'] === 原代码中的a c = new a在这里我用 s = new _global("24e5")["JSEncrypt"]['prototype']
算法结果
conole结果
具体为啥结果不一样呢。大概率是有时间戳参与了运算,搜索关键词date,好家伙33个搜索结果。
for example
this.localDateToUTC = function(t) { return utc = t.getTime() + 6e4 * t.getTimezoneOffset(), new Date(utc) }
分析到此结束