ermao 发表于 2019-12-16 17:26

【JS逆向练习】新浪微博登录加密参数分析

## 0x00 前排

最近在练习JS逆向,发现论坛里关于JS逆向的东西都太难, 我这样的菜鸡太难上手。

所以发了这个帖子,记录一下简单点的JS分析。

只是新手练习记录,如文中有理解错误,还请大佬指出。

> 只记录算法分析过程,不提供成品。

## 0x01 目标网址

> http://weibo.com

## 0x02 定位JS

**1.** 随便输入账号密码验证码,如果是不存在的账号,会直接提示密码错误,如果是是存在的账号,会提示输入验证码,,这里假设是带验证码的,点击登录后,查看提交的参数,可以看到,在登录包里有许多看不懂的加参数,一个个来分析。



**2.** 分析下参数

|参数|值|来源|
|-|-|-|
|entry|weibo|固定|
|gateway|1|固定|
|from||固定|
|savestate|7|固定|
|qrcode_flag|false|固定|
|useticket|1|固定|
|pagerefer||固定|
|pcid|yf-826260aed11d*|上次返回|
|door|1111|验证码|
|vsnf|1|固定|
|su|MT*****NjY=|JS计算|
|service|miniblog|固定|
|servertime|1576135789|JS计算|
|nonce|NLUYC0|上次返回|
|pwencode|rsa2|固定|
|rsakv|1330428213|上次返回|
|sp|2395de422727c06*|JS计算|
|sr|1536*864|固定|
|encoding|UTF-8|固定|
|prelt|82|JS计算|
|url|https://weibo.com/*|固定|
|returntype|META|固定|

其中`上次返回`是在登陆之前的一次请求中返回的内容



其他的`JS计算`也不全是加密,有的只是单纯计算的值,下面一个个找。

**3.** Ctrl+Shift+F调出搜索面板,本着越生僻越好搜的原则,先搜索`prelt`,看到只有一个js结果。

点进第一个结果,点花括号格式化一下,`Ctrl+F`搜`prelt`,只有两个结果,而且第一个`returntype: "TEXT"`明显不是要找的,所以第二个上面下断点。



同时观察断点处,发现`f`是在上面由`makeRequest`定义的,所以这里先搜一下看看`makeRequest`的定义在哪。



直接找到了加密处,就是`makeRequest`,可以看到还有其他参数也是在这里生成的,包括固定的一些。在782行这里也下个断点。

**4.** 重新输入账号密码验证码,点击登录,JS被断了下来。



直接先把`su`给扣下来:
```
e.su = sinaSSOEncoder.base64.encode(urlencode(a));
```
可以看到参数`a`是账号,跟进`urlencode`发现只是一个简单的`encodeURIComponent`
```
urlencode = function(a) {
    return encodeURIComponent(a)
}
```

再找`sinaSSOEncoder`,直接Ctrl+F搜索,找到定义处:
```
var sinaSSOEncoder = sinaSSOEncoder || {};
```

这个语句意思是如果`sinaSSOEncoder `不为空(即转为bool类型不为false),则把`sinaSSOEncoder `赋值给前面的变量(也是`sinaSSOEncoder `),如果`sinaSSOEncoder `为空,则把后面的`{}`赋值给前面的`sinaSSOEncoder `,所以这里首先生成了空对象。

所以再找定义处,往下翻一下,看到**有两个函数调用了`.call(sinaSSOEncoder);`,这就是加密对象的定义了,两个函数全部拿走。**

继续往下运行,发现对`servertime`进行了赋值,那就搜一下后面的`.servertime =`(前面不带对象名,但带上`.`,后面带上空格和等于号),可以快速定位。



这里看到,其实就是一个`a`循环加2的意思,在这里下个断点,断下来之后可以从右侧Call Stack里看到参数`a`的来源,找到调用处发现就是上一次请求返回的`servertime`,也就是说,**参数`servertime`就是上次返回的`servertime`循环加2**,所以这里可以直接在外部语言实现。

下一个参数是`sp`,在上面的加密处已经看到了sp,大致看到是一个RSA,而且RSA对象的定义已经被扣下来过了,这里没啥要做的了,只是加密的参数要注意看下,一个是上次返回的`nonce`,一个是计算完的`servertime`,还有一个是明文密码,再加上其他字符组合成了加密参数。



最后一个参数是`prelt`,这个参数位置在一开始第一次下断点的那里:
```
f.prelt = preloginTime;
```

直接搜`preloginTime`,可以定位到269行:



这段意思是`prelt`就是上一次请求的回调函数中new Date减去上一次请求的起始new Date再减去请求返回的exectime,也就是**等于上一次请求的本地总耗时减去云端耗时。**

**5.** 参数找完了,到这里已经可以开始改写了。

参数列表如下:

|参数|值|来源|
|-|-|-|
|entry|weibo|固定|
|gateway|1|固定|
|from||固定|
|savestate|7|固定|
|qrcode_flag|false|固定|
|useticket|1|固定|
|pagerefer||固定|
|pcid|yf-826260aed11d|上次返回|
|door|1111|验证码|
|vsnf|1|固定|
|su|MTU1NTU1NTY2NjY=|base64+URL编码 手机号|
|service|miniblog|固定|
|servertime|1576135789|以上次返回的为基数,每次+2(从上次请求到提交登录的时间差除以2取整,一般为4~10)|
|nonce|NLUYC0|上次返回|
|pwencode|rsa2|固定|
|rsakv|1330428213|上次返回|
|sp|2395de422727c06ce|JS计算    RSA加密|
|sr|1536*864|固定   屏幕宽*高|
|encoding|UTF-8|固定|
|prelt|82|可随机,约等于上一次请求的本地耗时减去云端耗时,上一次请求的回调函数中new Date-上一次请求的起始new Date-请求返回的exectime|
|url|https://weibo.co|固定|
|returntype|META|固定|

## 0x03 改写JS

**1.** 先把调用函数拿过来。

```
function test(pass, servertime, nonce) {
    rsaPubkey = "EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443"
    var f = new sinaSSOEncoder.RSAKey;
    f.setPublic(rsaPubkey, "10001");
    b = f.encrypt(.join("\t") + "\n" + pass)
    return b
}
```

这里需要传入定义好的3个参数:明文密码、计算过的`servertime`、上次返回的`nonce`,同时把前文抠下来的JS全部放到上面就行了。

**2.** 除了参数`sp`,其他全部可以用Python直接实现。

另外base64也可以直接用JS内的方法实现,不用调用base64库,写个调用函数就行了。

```
function b64(username) {
        a = sinaSSOEncoder.base64.encode(encodeURIComponent(username));
        return a
}
```

## 0x04 完事儿
放到调试器里测试一波,没报错,写了登录例子也能成功。

清晨呀 发表于 2020-7-31 17:05

感谢大佬分享,最近在搞微博登录,现在参数全部回填后,不知道是因为的账号问题,还是新的机制会跳转到手机验证这块

yc19951005 发表于 2019-12-16 18:04

感谢分享

2Burhero 发表于 2019-12-16 19:19

红红火火

buxuku 发表于 2019-12-16 20:41

楼主研究精神值得点赞

really94264 发表于 2019-12-16 21:04

支持下新手,嘿嘿嘿

侃遍天下无二人 发表于 2019-12-16 21:51

看懂这个说不定就能把爱奇艺的播放地址找出来了

lq96001 发表于 2019-12-16 21:57

感谢楼主分享

kone153 发表于 2019-12-16 22:35

感谢楼主分享

爱凤凤呦 发表于 2019-12-17 00:15

setycyas 发表于 2019-12-17 00:47

新浪的登录比较难搞啊
页: [1] 2 3 4
查看完整版本: 【JS逆向练习】新浪微博登录加密参数分析