怎么做电子商务的网站推广,张家口建设厅官方网站,wordpress的二次开发,网站备案和不备案的区别aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt
定位加密点
先看加密的请求和响应#xff1a;
全局搜索加密字段jsondata#xff0c;这种非特定参数的一般一搜一个准#xff0c;搜到就是断点。起初下的断点没停住#xff0c;转而从调用栈单步…aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt
定位加密点
先看加密的请求和响应
全局搜索加密字段jsondata这种非特定参数的一般一搜一个准搜到就是断点。起初下的断点没停住转而从调用栈单步调试来分析一般情况下就可以走到加密的位置了结果发现配置了多个拦截器而这个请求正好没走通过搜索下的断点。
首先确认加密调用所在的文件app.9ce0f…8be4.js,从网络的发起者和其调用栈里确认一下这个js所处的调用位置保险从最早进入这个js的调用下断点也就是doquery这个方法。 单步调试注意观察调用栈中帧出入的变化要在合适的帧上步进关键方法观察调用栈变化的另一个目的是及时止损即调用栈如果超出了断点的目标js的范围就说明错过正确的调试位置了。没出错的话很快就找到加密的位置断点位置也就确定了。
下面就很简单了步入加密方法中分析加密的方式。
同样的道理单步进入上一张图中30297行的方法可以得出分析结果json数据利用3des ecb加密其中加密的key是约定长度的随机字串简单向上审计下这个key即变量n的值生成的函数即可确定生成字串的字符集和base64是一样因为后期作为key加密时二进制解析用的是base64解码然后将这个key用rsa算法加密。如此就分别得到了两个加密的参数jsonData和DesKey。 简单记录下该加密库jsencrypt)下该加密函数3des)在cyberchef里的烘培料理。
还有个问题是响应加密为什么同样给了一个deskey呢首先这个响应和请求的加密模式大概率一样即对称加密数据公钥加密用于加密数据的key。解密的位置也是前端的拦截器里。
为了确认30316和30317两个方法的具体实现在这里下断点这两行代码很明显是解密方法而前文已经分析了加密的过程即得解密的加密模式。 tips:调用的方法的对象是m,和请求过程调用加密的对象是一样的因此在请求过程断点停住时打印这个对象并找到对应的方法即可
其实前文已经步入加密方法t.c了加解密方法的具体实现在一个js里简单翻一下就可以了无奈前面分析的时候思路被既定的问题卡住了。 那么就得到了数据的解密方法t.a和用于加密数据的对称密钥的解密方法t.e 注意此处23290行和23292行实际是为前文提及的rsa加解密实例配置公钥/私钥但其硬编码的公钥和私钥显然不是一对即前后端分别掌握一对公钥用于保证密钥的秘密性。 步入23280行的方法简单解释下下图13993行的代码加解密方法都从this,getkey获取的对象里调用其返回hex编码的加密结果外层的d是base64的调用。
步入进行审计即可如下图步入方法d后传入的参数e便是上图13993行encrypt方法返回的hex编码的加密结果。再看其方法实现是通过定义的变量c字符集进行编码其字符集正好符合base64。
总结以上分析得出本系统所加密模式设计如下 前端硬编码publicKeyA和privateKeyB 后端存储publicKeyB和privateKeyA
1.前端请求
前端参数加密 jsonData:3des(random(32)-desKeyA,dataA) ; desKey:rsa(publicKeyA,desKeyA);
2.后端接收请求
后端参数解密 rsa(privateKeyA,desKey)-desKeyA; 3des(desKeyA,jsonData)-dataA;
3.后端响应请求
后端参数加密 desMsg:3des(random(32)-desKeyB,dataB) ; desKey:rsa(publicKeyB,desKeyB);
4.前端接收响应
前端参数解密 rsa(privateKeyB,desKey)-desKeyB; 3des(desKeyB,desMsg)-dataB;
后端可能直接传回desmsg和deskey即3des加密结果和密钥
登录流程分析
click事件处理取得登录表单域password值跟进702行
4行queryKey实现了一个接口请求https://health.elder.ccb.com/api/sp/security/newkey?jsonDataFt4qWHc9Y1t3HTB%2BZVM2wexOibDwkZredesKeyf2pKDMU3OPsMJ%2FkQTRUVE%2F5EiLZZ6f4olO%2BLanYB%2FPHTBD9sqyZoC2ZL52jEP6XteTiMAEKykE63F9ry85EHgj91gVfd1xXRLiiImSuBPpCjfRoAsakMw%2FB4GHEmsmnC5%2F8Z%2B90js2vzSj1YiWvL5PUPqj%2BX0sFN97mwFF6%2Fldk%3D_1691127466956 获取对象形如 {“id”:“279”,“secKey”:“a09VdERja0dueVBVSWZnWA”,“createTime”:null} 其中jsonData是固定值{“requestPkUser”:“”}的3des加密结果3des加密的key仍然是随机的32位串再由硬编码的rsa pub key加密得到deskey
得到的seckey用于对登录密码的aes/cbc加密iv是硬编码的。 得到一个新的对象{ “success” : True, “id” : id,“encrypted” : aes(passwd, seckey,iv) }
这个对象再次被重组名为passwordJson的对象转字符串作为表单对象中password的新值最后表单对象由3des加密得到jsondata,3des加密密钥key由rsa加密得到deskey,形如{“jsondata”:”xxx”,”deskey”:”yyy”}的对象用作body请求登录。