csdn帳號密碼登錄剖析(模擬登錄)
- 2019 年 10 月 6 日
- 筆記
大綱
- 前言
- 分析加密參數
- uaToken
- webUmidToken
- 發送模擬請求
- 對比解決障礙
- 瀏覽器發送
- postman模仿
- 小結
- 編寫程式碼
前言
- 很久以前研究過csdn的模擬登錄,記得那個時候的csdn登錄還是一個`form``表單,然後參雜著一些參數。使用遍歷input元素把表單各個參數拿下來。存下直接post即可登陸成功。
- 前幾天再次看了下親愛的csdn。突然發現多了這連個參數。這就勾起了我的性趣和好奇心:我靠,就一年沒見,csdn也搞這麼一大串
加密?並且以看兩種加密方式還不一樣哇?有點東西! - 下面就分享一下分析的過程!由於時間有限,只能每晚抽點時間研究,如果大家感覺不夠深入或者講的不好請諒解!
使用工具:
- Google瀏覽器
- postman發送請求調試
- fidder抓包

分析加密參數
可以根據上圖分析得知:有uaToken 和webUmidToken兩個token。 分析參數肯定是要打斷點的,一般有直接搜索,查看js調用堆棧,和hook查找找到參數位置。我是利用搜索找參數。 分析前先做好一些預備工作,多發幾個請求,刷新頁面。你會發現:
- 不刷新頁面的話uaToken不會變化。
- webUmidToken每次都不一樣。
- 每次cookie不變。
uaToken

- 查找uaToken發現這段程式碼比較詭異。打斷點debug。發現沒錯,這就是我們要找的!點擊F11,進入子函數查看發生了什麼。

- 進去發現它執行e()函數。再次F11查看。

- 通過校驗發現e函數其實就是一個加密函數,關鍵是它跟我們的
核心數據(帳號、cookie、密碼等)無關,所以這個加密數據空有其架勢無作用。你可以保存一個直接一直使用一個(如果可逆後台可能會根據字元串進行校驗是否符合規則)。

webUmidToken
每次刷新都會發現他在變化,鑒於前面的token都沒啥作用,我大膽猜測,他也不影響登錄!就先不debug分析了。
實際上他對結果也是沒有影響的,這裡就不進行分析,先發送請求!



發送模擬請求

- 通過瀏覽器的頭髮送請求資訊。你會發現:
不管你怎麼模擬都是各種錯誤,要麼類型錯誤,要麼繁忙,要麼類型錯誤。(可以看得出csdn是java後台,個人感覺介面異常處理的還有問題。暴露方法了)

對比解決障礙
有時候瀏覽器太過於局限。用fidder找到其中不同之處。用瀏覽器和postman發送請求找到其中參數的不同之處。
瀏覽器發送


postman模仿


- 你可以發現其中主要是格式區別,和部分頭資訊瀏覽器不顯示需要加上。然後發送請求檢驗!


小結
- 後來發現其實那兩個token,和cookie為空都沒有關係!
- cookie也沒有限制,在登錄時候根本不要cookie都可以。按理論來說應該進入頁面返回一組cookie,用這個cookie訪問登錄介面有效才行,顯然csdn沒有。
- 分析一波約等於白分析,登錄機制太簡單了。
- content-length別亂加,加錯了它後台校驗或出錯
- 也就是登錄著需要type,帳號密碼即可,其他設為空都行。要注意的就是
參數發送的格式!raw文本。 - 以後見到類似先
測試登錄,不能盲目分析。雖然能夠增加經驗,但是有點浪費時間。。像csdn這次就是。。啥都沒用。
編寫程式碼
思路:訪問登錄介面,用返回的cookie訪問我關注的人的文章!
import requests from bs4 import BeautifulSoup url='https://passport.csdn.net/v1/register/pc/login/doLogin' header={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36', 'referer':'https://passport.csdn.net/login', 'origin':'https://passport.csdn.net', 'content-Type':'application/json;charset=UTF-8', 'x-requested-with':'XMLHttpRequest', 'accept':'application/json, text/plain, */*', 'accept-encoding':'gzip, deflate, br', 'accept-language':'zh-CN,zh;q=0.9', 'connection': 'keep-alive' ,'Host': 'passport.csdn.net' } data='{"loginType":"1","pwdOrVerifyCode":"你的密碼",' '"userIdentification":"你的帳號","uaToken":"",' '"webUmidToken":""}' req=requests.post(url,data=data,headers=header) cookies = requests.utils.dict_from_cookiejar(req.cookies) res=req.text print(res) print(req.status_code) print(cookies) url2='https://blog.csdn.net/nav/watchers' req2=requests.get(url2,cookies=cookies) soup=BeautifulSoup(req2.text,'lxml') print(soup.text)