前言
這篇文章因為涉及到JS解密部分,所以難度比較高,Python基礎比較薄弱的同學可以來看看思路。
開始
進入到該網站後我們可以看到如下界面,今天要做的內容就是模擬登陸
那麼咱們首先抓到登陸的包看看:
登陸的同時總共發送了兩次post請求,在登陸前發送了一次,其中需要攜帶的參數為用戶名,還有一個donotcache不難猜測出是一個時間戳,但是光靠猜不行,要拿出實際證明。
返回值:
success: true
publickey_mod: XXX
publickey_exp: "010001"
timestamp: "540205950000"
token_gid: "1c51cb6b00061f39"
這些值我們並不知道是用來做什麼的,然後我們可以繼續看下登陸的包:
很明顯,第一眼就可以發現很多問題,cookie與第一次請求必須保持一致,然後第一次請求的返回值timestamp其實就是為了給第二次登陸的包傳參,rsatimestamp=timestamp,然後就是這個也有一個類似時間戳的東西donotcache,最關鍵的就是這個password是加密的!
咱們先解決donotcache是怎麼產生的:
沒猜錯,new Date().getTime()本來就是JS取時間戳的語法,這個咱們用Python編程裡的time模塊模擬就可了。
最關鍵的就是password加密的方式了:
這就有意思了
var password = form.elements['password'].value;
password = password.replace(/[^\\\\x00-\\\\x7F]/g, ''); // remove non-standard-ASCII characters
var encryptedPassword = RSA.encrypt(password, pubKey);
密碼經過了兩次改動,第一次是替換掉字符串,第二次是RSA加密,而這個加密需要用的pubKey,而
var pubKey = RSA.getPublicKey(results.publickey_mod, results.publickey_exp);
所以說我們還需要知道publickey_mod和publickey_exp,這個時候你再好好回想一下,咱們的第一次請求是不是返回值里正好有一個Mod和EXP?
閱讀更多 青燈教育Python學院 的文章