微博登录
声明:本项目仅仅用于学习交流,不可用于任何商业活动。
唠唠:
相信大家平时都使用微博,微博提供一个平台,我们既可以作为观众,在微博上浏览你感兴趣的信息;也可以作为发布者,在微博上发布内容供别人浏览。所以我们今天的受害者就是微博,啊哈哈哈。
开始上货
微博有好几个Type,有个如同我们phone的网站,还有其他的,我感觉都是不如我们今天搞这个微博Type好。
首先点击上面那个超链接:
打开是这样的界面(如下图1.1):
(图1.1)
我们在里面输入手机号以及错误的密码看看它的返回什么。但是我发现在我仅仅输入密码之后,再不点击东西的情况下就有东西返回(如下图1.2):
(图1.2)
这是它的返回数据(如下图1.3)
(图1.3)
我们先看图1.2上传的参数,首先一眼就可以看出_
是时间戳。其它参数也每变,都是固定的。这是我一开始以为的,后来在我点击登录,打断点,分析密码加密过程时发现了su
是什么,下面会讲到。
我们再看一下图1.3,返回的参数,首先是pubkey
,肯涉及某些加密,需要的key,pcid
与验证码有关,其实我一开始分析是有图片验证码的,但是这后来写教程时又没了,让我有点懵逼,不过这里就说一下了,是个重点,在网页上我们如果碰见验证码,要输入验证码,如果输入验证码,不对要重新输入,在我后面的分析中我发现验证码并没有上传服务器或者和密码一块加密什么的。它仅仅是在本地做个验证,所以我们完全可以不用管。然后那个pcid
就是验证码请求url
里面的一个参数。其实在我后来登录搞定密码加密后,居然无法登录,然后我发现是在自己账号密码输入正确后,还要验证,可以微博app扫码或者短信验证。这也是为什么会有一个smsurl
参数。
接下来我们输入密码:
会出现下面的图(如图2.1)
(图2.1)
我们把请求上传数据(图2.1)与返回数据(图1.3)进行对比,可以发现nonce
,rsakv
是可以通过返回数据获取的,su
与上面su
一样。sp
看着很长,有可能是密码,而其它参数是不变的,可以写死,ctrl+shift+t
搜索一下sp
,如果直接搜索sp
,会发现搜索到好多关于sp
的文件,然后试试sp:
,sp :
sp=
,或者sp =
,当我试到sp=
试,搜索到一个文件,如图(图2.2)。
(图2.2)
我们打开看一下下图(如2.3)。
(图2.3)
我们点击那个{}
,进行格式化。
然后搜索一下sp
搜索时有好多sp
,耐心找一下,会发现e.sp = b;
这个(如图2.4),同时也会发现上面有encrypt
,rsaPubkey
,nonsce
等关键字,可能就是这里加密。同时会发现 e.su = sinaSSOEncoder.base64.encode(urlencode(a));
,这个可能就是su
,同时也说明su
也是被加密的,不过很简单,先进行url
编码,然后base64
编码,这个可能就是账号。
(图2.4)
打个断点看看。同时我也在e.su = sinaSSOEncoder.base64.encode(urlencode(a));
处后来打了断点,果然su
就是账号的加密(如图2.5)。
(图2.5)
那我们看一下sp
的加密,这里密码加密其实就是RSA
加密(RSA
算法具体百度,这里不多说了),具体我们看一下下面的js代码:
if (me.loginType & rsa && me.servertime && sinaSSOEncoder && sinaSSOEncoder.RSAKey) {
e.servertime = me.servertime;
e.nonce = me.nonce;
e.pwencode = "rsa2";
e.rsakv = me.rsakv;
var f = new sinaSSOEncoder.RSAKey;
f.setPublic(me.rsaPubkey, "10001");
b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + b)
} else if (me.loginType & wsse && me.servertime && sinaSSOEncoder && sinaSSOEncoder.hex_sha1) {
e.servertime = me.servertime;
e.nonce = me.nonce;
e.pwencode = "wsse";
b = sinaSSOEncoder.hex_sha1("" + sinaSSOEncoder.hex_sha1(sinaSSOEncoder.hex_sha1(b)) + me.servertime + me.nonce)
}
可能有小伙伴好奇,为什么是RSA
加密呢,这里不是两种加密,但是经过我多次尝试,发现仅仅运行if
里面的,没有else
的事,所以我才说RSA
加密,但我仅仅走的是手机号
登录,至于邮箱
什么的是不是走else
就不知道了,感兴趣的小伙伴可以尝试一下。
接下来来到一个我认为的难点了,扣 and 改代码.
扣 and 改代码
细心地人会发现sinaSSOEncoder
,这个不仅在username
加密时被引用,在password
加密时页引用到了,那么我就看一下它是什么。我们鼠标选择,停留在它身上看一看(如图3.1)
(图3.1)
可以发现它有好几个加密,可以是一个聚合了多个加密类型的库。那我们把它找出来,这时我们切换到控制台
,也就是console
(如下图3.2)
(图3.2)
点击红色那个,就会定位到该函数所在位置,我们在往上找找,就会发现sinaSSOEncoder
(如下图3.3),黄色的就是我们要找的,我们就往下找,找到对应的地方,复制到本地就好,我用的是pycharm
,因为Ajian
是个学生,所以就申请了教育版,以前我以为要教育邮箱,后来才知道,没有也行,通过学信网的证明也是可以的。
(图3.3)
其实复制到下图(图3.4)就okk了。
(图3.4)
我们先运行一下,结果如下图(图3.5)
(图3.5)
navigator is not defined
=====》说navigator
没有定义,那我们就在最上面填一个navigator = {}
;
添加之后,我们再次运行,OK,没有报错了,接下来我们添加一下密码加密的代码。
e.servertime = me.servertime;
e.nonce = me.nonce;
e.pwencode = "rsa2";
e.rsakv = me.rsakv;
e.password = me.password;
var f = new sinaSSOEncoder.RSAKey;
f.setPublic(me.rsaPubkey, "10001");
b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + e.password)
不过这个代码我们要改一下,改成下面这样。
function encrypt(me) {
e.servertime = me.servertime;
e.nonce = me.nonce;
e.pwencode = "rsa2";
e.rsakv = me.rsakv;
e.password = me.password;
var f = new sinaSSOEncoder.RSAKey;
f.setPublic(me.rsaPubkey, "10001");
b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + e.password)
console.log(b)
}
var me = {'servertime': 1621061717, 'nonce': '0ZUT5X', 'rsakv': '1330428213', 'password': '123456', 'rsaPubkey': 'EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443'}
encrypt(me)
再次运行,又报错了。我们看一下,如下图(图3.6)
(图3.6)
说e
没有被定义,我们就在函数encrypy
里面定义一下,加一个var e = {};
就ok了。我们再运行看一下。
出接结果了,我与网站上对比,格式一样。
还有就是username
加密,这个我用python实现了,其实password
加密,我们也可以用python,不过我是想联系js扣 and 改代码,就用js了。
那我们登录看看,然后我大意了。哎!就像我上面讲的,居然有个二维码扫码验证,不过成功就在眼前,我们岂能放弃。最后看看再输入正确账号密码之后是什么请求。
还没完,还有:
我们输入正确的账号密码后出现这个情况,如下图(图4.1)
(图4.1)
通过我在抓的包中寻找下图(图4.2)标记情况
(图4.2)
黄色的就是就是图4.1,而通过红色就可以获得二维码,我们分析一下参数,我发现,只有callback对应的STK_16210797316101
是变化的,并且变得是_
后面的,明显是时间戳。我们看一下返回值,如下图(图4.3)
(图4.3)
我打开image
对应的链接,果然就是图4.1。
好了,我们把这些添加我们的代码,看一下它的返回值是不是图4.3形式。
返回值:window.STK_1621080516819 && STK_1621080516819({"retcode":20000000,"msg":"succ","data":{"qrid":"2NmZgn7nEAFCv1R4xGd345dbp06Y9V27dBnFyY29kZQ..","image":"http:\/\/v2.qr.weibo.cn\/inf\/gen?api_key=a0241ed0d922e7286303ea5818292a76&data=https%3A%2F%2Fpassport.weibo.cn%2Fsignin%2Fqrcode%2Fscan%3Fqr%3D2NmZgn7nEAFCv1R4xGd345dbp06Y9V27dBnFyY29kZQ..%26sinainternalbrowser%3Dtopnav%26showmenu%3D0&datetime=1621080516&deadline=0&level=M&logo=http%3A%2F%2Fimg.t.sinajs.cn%2Ft6%2Fstyle%2Fimages%2Findex%2Fweibo-logo.png&output_type=img&redirect=0&sign=ed1d3696478b41e8b7cd47e43de898aa&size=180&start_time=0&title=sso&type=url"}});
哎,还真是,好了,搞成功了,剩下的就是扫码以及获取cookie
了。
俺的小经历:
其实最近一直搞js逆向,说实话,自学真的挺难的,没人教,没人带,只能靠自己,这就让我想起当初开始学爬虫了,走了许多坑,不过很挺过来了,哈哈哈,现在面临js
逆向了,一夜回到解放前了,还要走一段小黑路,哈哈哈哈。许多人都是缺啥补啥,但是我太愚笨,领悟不透,只会一点简单的缺啥补啥。这个公众号是我记录自己学习经历的见证,把自己学到的,会的,分享出来。如有错误,欢迎大佬指出来,让我改正,菜鸡Ajian
不胜感激。
还有就是最近要搞单片机,打算在这上面分享。
如果jio的写的不错,就关注一下俺:
——————————————————————————————————————————
,把自己学到的,会的,分享出来。如有错误,欢迎大佬指出来,让我改正,菜鸡Ajian
不胜感激。
还有就是最近要搞单片机,打算在这上面分享。
如果jio的写的不错,就关注一下俺:
[外链图片转存中…(img-tGEzsDje-1621080865667)]
———————————————————————————