1. 程式人生 > >新浪微博PC端模擬登陸

新浪微博PC端模擬登陸

點選上方“程式人生”,選擇“置頂公眾號”

第一時間關注程式猿(媛)身邊的故事

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

圖:Fantastic Beasts and Where to Find Them

投稿

星星線上

簡介

一個從妹子圖到爬蟲愛好者的猿生歷程

連結

https://www.jianshu.com/p/2557882c5814

本來給自己定了個2018的目標,平均每月寫兩篇文章,現在已經快三月了,第一篇稿子才憋出來,慚愧呀,直入主題吧,今天給大家帶來的是新浪微博PC端的模擬登陸。

工具


這次使用的工具是Charles和chrome瀏覽器,看過我之前文章的同學應該知道我使用的Mac電腦,Fiddler不能用,之前用虛擬機器很麻煩。很早的時候有裝過Charles,但是不太會用,後來發現一篇比較詳細的文章,忘了記錄了。發現Charles還是非常好用的,而且有個很好的功能,就是可以開啟多個Session進行抓取對比,這個功能非常?,如果經常做爬蟲除錯的人一定能知道。我們抓取一個網站的登入過程,然後在模擬的過程中,可以再另一個session中抓取自己模擬登入的過程,然後對比一下自己的請求傳送的資料和瀏覽器請求傳送的資料是否一致。之前我除錯一直都是通過列印檢視,這樣一方面很不方便,另外一方面列印也不完整。所以非常推薦大家使用Charles,網上破解也有很多。

640?wx_fmt=png

Charles

開啟Charles,要開啟SSL代理抓取,這樣才能抓取到HTTPS請求,畢竟現在很多網站都已經使用HTTPS請求了

640?wx_fmt=png

HTTPS抓取設定

Host填*表示匹配所有網址,HTTP請求埠是80埠,HTTPS請求埠是443埠,設定好就可以開始抓取了。

抓取請求

開啟chrome瀏覽器,最好清理快取,然後使用隱身模式訪問https://weibo.com/

640?wx_fmt=png

開啟隱身視窗

640?wx_fmt=png

無痕模式


在網頁上執行一遍登入操作

640?wx_fmt=png

微博登入過程


抓取到登入過程後,我們就可以開始分析了,記住一定要清理快取。我有好幾次抓取都不一樣,後來換了Safari瀏覽器(因為我很少用這個),其實這一步用什麼瀏覽器都無所謂,chrome瀏覽器主要是用來除錯JS用的。

過程分析

查詢登入請求

登入一般url裡面應該都會有login,而且是post請求,當然不排除其他方式。
https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)

640?wx_fmt=png

登入請求url

找到登入請求後,這裡主要關注Form表單資訊,引數很多,我們需要先大概區分一下哪些可能是固定引數,哪些是變化的引數。

640?wx_fmt=png

引數確定

一目瞭然可以看到那些是固定的了吧,這些所有的引數其實我們都是可以追根溯源的,但是沒那個必要,在這種引數比較多的情況下,太費事了,可以採用多次抓取登入過程,對比請求引數的方式確定部分固定的或者不重要的引數,那麼需要我們通過其他方式獲取的引數有pcid、door、su、servertime、nonce、rsakv、sp、prelt,這裡servertime比較有爭議,一般看到這種time或者151開頭的10位或者13位數字,都是時間戳,用time.time()獲取就可以,但是這裡是servertime,我們應該引起注意。

引數分析

下面我們一一來看這幾個引數怎麼獲取

  • su
    我們要先說一下這個su,因為其他的引數都和它有關係。這個su在js除錯的時候可以看到它的演算法,但是其實我們可以根據它的特點先猜測一下,有可能是base64加密的。為什麼?

Base64是一種基於64個可列印字元來表示二進位制資料的方法,哪64個字元呢?            
A-Z、a-z、0-9和"+"、"/",很多時候base64加密的字串尾部為 1個或2個  "=",
因為它是把3個位元組的二進位制拼接,如果最後剩下一個,那麼尾部就會新增2個=,
如果剩下兩個,尾部就新增1個=,如果剛合適那當然就沒有=了

推薦一個工具網站https://tool.lu/encdec/

640?wx_fmt=png


使用編解碼試試看,最終我發現是賬號,而且是採用了url encode和base64編碼,所有最終我們的su就是

640?wx_fmt=png

  • pcid、servertime、nonce、rsakv
    它的值時gz-48fb749c5c715e0d5caeed045716492e153c,我們先在Charles中搜索一下

    640?wx_fmt=png

    pcid


    我們一般都是搜尋response的資料,主要是看一下是不是在某一個請求的返回值裡面,這裡非常棒,我們找到了pcid和值出現的地方https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=MTgwOTE3MzQxMzY%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1518956150179,在這個請求的返回值裡面,而且我們還有意外的收穫,我們得到了四個引數,和登入請求裡面的一樣,?我們現在確定了四個引數的來源,

    640?wx_fmt=png

    image.png


    看一下請求的引數

    640?wx_fmt=png


    除了su和下面的時間戳其他的引數基本固定,時間戳沒什麼特點,我們就用int(time.time() * 1000)生成,因為是13位的。su我們上面已經知道了。那麼這四個引數也搞定了✌️

  • door
    door很熟悉吧,是驗證碼。那麼驗證碼的請求怎麼確定,非常簡單因為我們的驗證碼是一張圖片,所以找圖片請求就可以了

    640?wx_fmt=png

    驗證碼

  • 這個往上翻一翻就能很快找到,找到後我們看看它的引數

    640?wx_fmt=png

    引數


    p的值就是pcid的值,我們已經知道了。r有點不太好找了,先在Charles裡搜一下62026273,沒找到,那麼應該就是本地生成的,其實你可以寫死試試,有沒有問題。除了搜這個值以外,我們還可以搜一下這個請求是在哪裡生成的,看它附近有沒有有用的資料。

    640?wx_fmt=png


    搜一部分就行了,先用小部分搜,如果結果太多,在多加一些搜尋,這裡我們找到了一條,點選去看一看,點到JavaScript那個頁籤,Charles會幫我們格式化js

    640?wx_fmt=png

    找到了pincodeUrl,再搜尋一下pincodeUrl

    640?wx_fmt=png


    看到沒有,開不開心?激不激動?

    640?wx_fmt=png

    驗證碼請求

  • prelt
    這個引數和驗證碼請求的那個r引數類似,值搜不到,但是我們可以搜這個prelt,你問r那個為啥不搜?[鄙視眼]你猜猜能搜到多少?

    640?wx_fmt=png


    同樣點進去,切換到JavaScript頁籤,發現了preloginTime,再搜它吧

    640?wx_fmt=png

    640?wx_fmt=png


    多搜一些你就發現它應該是個時間段,結合prelt本身的值,我們就可以構造出一個值。可以通過多次請求來確定一個範圍,另外時間差,而且它用的是本地的時間計算的,那麼也不需要多麼精確,確定一個範圍應該就可以了,所以在一個範圍內取隨機數就行了

    640?wx_fmt=png


    -sp
    最麻煩的來了,sp這麼長一段,觀察其特點,發現應該是16進位制,所有字元都是在0-9、a-f之間,而且引數pwencode的值rsa2,基本上我們就可以確定其採用的是rsa加密演算法。這串字元肯定是搜尋不到的,可以搜sp,刪掉明顯不是的,我們一般看的是sp=xx這樣的,就是看賦值,從賦值的操作上下文去檢視

    640?wx_fmt=png


    經過過濾分析,只剩下兩個地方

    https://passport.weibo.com/visitor/visitor?entry=miniblog&a=enter&url=https%3A%2F%2Fweibo.com%2F&domain=.weibo.com&ua=php-sso_sdk_client-0.6.23&_rand=1518956141.4946https://js1.t.sinajs.cn/t5/register/js/v6/pl/register/loginBox/index.js?version=d7a77880fa9c5f84

    640?wx_fmt=png


    然後開啟chrome瀏覽器,開發者工具,然後訪問https://weibo.com,切換到source頁籤找到這兩個js檔案,並搜尋sp,通過觀察特點基本確認為第二個js檔案

    640?wx_fmt=png


    e.sp = b,在b的計算之前打上斷點,然後執行登入操作,這裡我們還發現了su的計算演算法,跟我們上面分析的基本一致

    640?wx_fmt=png


    通過除錯這段程式碼我們就得到了其加密方式,這裡有幾個變數me.rsaPubkey、me.servertime、me.nonce、b,通過console中檢視b是密碼,然後就是這pubkey

    640?wx_fmt=png


    在上面pcid引數的請求的返回值裡面我們看到有這個值。OK這幾個變數我們都知道了,下面你瞭解一下rsa加密演算法的python實現,直接貼程式碼

    640?wx_fmt=png

執行登入請求

登入請求的所有引數都已經分析完了,登入後檢視response資料

640?wx_fmt=png


然後再看一下登入請求的下一個請求,發現是通過登入請求的返回值中的url,然後傳送此請求

640?wx_fmt=png


返回值中又出現了另外一個url,我們在下面也找到了,提取url傳送請求

640?wx_fmt=png


看到返回狀態了嗎?302重定向。傳送請求以後檢視一下response的url,發現是在它下面的請求地址

640?wx_fmt=png

640?wx_fmt=png


返回值和下面的請求好像有點關聯,有下一個請求的引數。別急,先等等,我們就這樣一直請求、提取請求、再請求,得有個終點吧,到哪裡算一站呢。我們想想登入以後,顯示一個頁面有使用者名稱。我們只要能得到這個使用者名稱那就說明登入成功了。

640?wx_fmt=png


這裡看到了這個home請求中出現了我的使用者暱稱,然後上面那個請求的返回狀態302,又是重定向。使用上面的方式確認一下。提取userdomain,然後拼接https://weibo.com/

640?wx_fmt=png


成功了

640?wx_fmt=png

這一次寫這篇博文就順暢多了,還是知識積累的問題。後面還有一篇百度登入分析的,發現百度這個確實是很複雜,目前還沒搞定。盡請期待哦。

- The End -

點選圖片get往期內容

640?wx_fmt=png

640?wx_fmt=gif