受害者网站:http://www.15yunmall.com/pc/login/index
检查超时,这个我们不管他
直接分析参数,有2处加密位置,分别为password和csrftoken
只要是能够跟栈的,一律先在send的位置下断
很快就跟栈找到加密数据的位置
RSA分析的重点:
1、new RSA(); //反正必须要new一个对象
2、setPublicKey; 一定要调用一个方法设置公钥(名称无所谓),需要有公钥和mode(一般为10001)
3、加密; 必须用到BigInt大数的运算
RSA扣取代码平均2000行左右,行数一定要大致对的上
把关键代码扣取出来,检查上面提到的new;setkey;publickey,mode是否都全面了!!!
var public_key="00bdf3db924714b9c4ddd144910071c282e235ac51371037cf89fa08f28b9105b6326338ed211280154c645bf81bae4184c2b52e2b02b0953e7aa8b25a8e212a0b";
var public_length="10001";
var rsa = new RSAKey();
rsa.setPublic(public_key, public_length);
一、RSA四件套测试
首先测试RSA必备的4件套(new,setkey,mode,publickey)能否正确得到了!!
注意一定要新开一个空白页面!!
提示:RSAKey is not defined,我们再次返回刚刚的界面去寻找RSAKey的定义,然后把代码扣取下来
我们在new RSAKey()上面打上断点
算法单独使用一个文件来实现,一共也就100多行,直接全部扣取下来
新扣取的代码一律放到最上面, 再次运行,报错:BigInteger is not defined
于是就再次回到之前的网页下断点分析 BigInteger的来源
发现又是一个500行左右的单独文件
直接全部复制下来,放到脚本的头部
再次运行就没问题了,注意脚本的命名要使用英文!
否则会报错:由于此 URI 格式不正确,因此在工作区尝试绑定“snippet:///%u5300%u52A0%u901F%u5546%u57CE”时失败。
二、RSA加密测试
尝试使用我们自己扣取的RSA算法来加密文本"123456"
结果报错,我们就继续缺啥补啥
同样把单独文件全部扣取下来
然后又报错:rng_psize is not defined
直接搜索rng_psize的定义位置
再次运行发现已经可以在浏览器的环境下正确进行RSA加密了
三、本地运行RSA代码
尝试使用js调试工具在本地运行代码,结果报错:navigator 未定义
本地一般都是确实浏览器的环境所导致的!!!
补环境主要2点:补/删(需要读逻辑)
删:删除的代码不参与最后的计算(只是一个逻辑判断)
补:参与本地计算/需要提交到服务器
对于数量不多的情况,可以考虑删除代码
直接在你不确定是否执行的代码前面打上debugger(本地脚本)
结果没用断下来,说明可以直接删除
为了严谨起见,我们在fd中把相关代码注释掉
再次加载代码
一个分支语句到底走哪一个?我们在流程的最前面加上一个debugger看看到底进入哪一个流程
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 am3
BigInteger.prototype.am = am3;
dbits = 28;
}
这样前面的2条分支语句就可以注释掉了
再次在fd当中加载代码,这次成功了
然后我们尝试执行加密函数,也是顺利得到了加密结果
补充知识点:
函数返回undefined说明函数没用返回值,但是也有可能在函数的内部a.param.key=xxx这样赋值
ok,今天的你就到此为止吧,see you tomorrow