實現的目標:可以通過JS加密逆向后,得到加密參數,請求獲取數據。此方法同樣適用于被前端JS加密的用戶名、密碼爆破。
JS加密逆向分析
首先,分析獲取數據的API。抓包,發現是:
??
這個網站不存在分頁,是鼠標下滑動態加載數據的,所以利用selenium爬蟲效率低,效果也不是很好。
當然如果是菜鳥,最好還是利用這種方式。
先爬一下看看,發現返回的數據是加密的,先不管他。
我們分析請求參數,發現是兩個加密的請求參數,分別是payload和sig。
如果把這兩個參數去掉,或者這兩個參數是錯誤的,則request無法返回正確的數據。
所以,需要對這兩個進行JS逆向,還原加密算法。
經過調試發現規律如下(至于怎么找斷點,怎么找到實現加密算法的位置,本篇不做介紹)。
找到了sig的地方,下斷點:
調試截圖如下(只截圖了payload的方法):
Payload加密分析:
首先是payload加密,payload加密前:
{sort: 1, start: 40, limit: 20}
需要“翻頁”動態加載數據,只要需要更改start即可,這個表示是開始條數,limit表示一次加載20條,比如60、80、100、120等等。
第1次進入e2(e) ,進去前e還是明文的payload,進去了_u_e(e) 返回t '{"sort":1,"start":40,"limit":20}' 值沒變。
接著返回e2(e)繼續執行for循環,返回的值如下。這個時候,payload被加密了,但是還不是返回的值,繼續下一步調試。
",x177WB:d`ym{1L$'=x10nx02x04x15p8[ '&olwx022"?
接著到了第一次進入e1(e) 中,這個時候e就是加密后的payload傳進去。返回u,就是加密的payload了。
LBc3V0I6ZGB5bXsxTCQnPRBuBwYJfnZeJCM7OXR/AH8q??
這個是只要payload不變,加密值就不變,還是相對比較簡單的。
sign加密分析
sign的值是把加密后的payload值加上常量_P拼接后,作為參數,傳到sig(e)中去,payload+_P如下:
LBc3V0I6ZGB5bXsxTCQnPRBuBwYJfnZeJCM7OXR/AH8qW5D80NFZHAYB8EUI2T649RT2MNRMVE2O
這里的e就是加密后的payload,而sign調用的方法是md5(e + _p).toUpperCase(),結果是:
1268D4D682CF9D0C6C3CB4D6E4C3C87F
new t(!0).update(n)[e]() 是payload + -p這個常量:t.prototype.update = function(e) 實際就是這個函數
他又調用了hex函數 finshed函數 調用了 hash函數
LBc3V0I6ZGB5bXsxTCQnPRBuBwYJfnZeJCM7OXR/AH8qW5D80NFZHAYB8EUI2T649RT2MNRMVE2O
跟蹤分析發現,就是一個普通的md5加密函數,然后轉換成大寫。這個就可以不用JS實現,直接python實現MD5加密。
使用Python去實現以上兩個參數的加密,修改原來的python腳本如下:
再次請求:
發現返回的值是d,也是加密的,可以使用攔截技術,獲取到JS解密函數,解密d得到明文。
審核編輯:劉清
-
python
+關注
關注
56文章
4807瀏覽量
84950
原文標題:python爬蟲之某站JS加密逆向分析
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論