2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > JS安全防护算法与逆向分析——新浪微博登录JS加密算法

JS安全防护算法与逆向分析——新浪微博登录JS加密算法

时间:2023-01-27 16:27:14

相关推荐

JS安全防护算法与逆向分析——新浪微博登录JS加密算法

新浪微博登录JS加密算法

声明:本教程从安全角度出发讲解,只为增加读者的安全知识,提升读者数据安全意识,以及对于病毒和钓鱼网站的防护能力。绝无其他任何目的与用途。

新浪微博作为国内最大的即使分享社交平台,其用户基数庞大,为了进一步维护网络社交环境,阻止机器人等无用用户涌入,微博必然会提高用户登录的门槛(增强其数据加密算法)以防范爬虫机器人的存在。可事实上,就算新浪微博再怎么将其防护算法复杂化,我们依然会看到我们的个人账户上出现一些垃圾粉丝(机器人),那它们是怎么做到登录的呢?微博又是如何应对它们的登录的呢?让笔者一一道来。

我们在输入账户密码点击登录之后,抓包会发现发起了一个POST请求,如下图所示:

遵循上节淘宝算法分析的流程,我们依然寻找参数中我们不认识的部分(被加密的部分),我们来看看微博会传输哪些我们的个人信息来识别用户身份。笔者的params参数如下,我们可以发现其中su、servertime、nonce、rsakv、sp、prelt使我们无法理解的一些参数。在淘宝中我们可以通过参数名字password2得知密码的加密,可是在新浪微博中,参数名都似乎毫无意义,只有servertime是一个明显的时间戳。显然在参数名上做混淆还是有点阻碍的,那就是不得不把参数都分析一下,虽然我们可以凭直觉判断sp就是密码(最长的)。那我们接下来就看看su、nonce、rsakv、sp、prelt是如何加密的。

entry: weibogateway: 1from: savestate: 0qrcode_flag: falseuseticket: 1pagerefer: vsnf: 1su: MTIzNDU2service: miniblogservertime: 1589088275nonce: KCSD87pwencode: rsa2rsakv: 1330428213sp: 6e2ef2ab923b2850a5f696edd9d97b37abfe6cc4227862a3a33435a6eb12334eb835af5478deadb64ccd0916fb6d2e6033a22a5bc569365a7eed4aead06996081e334f9f5dc5cda28658af893d66d615a63bd93ff73cec05d4c545b5ac0d7a26bf30047870b36f9789076bde74930d9fc5cc1d2fc760a016cf51dbf1a394acffsr: 1536*864encoding: UTF-8prelt: 216url: /ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBackreturntype: META

我们首先直接搜索nonce,会出现以下符合项:

而笔者此时的nonce数值为KCSD87,显然最后一个才是我们需要的JS脚本,我们打开发现,servertime、nonce、pubkey、rsakv都是写死的,而且我们可以得到公钥,且直到这是一个RSA加密,这样就简单多了。运用排除法,剩下的su就是用户名,sp就是密码了。

我们接着搜索su,可以找到以下的符合项,在su一行下断点,按下F11。对照右边的Scope,我们发现它只是单纯地将我们的用户名(12345600)进行base64加密,原来如此,难怪找不到用户名呢!我们在附近也可以找到另一个关键sp!

接下来我们在798行sp处下断点,点击页面登录,发现791行的rsa加密和796行的hex_sha1加密都会执行,而且结果是一样的,那我们就选择rsa好了,毕竟我们得到了公钥。

好,现在我们已经分析完了大半,不过“行百步而半九十”,后边扣JS代码才繁琐呢,我们在791行下断点,F11进入其中,找到encrypt函数。

它的名字居然是bt!不是我们的encrypt,不过没事,我们发现它的参数签名分别是我们的servertime和nonce,显然就是我们需要的加密函数,只不过换了个名字罢了。我们接下来把和它相关的代码拷贝下来。

大概1000行加密代码左右,部分脚本如下:

......me={"retcode": 0,"servertime": 1589088259,"pcid": "tc-9fb820facc9e56e321eea1c272edffc37c4a","nonce": "KCSD87","pubkey": "EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv": "1330428213","is_openlock": 0,"showpin": 0,"exectime": 15};function getPwd(pwd) {var f = new sinaSSOEncoder.RSAKey;f.setPublic("EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443", "10001");b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + pwd)return b;}

我们编写Python脚本来验证一下,看能不能获取到我们需要的数值。

import execjsdef getpwd(password):with open('wb.js', 'r', encoding='utf8')as f:content = f.read()jsdata = pile(content)pw = jsdata.call('getPwd', password)print('pw:', pw)return pwif __name__ == '__main__':getpwd(123456)

在cmd运行,得到:

至此,新浪微博的登录加密算法已分析完毕,希望读者能有所得。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。