该文章主要提供交流学习使用,请勿利用其进行不当行为!
如本篇文章侵犯了贵公司的隐私,请联系我立刻删除!
个人博客:http://www.feastawlisao.com/
欢迎关注个人公众号:pythonORjs
今天我们来研究一下新浪微博的参数加密,也来做一下模拟登陆,今天全方位详细讲解撒。
这里我们登陆的网址为https://login.sina.com.cn/signup/signin.php,因为新浪的账号各个板块是互通的,登录后获取cookie就能访问新浪微博了,至于抓包工具,这里就暂时用不到了,推荐用charles,因为市面上流行的都是Fiddler,我感觉不太顺手,个人喜好哈,进入正题。
这里我们打开开发者工具,然后输入账号,密码,密码先输入错误的,,方便我们更好的抓包。
这里我们可以看到,返回两个url,我们先研究第一个url。参数里各种莫名其妙的东西,无大碍,那我们就先研究一下,entry,callback,rsakt,client,当前都是固定的,_是时间戳,su是什么呢,我们看一下,可能对于经常玩js的人一眼就看出来了,su参数是base64编码。
这里就不在搜索su参数在js里面怎么实现的了,因为这个参数太多了,这里直接贴出来js代码。
su参数知道怎么生成后,我们用python代码进行get请求,如下,我们返回的参数都先取出来,以备后续使用。为什么我没取出来完,啊哈哈哈哈,因为我已经知道哪些有用了。。
接着我们看下面请求的url,分析它的参数,然后一看一大堆参数,不要慌,问题不大,慌也没用,我们分析一波,此处讲重要的参数,su参数不就是我们的用户名,然后base64的结果,servertime还记得吗??上一个url返回的参数,nonce,rsaku也是如此。sp参数就是密码,经过了一系列的加密,perlt是随机生成的数字。好了,分析完,那我们找sp参数的生成过程吧。
这里有一个坑,因为,这里有一个参数,pwencode=rsa2,告诉我们密码是rsa加密生成的,然后再看前面返回的publickey值,刚好符合rsa的加密规则,然后就用python写rsa直接加密,然后发现,凉凉,还是错的,为什么呢,听我一一道来,哈哈哈哈哈哈哈哈。
接下来我们开始搜索参数,然后发现,sp参数多的超乎我们的想象,,,太多了。
这里可以这样搜,因为加密的是密码,我们可以搜password,passwd,pwd等等,也可以搜密码输入框的id标签,或者class标签。
此处我们搜索发现,在ssologin.js里面发现可疑的地方。password=rsa,nonce,servertime等等参数,那我们就试一下。
在这里有个if判断语句,注意一下。
我们开始下上断点,开始调试,下完断点后,点击登陆按钮。
然后程序会断下来,等待下一步操作。具体操作可搜索谷歌调试。
然后一步一步执行,看到rsaPubkeys,这个key是不是很眼熟呀,就是第一个请求url返回的pubkey,关于rsa加密的原理可自行百度。
我们接着往下调试,password 生成原理就是, encrypt函数里面传入三个参数,如下图,servertime,nonce字符串相加,中间由空格\t隔开,然后加上\n换行,再加上原始的password,就是没加密之前的密码。
此处只用python语言实现,如需js实现,可留言。因为python实现rsa加密有多种方法,此处只演示一种。有人说,为什么和我第一次加密的结果不一样,因为rsa是一直都在变化的,具体搜索rsa加密原理。
此处请特别注意,有两点。
1.post提交参数的时候,浏览器是没有url这个参数的,提交必须加上,要不然无法完成二次验证。
微博有二次验证,注意,注意,特别注意,别以为post成功后就能获取cookie登陆了,需要二次验证。
data全部参数如下:
data = {
'entry': 'account',
'gateway': '1',
'from': 'null',
'savestate': '30',
'useticket': '0',
'pagerefer': '',
'vsnf': '1',
'su': su,
'service': 'account',
'servertime': servertime,
'nonce': nonce,
'pwencode': 'rsa2',
'rsakv': rsakv,
'sp': sp,
'sr': '1920*1080',
'encoding': 'UTF-8',
'cdult': '3',
'domain': 'sina.com.cn',
'prelt': random.randint(1, 100),
'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'TEXT',
'door': '', # 验证码,小号需要填写,,,小号还需要二次点触验证
}
必须添加url这个参数,要不然无法返回,ticket参数,请注意。
二次验证所需要的参数如下,ticket参数就是上一步提交post返回的参数,ssosavestate,生成方式在js里面,,但是根据实验,可以写成任意时间戳。_是时间戳。然后提交请求
提交成功后,获取其cookie就行了,然后携带cookie进行访问数据。
然后你就会发现一个更重要的问题,就是,成功了,
本次分享到处结束,,如需需要js代码,或者python完整代码,请留言!谢谢!