­

JS逆向之新榜登錄

  • 2019 年 12 月 4 日
  • 筆記

分享一個破解JS登錄的案例

抓包調試

下面是登錄的抓包:

登錄

一個 XHR 請求,下斷點。或者搜索請求參數

斷點

打完斷點後,重新發起請求,結果如下:

分析

此時的斷點位置,一般是一個 XMLHttpRequest 的請求操作。所以我們順著調用棧往回追。

找到了密碼加密地方,程式碼調用了兩次 h 函數。 其中第二次調用的的參數是將第一次返回的結果加上 d.mdValue 的值!我們點擊進入 h 函數

函數h

將這部分程式碼扣下來,寫到本地 JS 文件中

在本地運行一下和網站上結果進行比對驗證

可以看到 password 這個參數對上了。 後面還有兩個 nonce 和 xyz 的參數,直接全局搜索,找到加密位置打上斷點如下!

注意關鍵地方

 var j = h();   return g.nonce = j,   i += "&nonce=" + j,   g.xyz = d(i)  

參數 nonce 是從函數 h 返回的。參數 xyz 是從函數 d 返回的!繼續往下調試:

原來和之前函數加密是同一個函數。 到這裡基本上加密函數都找出來了,接下來就是理清思路,找對參數。

驗證

其實,這兩個 JS 加密函數都可以用 Python 程式碼來轉換! 其中密碼加密的那個函數是 MD5

def md5(parm):      hl = hashlib.md5()      hl.update(parm.encode(encoding='utf-8'))      sign = hl.hexdigest()      return sign  

nonce 就是一個隨機生成的參數,也能用 Python 改寫,如下:

def non():      li = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]      nonce = ''.join(li[random.randint(0, 15)] for _ in range(9))      return nonce  

直接來驗證下吧,結果如下:

登錄成功了!

總結

JS 逆向需要耐心調試,同時要理清思路,調試過程中發現的加密過程要記錄下來,以免後續再發費時間尋找。同時需要大膽的去假設,多嘗試。