博主最近沉迷js逆向,向各网站开刀,于是决定拿比较经典的微博登陆js加密来作为案例给大家讲解一下。
我们先从这个登录界面进行调试。先随便填写账号密码,找到登陆的请求接口。
经过多次发送请求,发现以下几个参数是变动的:severtime,nonce
,pubkey,rsaky,exectime,su,sp.
因此我们要在控制台内搜索这几个参数,首先我搜索了pubkey,发现了pubkey等参数是已经存在的。
这样就好办多了,只要分析sp和su参数那不就行了么,经过分析su就是账号经过加密后的参数,sp就是密码经过加密后的参数。
于是,又在控制台内搜索su和sp这两个参数,最后发现index.js这个js文件最为可疑。于是点进去仔细看了一下,发现了我们需要的参数。
这不就是我们要的su吗,于是我们直接编写js文件进行调试。
随便输入一串数字测试一下,看结果是不是和在网页中的值是一样的。
运行后的结果
是不是有点眼熟?于是我重新登陆了微博,一样的账号,返回的su的值就是这个,大功告成,结束。
不不不,还有一个sp参数,我们还没解决呢。
OK,我们继续看,在js文件中搜索sp,发现了这个:
不过不是很确定这就是我们需要的sp参数,于是我在这边打了个断点,运行结果:
发现这串数字是不是和刚开始表单内的sp很像?没错,这就是我们需要的sp参数,功夫不负有心人,终于找到了。
我们接着往向下看:
发现b是通过这种方法得到的,然后把我们需要的js代码都复制粘贴进本地的js文件中,提供调用。
大致的解密思路差不多了,接下来就是编代码了。
def get_sp_user():
with open('weibo.js',encoding='utf-8-sig') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
sp = ctx.call("getpwd",pubkey,servertime,nonce,pwd )
su = ctx.call("getuser",user)
return sp,su
这里通过eecjs模块运行得到sp,su参数,然后其余参数都是现成的,我们加进去就行了。
form_data = {
'entry':'sso',
'gateway':'1',
'from':'null',
'savestate':'0',
'useticket':'0',
'pagerefer':'',
'vsnf':'1',
'su':su,
'service':'sso',
'servertime':servertime,
'nonce':nonce,
'pwencode':'rsa2',
'rsakv':'1330428213',
'sp':sp,
'sr':'1536*864',
'encoding':'UTF-8',
'cdult':'3',
'domain':'sina.com.cn',
'prelt':exectime,
'returntype':'TEXT',
}
response = requests.post(url=url,headers = headers,data=form_data)
print(response.text)
打印下的请求结果如下:
怎么回事?这个怎么还是乱码的?于是我将unicode码转为中文,结果如下:
因为个人设置原因,于是在手机端微博同意登陆申请,最后成功登陆微博网页!
微博的js加密说难也不难,说简单吧,找这些参数也得花点时间,写下这篇文章,主要是想和大家分享一下js逆向的技巧,希望大家能够有所收获!