58同城post登陸引數分析,典型的eval加密js案例
58同城的前端登陸js處理還有很有自己的特色的,藏匿了關鍵的js語句、同時混插了html原始碼和js,搜尋關鍵詞基本上都是html原始碼,但是還有事方法還原post引數的來源,下面我們一步步分析。
首先抓個post包看看有哪些引數
source: passport password: 42ef99ddfcfed534a8c9f9745d853451802ec173ff6b39914e219912ca90942130fe0fd220e7aa6d29e67ff29b6ec038f8f489c542ae544dea172aa7a54ad3dd560c7d1d20ce3289d1015cd7839c0d3d9fc7574be3d6fa53c84270c6aa0f8ffd436ced4a2434dc4b95e7e21b5bae4ea180580fa6db483dbb2aa8dc87f0b8ace4 timesign: isremember: false callback: successFun yzmstate: fingerprint: 745425B5EABE10D036C02171090EC40FC1D13ECB0F632851_011 path: https://cd.58.com/?pts=1547035234514 finger2: zh-CN|24|1|4|1366_768|1366_728|-480|1|1|1|undefined|1|unknown|Win32|unknown|3|false|false|false|false|false|0_false_false|d41d8cd98f00b204e9800998ecf8427e|d21717e01c541ae877c90b4be8200041 username: 18328491111 validcode: vcodekey: btnSubmit: 登入中...
就從這個包我們可以大致分析一下:
password是RSA加密的樣子,需要分析
fingerprint像一個身份ID,需要分析
path像一個固定字串加上時間戳,不需要分析
finger2感覺像瀏覽器的一些環境資訊可以做固定值,不需要分析
明確我們需要分析兩個欄位password、fingerprint
全域性搜尋一下password關鍵詞,看看那些地方出現過
只有上面兩處很可疑,但是很明顯難以順藤摸瓜了,嘗試了很多關鍵詞以後,沒有結果,然後在看網站檔案結構倒還發現了一些東西。
login資料夾下有個rsa的檔案,那很明顯就是密碼加密所用的RSA了,開啟看看
果然不簡單eval開頭,在看看這js檔案內容:
關鍵資訊都是編碼了的,無法直接搜尋,先eval解密,解密之後就很好辨認了
再看eval解密後的js檔案尾部,有下面一個函式
function encryptString(str, e, m) {
var key = RSAUtils.getKeyPair(e, '', m);
return RSAUtils.encryptedString(key, str)
}
這就是熟悉不過的RSA加密方式了,那現在從RSA加密逆向搜尋encryptString關鍵詞,還真找到了有用資訊
var timesign = (new Date).getTime() + timespan; $("#p1User").val(encryptString(timesign + encodeURIComponent($("#passwordUser").val()), $("#rsaExponent").val(), $("#rsaModulus").val())); $("#password_value").val($("#passwordUser").val()); $("#btnSubmitUser").val("登入中..."); $("#usernameUser").addClass("fontcolor_cccUser").attr("readonly", "readonly"); $("#passwordUser").val("").addClass("fontcolor_cccUser").attr("readonly", "readonly");
其中關鍵js程式碼:
encryptString(timesign + encodeURIComponent($("#passwordUser").val()), $("#rsaExponent").val(), $("#rsaModulus").val())
這就是密碼加密的方式無疑,沒有涉及到一個關鍵詞,要搜尋關鍵詞定位js的話是不可能的;$("#passwordUser").val()), $("#rsaExponent").val(), $("#rsaModulus").val(),這三個引數分別是從頁面獲取id為passwordUser、rsaExponent、rsaModulus的值,那我們去和html搜尋這三個關鍵詞分別得到下面資訊:
使用者輸入的密碼
RSA加密偏移量01001
RSA金鑰
那這三個RSA加密的引數有了,加密過程就不復述了。
var timespan = 1411093327735 - (new Date).getTime();
var timesign = (new Date).getTime() + timespan;
var pwd = encryptString(timesign + encodeURIComponent(password, iv, pubkey);
接著來看fingerprint欄位
全域性搜尋fingerprint或者其值都沒有發現有可用的資訊,最後實在沒招了,才想起來還cookie沒看,然後在cookie中找到了有用資訊
ppStore_fingerprint經過URL解碼後加上+011就是fingerprint
至於validcode、vcodekey幾個欄位在沒有驗證碼的情況下都是空;
總體來說58同城的前端加密還是有點意思的,至少要讓很大部分人琢磨好一會了,文中只是分析了整個流程,由於時間限制沒有用python進行驗證,有興趣的網友可以試試,同時可以保持交流和學習。
ID:Python之戰
|作|者|公(zhong)號:python之戰
專注Python,專注於網路爬蟲、RPA的學習-踐行-總結
喜歡研究技術瓶頸並分享,歡迎圍觀,共同學習。
獨學而無友,則孤陋而寡聞!