吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12212|回复: 31
收起左侧

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

  [复制链接]
ermao 发表于 2019-12-16 17:26

0x00 前排

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

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

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

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

0x01 目标网址

http://weibo.com

0x02 定位JS

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

1.png

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 固定

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

2.png

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

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

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

11.png

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

101.png

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

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

111.png

直接先把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 =(前面不带对象名,但带上.,后面带上空格和等于号),可以快速定位。

1111.png

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

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

1000.png

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

f.prelt = preloginTime;

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

10.png

这段意思是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([servertime, nonce].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 完事儿

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

免费评分

参与人数 16吾爱币 +23 热心值 +15 收起 理由
pwp + 3 + 1 我很赞同!
tear_light + 1 + 1 用心讨论,共获提升!
bobbyleu + 1 + 1 用心讨论,共获提升!
LangLang_Ago + 1 谢谢@Thanks!
zhuzhuxia111 + 1 + 1 我很赞同!
腰围两尺99 + 1 + 1 用心讨论,共获提升!
kyobomb + 1 + 1 热心回复!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
icom + 1 我很赞同!
Quincy379 + 1 + 1 谢谢@Thanks!
setycyas + 1 + 1 热心回复!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
really94264 + 1 + 1 用心讨论,共获提升!
咪咪 + 1 + 1 谢谢@Thanks!
清风浮云net + 1 + 1 谢谢@Thanks!
mmnnbbvv005 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

清晨呀 发表于 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
新浪的登录比较难搞啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 03:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表