1. 程式人生 > >58同城post登陸引數分析,典型的eval加密js案例

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的學習-踐行-總結

喜歡研究技術瓶頸並分享,歡迎圍觀,共同學習。

獨學而無友,則孤陋而寡聞!