分享一個破解JS登陸的案例,源碼地址 github.com/GoJerry/xin…javascript
網站以下:[www.airchina.com.cn) 下面是登陸的抓包:java
一個 XHR 請求,下斷點。或者搜索請求參數python
打完斷點後,從新發起請求,結果以下:git
此時的斷點位置,通常是一個 XMLHttpRequest 的請求操做。因此咱們順着調用棧往回追。github
找到了密碼加密的地方,看代碼調用了兩次 h 函數。 其中第二次調用的的參數是將第一次返回的結果加上 d.mdValue 的值! 咱們點擊進入 h 函數dom
將這部分代碼扣下來,寫到本地 JS 文件中函數
在本地運行一下和網站上結果進行比對驗證網站
能夠看到 password 這個參數對上了。 後面還有兩個 nonce 和 xyz 的參數,直接全局搜索,找到加密位置打上斷點以下!加密
注意關鍵地方spa
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 逆向須要耐心調試,同時要理清思路,調試過程當中發現的加密過程要記錄下來,以避免後續再發費時間尋找。同時須要大膽的去假設,多嘗試。