RSA加密
Rsa加密包含一个key 和一个mode这个mode 默认 10001,也可以修改
观察发送的数据
首先点击登录
选择xhr这个筛选模块,可以看到这里面只有这个check的数据请求,
然后查看发送的数据,可以看到这里的密码是进行加密的
然后记录这些值
打断点
知道了请求和加密的数据,现在就是去断点调试这个流程
首先点击这个jquery-2.14,然后就会出现所有的栈,一般就先给send下一个断点
之后重新登录就会断下
之后看send下面的栈去找加密相关的
看到这里就可以看到是RSA的加密
补代码
接下来就是把加密的代码给弄出来也就是
var public_key="00bdf3db924714b9c4ddd144910071c282e235ac51371037cf89fa08f28b9105b6326338ed211280154c645bf81bae4184c2b52e2b02b0953e7aa8b25a8e212a0b";var public_length="10001";var rsa = new RSAKey();rsa.setPublic(public_key, public_length);var res = rsa.encrypt($('#password').val());
然后就是找这个代码缺什么就去找什么
首先就是public_key这个代码直接给出来的,mode也就是这里的length给出来的,然后下面的就是RSAKey(),这是new出来的对象,是一个原型对象,如果是实例对象的话就会比如这样命名
rsa.setpublic=function(){}
但是这里面并没有找到这个代码,所以下面的setpublic方法就是原型方法,
直接把鼠标放到这个函数上点击就会跳到函数的位置
可以看到这里并没有这个setpublic的函数,那么只能在原型里面,打开右边的隐藏分离式控制台,然后输入RSAKey.prototype 这个就是对象的原型,也可以直接在代码里面搜索到这个setpublic的方法
点击这个setpublic方法就会跳转到具体的函数
把这个js代码全部复制,放到刚刚摘出来的代码最顶端
用google浏览器新建一个js脚本
然后将这个补全的代码全部放到这个创建的脚本文件里面,点击运行,发现会报错
test:7 Uncaught ReferenceError: BigInteger is not defined
然后点击这个报错的位置就会跳转到报错代码行
然后去源代码里面找到这个代码行打上断点,寻找具体的代码也就是biginterger的位置
这个代码是从rsa.js复制的,那么就得去这个文件的相同位置打断点
然后运行网页,查看是否断住
然后把鼠标放到这个biginterger的位置就会出现这个代码的定义位置
点击跳转发现是跳转到了jsbn.js文件,然后把这个jsbn.js代码复制到我们创建的test.js的最上面,运行如果遇到这个错误
Uncaught TypeError: $(...).val is not a function
就修改这个代码
var res = rsa.encrypt($('#password').val());
为
var res = rsa.encrypt('123');
因为他解析步道这个#password,或者直接在刚刚源网页新开一个界面进行调试也可以
然后运行之后报错
jack:51 Uncaught ReferenceError: SecureRandom is not defined
然后使用相同的方法去找代码的具体位置
打上这个断点然后运行网页会断住
然后跳转到具体的代码,发现又是一个新的js文件,只有60几行,直接复制到刚刚创建的js文件的最上面
运行之后又有新的报错
rng_psize is not defined
然后点击这个报错位置,这里可以看到并不是函数和对象,而是两个变量之间的对比,定义变量一般用let或者var,我们直接去原网页进行全局搜索这个变量
然后就把这个定义的变量写入到我们创建的代码里面
如下
然后运行还是会报错
这个不是变量,就直接点击这个函数位置,然后去源代码全局搜索打上断点,直接定位代码具体文件位置
点击跳转
然后把这个文件代码直接复制到创建的文件最上面,直接运行
就能得到进过rsa加密的值
调试本地运行
直接拿到在线网站进行运行会报错
在进行本地运行调试的方法有两种
1 删除代码 删除的代码没有参与最后的计算
2 补上代码 参与了本地计算或者提交到服务器
然后我们开始去找到报错的代码进行分析
if(navigator.appName == "Netscape" && navigator.appVersion < "5" && window.crypto) {// Extract entropy (256 bits) from NS4 RNG if availablevar z = window.crypto.random(32);for(t = 0; t < z.length; ++t)rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;}
可以直接扔给gpt进行读代码
这段代码的意思就是去检查是否浏览器的名字是否是Netscape,这个是很老的浏览器,并且检查浏览器的版本是否小于5,并且检查是否支持window.crypto对象,如果都满足就调用crypto.random(32)生成一个32字节长度的随机序列,遍历 z 中的每个字符,通过 charCodeAt(t) 获取其 ASCII 值,使用 & 255 保证结果在 0-255 的范围内(一个字节),将处理后的随机字节存入 rng_pool 数组中,rng_pptr 是一个指针,表示数组的当前写入位置,并递增。这段代码仅适用于非常古老的浏览器,并且在其他浏览器中为了兼容性,也不会被运行,所以可以删除
然后删除后执行又爆了这个错误
然后去定位代码段是这一段
if(j_lm && (navigator.appName == "Microsoft Internet Explorer")) {BigInteger.prototype.am = am2;dbits = 30;
}
else if(j_lm && (navigator.appName != "Netscape")) {BigInteger.prototype.am = am1;dbits = 26;
}
else { // Mozilla/Netscape seems to prefer am3BigInteger.prototype.am = am3;dbits = 28;
}
这个就是navigator.appName是否为设定的值然后执行对应的代码,如果不清楚流程,可以在这里写上debugger;然后运行,查看运行的结果,我用google进行测试
当运行到这个判断的时候就会出现这些结果就可以查看运行的流程,运行之后发现流程是走的第三步
BigInteger.prototype.am = am3;dbits = 28;
那么直接把其他的代码删掉,直接运行
运行之后就不会报错,输入res变量就能得到加密后的结果
总结
流程就是找到加密的地方,然后先给请求打上断点,之后找到加密的代码,然后再看这些代码里面涉及的对象等其他变量是否存在,如果不存在就使用断点或者全局搜索去找到对象所在的js,然后复制整个代码到之前复制的加密代码的最上方,接下来添加一个测试js脚本,将代码复制进去并运行,根据报错进行寻找代码位置,然后复制到最上面,一直到没有报错为止,最后本地调试就根据报错进行删除和补代码,需要分析这个代码的流程,如果并没有参与到最后运行就直接删除吗,如果涉及到了,就直接在浏览器环境断点调试,保留用到的代码,最后尝试运行js代码