分析登錄過程的話有很多工具可供選擇串结,F(xiàn)iddler等抓包工具都是很好的選擇。不過這次不需要舅列,由于登錄過程需要在瀏覽器上完成肌割,所以我們這次直接使用瀏覽器的F12開發(fā)人員工具≌室火狐把敞、Chrome、Edge的F12工具都差不多榨惠。這次我就以Edge的為例來說明奋早。
熟悉調(diào)試工具
一開始由于我的調(diào)試姿勢不正確,所以浪費了很多時間赠橙。在這里我把我的人生經(jīng)驗分享一下伸蚯。其實很簡單,就是一句話:瀏覽器必須進入隱私模式简烤。因為瀏覽器有可能保存以前的登錄信息、cookie等摇幻,對分析工作造成混淆影響横侦。所以我們必須不斷地調(diào)試不斷地清除數(shù)據(jù)挥萌。不妨直接進入隱私模式,這樣所有東西都是新的枉侧,方便我們分析引瀑。
來上兩張圖看看。首先是調(diào)試工具榨馁。在這里我們主要看的就是cookie的值憨栽。網(wǎng)頁登錄的每一步驟我們都需要看看新增加了什么cookie,哪些cookie在登錄過程中是必要的翼虫。這需要我們一步一步分析屑柔。
第二個部分就是網(wǎng)絡(luò)標(biāo)簽。在這里就是我們主要分析的地方了珍剑。登錄過程中哪一部分發(fā)送了什么類型的數(shù)據(jù)掸宛、發(fā)到了哪個URL、服務(wù)器返回了什么結(jié)果招拙,都需要我們分析唧瘾,然后模擬出登錄過程。這里橫排的幾個按鈕還可以清除緩存别凤、cookie饰序、記錄等等,如果我們需要重復(fù)分析规哪,這幾個按鈕是非常方便的求豫。
這里有一個小技巧,那就是內(nèi)容類型這里由缆。一個網(wǎng)頁常常包含了很多靜態(tài)文件注祖、需要從很多CDN返回圖片等,但是這些都是和登錄內(nèi)容無關(guān)的東西均唉。所以我們可以在這里選擇需要查看的內(nèi)容是晨,圖片之類的幾乎完全可以忽略(當(dāng)然如果遇到驗證碼,還是需要分析一下)舔箭。
如果還有什么不熟悉的地方罩缴,最好自己打開幾個網(wǎng)頁,然后用開發(fā)人員工具看看层扶。一個合格的程序員箫章,利用調(diào)試工具的技能肯定是必不可少的。另外Edge的開發(fā)人員工具是中文的镜会,對于英文不好的同學(xué)還是很友好的檬寂。
登錄過程分析
獲取BAIDUID
按照上面的技巧,打開一個隱私模式網(wǎng)頁戳表,然后把開發(fā)人員工具調(diào)教到合適的位置桶至。然后進入百度主頁面www.baidu.com
昼伴。回到調(diào)試工具看看瀏覽器在這一步做了什么镣屹。
首先第一步是訪問了https://www.baidu.com/
這個地址圃郊,作用是設(shè)置了BAIDUID這個cookie。后續(xù)的請求我們都需要附上這個cookie女蜈。該cookie只有在附有UA的時候才會返回持舆。
獲取登錄token
然后我們點擊百度首頁右上角的登錄,看看會發(fā)生什么伪窖。這一步步訪問https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1491554358163&class=login&gid=134D887-FD18-4D86-AED8-0880DCA39820&logintype=dialogLogin&callback=bd__cbs__m6q67t
這個地址逸寓,可以看到它帶了很多參數(shù)。其中只有兩個參數(shù)需要我們注意:一是tt參數(shù)惰许,代表當(dāng)前時間的毫秒數(shù)席覆;二是gid,也就是GUID汹买,我們用Python代碼就能生成佩伤。其他參數(shù)不變就行了。
這一步如果成功的話晦毙,服務(wù)器就會返回一個JSONP生巡。這里最重要的就是data中的token了。我們后續(xù)的登陸請求就需要這個玩意见妒。
bd__cbs__m6q67t({
"errInfo": {
"no": "0"
},
"data": {
"rememberedUserName": "",
"codeString": "",
"token": "7ddcb9b9dd7b57623a77730c53b4df76",
"cookie": "1",
"usernametype": "",
"spLogin": "rate",
"disable": "",
"loginrecord": {
"email": [],
"phone": []
}
}
})
獲取驗證碼
這時候頁面上應(yīng)該已經(jīng)彈出登錄對話框了孤荣,有時候好像還是直接在頁面上登錄。這幾種登錄方式?jīng)]有區(qū)別须揣,只不過上面的logintype參數(shù)可能會有不同的值盐股,這不會影響我們的登錄過程。
在登錄框中輸入用戶名耻卡,當(dāng)輸入密碼的時候會彈出驗證碼疯汁。然后我們返回開發(fā)工具看看瀏覽器做了什么。
這次發(fā)出的請求URL是https://passport.baidu.com/v2/api/?logincheck&token=7ddcb9b9dd7b57623a77730c53b4df76&tpl=mn&apiver=v3&tt=1491497010074&sub_source=leadsetpwd&username=%E9%82%AA%E7%8C%AB%E9%98%BF%E6%9E%AB&isphone=false&dv={dv}&callback=bd__cbs__p5fzjy
卵酪,這個URL其實很長幌蚊,因為有一個很長的dv參數(shù)。這個dv參數(shù)是登錄頁面隱藏表單域的一個部分溃卡,用的時候把它取出來即可溢豆。變化的只有一個編碼的用戶名參數(shù),剩下的基本都是固定值瘸羡。
我們看到這個請求用到了用戶名漩仙,所以對于每個不同的用戶名,都會重新發(fā)送一次請求。如果你在登錄框中更改了用戶名讯赏,那么就會瀏覽器就會重新發(fā)送請求垮兑,順便驗證碼也會刷新。
請求返回的結(jié)果同樣是JSONP漱挎。重點就是codeString和vcodetype兩個參數(shù)了。
bd__cbs__p5fzjy({
"errInfo": {
"no": "0"
},
"data": {
"codeString": "tcG7d07e2dcb2f8c18d02dc14669801a07b9bcd440666043195",
"vcodetype": "46dbjrl3l5wu82vPoSiQz/tmNWQIm1xOR0JMD0I7U/UjpgY6Sye/mCtpzMJEvJTK3PJ2hGntFKiNnDNLxjd3bmxt7FlJ3yaomPUj",
"userid": "",
"mobile": ""
}
})
由于我們把圖片的請求過濾了雀哨,所以調(diào)試工具只給出了這些請求磕谅。下面我們把圖片那一項選中,然后在網(wǎng)頁上選擇更新驗證碼雾棺,看看會出現(xiàn)什么膊夹。
這次請求圖片的URL是https://passport.baidu.com/cgi-bin/genimage?tcG9c07c1deb266c1790286146443019a7f46b1430702017e69
,這里的參數(shù)正是上面的codeString捌浩。而這個請求的返回值正是驗證碼圖片放刨。每次重新請求,都會發(fā)送一個新的驗證碼圖片尸饺〗常看到這里,圖片這一塊的問題就解決了浪听。我們可以選擇再次過濾圖片請求螟碎。
然后我們在網(wǎng)頁上填寫驗證碼,瀏覽器會將驗證碼發(fā)送給服務(wù)器驗證迹栓。在開發(fā)人員工具中可以看到掉分,這次的請求是https://passport.baidu.com/v2/?checkvcode&token=7ddcb9b9dd7b57623a77730c53b4df76&tpl=mn&apiver=v3&tt=1491499485871&verifycode=BFIM&codestring=tcG3907c1deb2eac174026314a24301df7f5820430750017e35&callback=bd__cbs__66bgjs
,verifycode參數(shù)正是我們填寫的驗證碼克伊,剩下的參數(shù)都已經(jīng)介紹過了酥郭。這次請求返回的結(jié)果會提示驗證碼輸入是否正確。
獲取密鑰
瀏覽器還會發(fā)送請求https://passport.baidu.com/v2/getpublickey?token=571fd331d62e4c8dc56c4c9a8788e0b8&tpl=mn&apiver=v3&tt=1491559255612&gid=027CF18-F8F4-47EB-BD7C-A48337DD5F8F&callback=bd__cbs__m915m4
來獲取加密密碼的密鑰愿吹。
請求的結(jié)果就是下面的JSONP不从,包含了公鑰pubkey和密鑰key。
bd__cbs__ksjbq7({"errno":'0',"msg":'',"pubkey":'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXN3F7epcT2k2yjuw95Nd3iEDS\nz04mTwPUAOaZIQ+JWtawDWMh6+hpwnT8STs1fa5CZwb1L\/nam4zqu\/Y4zETCp\/uL\nSl8\/6jdNsjVtiyq+IlQ0IkmPHiSk022BfBw0RGrSMUGuPPvdjy0eJ5a5pzRYWfK7\nvJ0QdYEdTovg7hm70QIDAQAB\n-----END PUBLIC KEY-----\n',"key":'KTS4sxpzVAnKxSxAej7ZfPgZE5neIy85'})
最終登錄
當(dāng)驗證碼填寫正確的時候洗搂,我們就可以點擊登錄按鈕登錄了消返。這次會向https://passport.baidu.com/v2/api/?login
發(fā)送一個POST請求,請求體就是登錄所需要的全部信息了耘拇。
這些信息非常多撵颊,不過所有所需信息都在上面解釋過了。唯一需要注意的就是password參數(shù)惫叛,這需要通過上面獲取的密鑰進行加密倡勇。非常遺憾的是,具體的加密算法我沒有找到嘉涌∑扌埽看那些參數(shù)的名字我猜應(yīng)該是RSA加密夸浅,可惜我沒有從百度的一大堆JS中找到那段加密代碼。
apiver: v3
callback: parent.bd__pcbs__6j4pna
charset: utf-8
codestring: tcG0407c116b36dc11202ae14e24301427f443077f047e16
countrycode:
crypttype: 12
detect: 1
dv: MDEwAAoAyAAKAIAACAAAAF0HLFwIAFcjL5-f3lKfG9Nz7y7PS6s3kzZDthxYCACLqnvXF69nt3eXQ5t7q0-Pb4tDk1ObX49rr3ujY69vq2-_bBQIABMvLy8EBAgAGy8nJxkK0FQIACMvLypHWOjiiBAIABsnJy8r_zQICABDKysrKrq6ur_SzX1wICjsP
gid: E2D73BA-FC75-44B1-A051-BA0E6B4F9ED9
idc:
isPhone:
loginmerge: true
logintype: dialogLogin
logLoginType: pc_loginDialog
mem_pass: on
password: k2KCYNYLju5rt08imdZGdavn62s71kGnHYiALR%2FmZMmKfw2WgkNdkuddhqIm7QtSokqs84nDqyBh67cZRUV79iAEllJjO0l3lq1RMBmR49hMS1iKsIFiPUe%2F7NkooiVvaYCDqtZH1tHw3AtUkVKuL9O9lHswDDn%2Bwy9WTs%3D
ppui_logintime: 91424
quick_user: 0
rsakey: 8qbRUQebUUsasdmeawvQNIAGvJqgT3DD
safeflg: 0
splogin: rate
staticpage: https%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html
subpro:
token: 422d13308efaf3fb8aa05606c13147cc
tpl: mn
tt: 1491560392290
u: https%3A%2F%2Fwww.baidu.com%2F
username: %E5%86%B7%E6%BC%A0%E5%B0%98%E4%B8%96
verifycode: %E6%9A%82%E5%81%9C
所以這篇文章只能到這里結(jié)束了扔役。不過現(xiàn)在百度賬號的安全機制也比較完善了帆喇,基本上繞不過驗證碼這道工序,也就是說無論如何都必須人工登錄亿胸。所以有這功夫研究登錄過程不如直接把BDUSS
參數(shù)復(fù)制過來省事坯钦,而且也更加安全。