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