背景
參與過一個爬蟲小應用,爬某招標網站釋出的招標資訊,並根據採購產品關鍵字傳送招標資訊給銷售和高管。
不得不承認,技術就是 money 啊。先從逆向的基礎知識開始入手吧,今天才知道瀏覽器的開發者模式,還有好多我不知道的功能, JavaScript 是如此博大精深!
Sources 面板以 Chrome 為例,F12 開啟,Sources 面板裡面有三個 JS 逆向常用工具,先看看面板內容:
自定義 JS 片段標籤 ① 下面的三個點對應的面板中,有一個可以新增 Script 片段的功能:
這比在 Console 頁簽上編寫 JS 方便多了,這個功能,想起以前在 Console 寫程式碼時沒寫完一不小心 Enter 鍵下去就執行報錯了,真的是相見恨晚吶……
程式碼格式化標籤 ② 的 Pages ,這個很基礎,展示整個網路請求的資原始檔;標籤 ④ 這個符號,我是今天才知道的,可以直接格式化資原始檔,對雜亂無章的 jquery 點選格式化試試:
Filesystem 和 Overrides這兩個功能對 JS 逆向也很實用,目前還沒有測試它們,暫且知道這個東西,哪天完整玩一遍後再補充這塊內容。
重寫 ajax 的事件一直死磕的那個招標網站,這次升級採用的就是對 ajax 請求添加了鉤子事件,傳送請求額外添加了反爬的引數。引數的 key 雖然固定,但是值的生成過程相當複雜,目前測試了偽造,但是後臺通不過,會返回 400 Bad Request 。
現學現用,開啟目標網站後,新增一個 New snippet 片段,利用 prototype 重寫 Ajax 的兩個事件,程式碼如下:
(function() { var openoverride = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function() { console.log( arguments ); return openoverride.apply(this, [].slice.call(arguments)); }; var sendoverride = window.XMLHttpRequest.prototype.send; window.XMLHttpRequest.prototype.send = function() { console.log( arguments ); return sendoverride.apply(this, [].slice.call(arguments)); };})();// 隨便模擬的請求 var xhr = new window.XMLHttpRequest();xhr.open('POST','/hello',true);xhr.send('abc');gotoPage(20); // 頁面自身的函式,要破解的資料請求
點選執行:
控制檯輸出:
這兩個 ajax 請求,都被額外添加了一個 key 固定,值不明規則的引數,這個就是阻礙爬蟲的壁壘:
現在問題是,偽造引數值也無法透過。既然是在前端生成的這兩個引數,後臺是怎麼使用的呢?而且每次 ajax 請求,這兩個引數值都不同。網上有資料說這是防重放的,我模擬時用按這倆引數的長度使用隨機串,也騙不過後臺。
這是一個大坎兒吶!