当我玩哔哩哔哩的时候,一不小心。。。

一不小心用代码登陆了B站。。。并上传了。。视频

阅读本文需要4.66分钟

你被标题吸引了吧。。。别急着关。。重头戏在后面

最近当我玩B站的时候,一不小心用代码登录了它,并几乎无限制的上传视频。

那么接下来,我来讲解如何通过Hack技术来模拟 哔哩哔哩 的登录,并完成我们的视频上传等操作。因此内容中略有“暴力”,若您感到不适,那还是也请看完它。

按照以往的老套路,我们首先需要弄清楚它的登录逻辑,并通过我们的代码来实现登录操作,其次拿到所谓的 Cookie 或者 Token、Sign等校验字段来做其他的操作,以下将围绕 B站 一步步来讲解破解的思路:

首先我们访问到 哔哩哔哩 的登录页面:

当我们在未登录的状态下访问登录页面的时候,会发现验证码已经显示出来了。那么他们是怎么做到当我输入账号、密码并输入一个已经出来的验证码之后就能校验成功呢。这时候就得提前动动脑子,当然如果你是开发服务器的话,应该明白里面的道理。这里我简单的讲下,其实在访问这个登录页面的时候,B站 已经将一个唯一的标识和验证码绑定起来了(也就是后面说到的Cookie),并且在登录的时候将这个标识一并发送上去。也就是说:通过一个标识来绑定验证码和登录操作。

那么接下来我们看看在第一次访问登录页面的时候,都有哪些可用的数据,打开 Charles 抓包工具(Charles抓包工具可在历史文章中找到),重新访问登录页面.

这是登录页面的Request数据:

当然一眼看上去并没有什么可用数据。其实确实是没什么卵用的数据.那么我们来看看Response数据:

一眼看上去是挺乱的。细看下它的Raw数据。其中包括了使用的Server、Set-Cookie等等的数据,还有登录页面的html文本. 那么其中最重要的数据也就是 Set-Cookie,这个Set-Cookie中的数据就是之前讲到的 用来和验证码绑定的唯一标示。那么我们来确认下,来看看验证码图片的包:

快看,快看 验证码 Request 中的 Cookie,果然是上面登录页面的 Response 的 Set-Cookie。

那么验证码就简单了,我们通过代码来访问 B站 的登录页面,并拿到Response的Set-Cookie,然后再将这个Set-Cookie放到下载验证码Request的Cookie中,就这样,我们的验证码搞定了,那是不是登录就很简单了,少年憋急。登录才是大头..

来来来,基于上面的登录页面,我们在里面输入自己的账号,并完成登录来看看发的包都有哪些.

登录操作之后的Request:

可以看出来这是一个 post 请求,当然 Cookie 和验证码的一样将之前保存下来的 Set-Cookie 传给Request的Cookie.

post 参数如下:

Orz,WTF,提交的密码加密了。那么我就需要来找一下它的加密算法了。其实网页端的加密并没有什么卵用。对我来说,就是随便翻翻代码的事(毕竟我很帅)。

来来来,找啊找啊找加密。然后我们先试探性的搜索下请求的字段 ‘pwd’ 如下图:

果然定位到了加密的位置,当然前端页面的加密大部分都是很容易找到的,只要你有耐心.

以上就是 B站 加密密码的算法。简单讲下就是:通过 /login?act=getkey 拿到一个数据(hash,key),并以key作为RSA算法的公钥来加密 (hash+明文密码),然后针对这个数据来一次base64即可

python实现如下:

1
2
3
4
import rsa
pub = rsa.PublicKey.load_pkcs1_openssl_pem(_key)
_pwd = rsa.encrypt((_hash + psw).encode(),pub)
_real_pwd = base64.b64encode(str(_pwd))

那么现在我们就需要把问题聚焦到 /login?act=getkey 这个接口上。那么我们再回到之前的抓包数据上,会发现果然有一个 getkey 的请求:

同上,Cookie是最开始的Set-Cookie。

Response中也就同时拿到了我们需要的 hash 和 key.大功告成,所有请求和加密都被我们搞定。

这时候我们再思考下登录脚本应该怎么判断是否登录成功呢,回头过来看下之前的登录操作的结果 也就是 上面的 dologin 接口.

会发现如果你成功登录之后,在 dologin 接口上会有 302 重定向跳转,并最终跳转到 主页上。因此这时候我们就可以来写代码,模拟登录,并且在最后一步登录请求中判断当前请求历史的第一个状态码是不是 302 ,如果是302,说明我们的登录脚本是没问题的。同时,再拿到 dologin的Response中的Set-Cookie作为新的Cookie,因为这个Cookie才是真正验证通过的Cookie,当然它是存在有效期的。具体多少我还不清楚,一般有一个礼拜、一个月、甚至一年之久。之后我们用这个Cookie去做其他有意义的事情,是完全没问题的。

其次就是上传视频接口,也是类似的方法,需要分析上传视频的接口数据。并将最终的Cookie携带到请求包中。其中需要注意的是B站的上传视频可简单的分为以下几个步骤:

  1. 将视频以Chunk的方式,而且是options的请求方式上传到服务器。因此它是支持断点续传的。
  2. 拿到options请求之后的视频id,再请求 add 接口将数据post上去即可

总结

虽然这篇文章很短,但是当你真正坐下来分析的时候,将是一段非常枯燥的过程。需要的就是你的耐心。

其次之所以写这篇文章,其实重点不是怎么去破解B站的登录,而是这些破解的逻辑是否可以提供给我们一些服务器架构的思路,抑或防范别人的破解。