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

新浪微博登录JS加密算法

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

 

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

 

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

 

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

entry: weibo
gateway: 1
from: 
savestate: 0
qrcode_flag: false
useticket: 1
pagerefer: 
vsnf: 1
su: MTIzNDU2
service: miniblog
servertime: 1589088275
nonce: KCSD87
pwencode: rsa2
rsakv: 1330428213
sp: 6e2ef2ab923b2850a5f696edd9d97b37abfe6cc4227862a3a33435a6eb12334eb835af5478deadb64ccd0916fb6d2e6033a22a5bc569365a7eed4aead06996081e334f9f5dc5cda28658af893d66d615a63bd93ff73cec05d4c545b5ac0d7a26bf30047870b36f9789076bde74930d9fc5cc1d2fc760a016cf51dbf1a394acff
sr: 1536*864
encoding: UTF-8
prelt: 216
url: https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack
returntype: 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 execjs

def getpwd(password):
    with open('wb.js', 'r', encoding='utf8')as f:
        content = f.read()
    jsdata = execjs.compile(content)
    pw = jsdata.call('getPwd', password)
    print('pw:', pw)
    return pw

if __name__ == '__main__':
    getpwd(123456)

在cmd运行,得到:

 

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

 

 

 

 

 

©️2020 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值