栗子是:登录 - 试客联盟 js调试工具:发条js调试工具.rar-桌面系统文档类资源-CSDN下载
一、拿到加密代码
可以看到密码被加密了,我们在搜索框里搜索 “password ” ,找到并打开包含该关键词的js文件,查看里面的代码。
我们找到了这段代码,这段代码里有"RSA"、"encrypted"这些单词,应该是与加密有关的。这段代码的大致意思我们可以读懂:
4782行:serializeArray()这个js函数是用来实现序列化的,我们可以看到他作用于loginForm这个ID的标签,loginForm这个标签就是填写登录信息,也就是说formData是包含用户名和密码的一个数组。
4783行:把RSAKeyPair()函数返回的结果赋予给变量key。
4785行:进行是否为“密码框”判断。
4786行:把参数key和密码框内容传入encryptedString()进行加密并把结果赋予给密码框里内容。
我们在4786行设置断点。再次发送登录请求。
由图我们可以看到RSAKeyPair()函数里传入了"100001"、空内容、rsa_n这个三个参数。其中rsa_n这个参数是一个密文。接下来我们要找到获取密文的 url。
我们搜索rsa_n,找到了请求rsa_n密文的url。接下来我们进入RSAKeyPair()函数所在的js文件。
复制js文件里的全部代码到js调试器中, 然后再加上下面这段js代码(注意这里的rsa_n变量现在是测试用的,到时候要作为参数传入getPwd()函数):
function getPwd(p) {
setMaxDigits(131);
var rsa_n = "DC1683EEAA2B709F97743773E18F53E3C9A15D12465CE82227A6E447E6EC590D0B569876BB631B0AB4D67881E7EC874066D6E022E2978B4C6EAA8903EC1774AAE040A3BEAF9C2B48730ADD46BEF5F0C8109DB6FCEFED0F4A84CCD7AFFDB4FB4214DA0D0FF1A8E2831E81FA4D7C2F4346184EEC87CE42230FC320B2B4E392ECDF";
var key = new RSAKeyPair("10001", '', rsa_n);
return encryptedString(key, p);
}
输入参数、加载代码、计算表达式,ok运行成功!拿到了加密后的结果。
二、在Python中拿到加密后的密文
先改一下js代码:
function getPwd(p,rsa_n) {
setMaxDigits(131);
var key = new RSAKeyPair("10001", '', rsa_n);
return encryptedString(key, p);
}
拿到加密后的密文:
import execjs
import requests
import re
header = {
"user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
url = "http://login.shikee.com/getkey?v=fbb1d0fcaa1e2d9c4c6e321ba6c5cc5f"
resp = requests.get(url,headers=header).text #拿到ras_n的密文
ex = 'var rsa_n = "(.*?)";' #正则
ras_n = re.findall(ex, resp)[0]
node = execjs.get() #创建node对象
pwd = '123456' #密码
ctx = node.compile(open('shikewan.js',encoding="utf-8").read()) #编译js文件
funcName = 'getPwd("{0}","{1}")'.format(pwd,ras_n) #为函数传入参数
password = ctx.eval(funcName) #执行函数
print(password)
:输出结果: