【網(wǎng)絡(luò)爬蟲教學(xué)】一分鐘帶你快速尋找JS加密入口(二)

Hi,大家好,歡迎大家參閱由IT貓之家精心制作的JS實(shí)戰(zhàn)系列教學(xué)課程,我是作者叮當(dāng)貓,在上期教學(xué)中,我們學(xué)習(xí)了如何快速分析基于Header授權(quán)加密協(xié)議,同時我們也初次接觸到了鉤子(hook)的概念,鉤子在JS中可以說是較為高級的概念,如果大家有在操作系統(tǒng)中使用過鉤子,那么你一定對這個不陌生,在windows中,我們常用的操作諸如,點(diǎn)擊、拖拽、滑動、或者是輸入,這些操作統(tǒng)統(tǒng)都是基于底層API通過發(fā)送消息實(shí)現(xiàn)的,比如我們要在某編輯框輸入信息,我們會先取得子窗口的句柄(即選中窗體,按預(yù)定事件是否獲取焦點(diǎn)等),然后才能向該句柄發(fā)送text指令,當(dāng)CPU得到響應(yīng)后會根據(jù)相關(guān)指令完成相應(yīng)的操作,而鉤子在這一發(fā)送的過程中可以作為一個中間人為您監(jiān)聽、篡改報文、或攔截報文等作用,當(dāng)然它不是必須的,除非你想要,事實(shí)上它就是一種消息中斷機(jī)制,如上述所言,它可以監(jiān)聽一切傳送的內(nèi)容,那么在JS中,它的作用也是類似的,今天我們將會學(xué)習(xí)如何通過鉤子快速定位到Cookie加密協(xié)議入口,在此之前如果您是第一次觀看本教學(xué),歡迎前往:網(wǎng)絡(luò)爬蟲頻道查閱,本期我們就一起來探討下,在日常爬取數(shù)據(jù)的過程中,當(dāng)我們遇到Cookie加密授權(quán)時該如何處理,我們將以越捷航空官網(wǎng)作為演示的目標(biāo),如大家有不懂的歡迎留言,或加入我們的QQ技術(shù)交流群探討:544185435

【網(wǎng)絡(luò)爬蟲教學(xué)】一分鐘帶你快速尋找JS加密入口-視頻版

由于國內(nèi)頻道遭版權(quán)問題封禁,上傳不了,所以目前僅上傳Youtube,如需觀看視頻請前往源站:IT貓之家_JS實(shí)戰(zhàn)系列之Cookie加密協(xié)議分析

步驟

需準(zhǔn)備Fiddler(抓包用)、Chrome(調(diào)試與分析)

我們打開Fiddler,為了方便我們分析數(shù)據(jù),建議大家配置過濾器,僅過濾我們需要的信息,如上圖我們將面板切換至Filters項,勾選“Use Filters”旁邊的復(fù)選框,Hosts選項分別選擇:1. Show only Internet Hosts、2. Show only the following Hosts;并在編輯框中輸入“*. 要過濾的URL(不包含前綴) ”以分號結(jié)束,如越捷航空的URL為:?https://www.vietjetair.com/?則規(guī)則應(yīng)寫成:*. vietjetair.com ;意為泛匹配的意思,填寫完畢后點(diǎn)擊右上角的“Changes not yet saved.” 保存。

步驟二

打開越捷航空官網(wǎng)、選擇航班進(jìn)行搜索、通過Fiddler抓包后分析相關(guān)請求,并尋找出攜帶加密Cookie的接口

我們打開越捷航空的官網(wǎng),并確定一下Fiddler是否正常能正常過濾出我們預(yù)設(shè)的域名。

隨便輸入航線、日期,這里我們選擇單程,也可以按默認(rèn),選擇完畢后點(diǎn)擊查詢航班按鈕。

點(diǎn)擊跳轉(zhuǎn)后的結(jié)果頁面是這樣的,可能存在跳轉(zhuǎn)中斷問題,即跳轉(zhuǎn)后空白無響應(yīng),這是因為網(wǎng)站監(jiān)測到你的流量異常,重新多試幾遍即可,或者換瀏覽器。

如果您正確的配置了Fiddler,應(yīng)該會出現(xiàn)如上圖所述的請求鏈接,也就是說我們要分析的加密就在上述的鏈接之中。

在分析請求之前,我們必須先找到實(shí)際的請求URL有哪些,如果您此前有做過航司爬蟲方面的工作,我相信您肯定一眼就能看出哪個是請求的接口了,這個站的請求接口為:https://booking.vietjetair.com/ameliapost.aspx?lang=zh 我們可以通過Fiddler的WebForms面板查看,如果您不知道如何找到該面板,請在Fiddler中切換至Inspectors項,它的子菜單欄中就能看到WebForms選項了,通常查詢接口包含始發(fā)站點(diǎn)(通常三字碼)、到達(dá)站點(diǎn)(通常三字碼)、日期、貨幣、人的類型(成人/小孩/嬰兒)、與其它必要數(shù)據(jù);

我們將面板切換至Cookies選項,通過分析,我們可以在:https://booking.vietjetair.com/TSPD 開頭的這個請求接口中看到一串已“TSdc75a61a_74”開頭的Cookie,而這串Cookie正是我們本次要分析的目標(biāo)字段,當(dāng)然如果你分析下去后,你會發(fā)現(xiàn),其實(shí)這個字段僅僅只是開始而已,后面有好幾個類似的字段都需要我們?nèi)ソ饷?,之所以我會以這個站作為教學(xué)的目標(biāo)站點(diǎn),因為它足夠的復(fù)雜。

步驟三

開啟Chrome Conse、嘗試在控制臺中全局搜索與“TSdc75a61a_74” 相關(guān)的請求、通過Mouse斷點(diǎn)進(jìn)行調(diào)試

跟以往一樣,我們可以先去嘗試下通過關(guān)鍵詞搜索方式在Chrome控制臺中進(jìn)行全局匹配,如果您此前還未曾使用過Chrome Console,歡迎查看之前的文章后再回來看,很遺憾,我們在找遍所有相關(guān)字段后都沒有匹配到一條合適的URL,那么極有可能這個字段名稱是由JS動態(tài)生成的了,也就是說,這條路行不通。

俗話說,山路不通走水路,通過上面的判斷,我們知道了Cookie加密的字段名稱極有可能是動態(tài)生成的,所以我們不能使用該方式,改用Mouse斷點(diǎn)法測試一下吧!首先我們打開控制臺右側(cè)的“Event Listener Breakpoints”選項,并找到“Mouse”子項,并在“click”旁邊的復(fù)選框中勾上,用以監(jiān)聽鼠標(biāo)的點(diǎn)擊事件(這實(shí)際上就是一個鉤子,而這個鉤子是Chrome內(nèi)置的)。

當(dāng)我們在頁面上點(diǎn)擊查詢航班按鈕后就會發(fā)現(xiàn)網(wǎng)頁被斷了下來,并沒有繼續(xù)跳轉(zhuǎn),我們點(diǎn)擊上圖指向的花括號,用以美化代碼,讓我們分析起來更清晰些。

在經(jīng)過反反復(fù)復(fù)的嘗試之后,我們就會發(fā)現(xiàn),根本沒法正確命中斷點(diǎn),換句話說,根本不能找到入口,因為這個站的加密在頁面跳轉(zhuǎn)的同時就已經(jīng)刪除了加密代碼,所以一旦跳轉(zhuǎn),我們再也找不到加密的入口。

步驟四

編寫鉤子函數(shù),監(jiān)聽Cookie接口信息的收發(fā)、結(jié)合Chrome extension實(shí)現(xiàn)信息中斷與攔截機(jī)制

在經(jīng)過上述步驟的嘗試,我們總結(jié)出一個結(jié)論,就是每種調(diào)試方式都不是萬能的,它們僅僅只是一種方式,事實(shí)上使用Mouse斷點(diǎn)方式確實(shí)可行,只是它需要花費(fèi)大量的時間去調(diào)試、失敗、調(diào)試,再失敗再調(diào)試,這個過程會讓您調(diào)試到懷疑人生,那我們何不以更取巧的方式來實(shí)現(xiàn)曲線救國呢?答案是肯定的,既然這個加密是通過Cookie實(shí)現(xiàn)的,那么我們完全可以通過自定義鉤子來監(jiān)聽它,這里要先聲明一點(diǎn):鉤子也不是萬能的,只有在目標(biāo)函數(shù)加密時使用到了內(nèi)置函數(shù)才可以使用,比如上一期教學(xué)中的Header授權(quán)加密,它采用了setRequestHeader接口,所以我們可以監(jiān)聽并攔截該接口的收發(fā)信息,同理這里我們也可以監(jiān)聽Cookie的接口,實(shí)現(xiàn)方式也非常的簡單,如下。

inject.js文件

var code = function(){

var org = document.cookie.__lookupSetter__('cookie');

document.__defineSetter__("cookie",function(cookie){

if(cookie.indexOf('TSdc75a61a')>-1){

debugger;

}

org = cookie;

});

document.__defineGetter__("cookie",function(){return org;});

}

var script = document.createElement('script');

script.textContent = '(' + code + ')()';

(document.head||document.documentElement).appendChild(script);

script.parentNode.removeChild(script);

這里我們重寫了Cookie的lookupSetter接口,當(dāng)匹配到包含TSdc75a61a的Cookie時,則直接斷下來,所以我們要確定被加密的字段會經(jīng)過該接口,方可進(jìn)行攔截。

manifest.json 文件

{

? "content_scripts": [ {

? ? ? "js": [ "inject.js"],

? ? ? "matches": [ "http://*/*", "https://*/*","<all_urls>"]

? } ],

? "manifest_version": 2,

? "name": "CookieHook",

? "permissions": ["tabs"],

? "version": "0.1"

}

在完成JS文件的編寫后,我們還需額外聲明一個manifest文件,用以聲明這是一個Chrome extension,當(dāng)兩個文件都編寫完成后將其放入一個文件夾中,(兩個文件必須同一目錄),并為目錄取名“CookieHook”,到此完成擴(kuò)展的編寫以上僅僅是一個最簡單的案例,其它功能可自行參考擴(kuò)展官網(wǎng)教程。

步驟五

啟用CookieHook擴(kuò)展插件進(jìn)而捕獲加密數(shù)據(jù)從而實(shí)現(xiàn)快速尋找切入口的目的

在chrome的url中輸入:?chrome://extensions/?然后啟用開發(fā)者模式,點(diǎn)擊加載已解壓的擴(kuò)展程序,選擇剛創(chuàng)建的目錄(是目錄),按確定后將會看到如上圖的擴(kuò)展項。

回到越捷航空首頁,并打開控制臺(可按F12喚出),我們再次嘗試輸入航線,然后點(diǎn)擊查找航班,如無意外,網(wǎng)頁便會斷了下來,然后我們將鼠標(biāo)移到cookie中,便可清晰的看到,我們要找的加密字段了。

通過在堆棧中尋找源,我們不難發(fā)現(xiàn),它的入口就是:J(Z, _, J)這個函數(shù),當(dāng)然這個函數(shù)是可變的,根據(jù)我們分析的規(guī)律,它是間隔2小時更新一次算法,(應(yīng)該說變更一次模板)如果您看到的跟我的不一樣,請不用懷疑,它就是加密的入口,我們清晰可見:zL這個變量中得到的是字段名“ TSdc75a61a_74 ”那不就是我們要找的么,從而我們可以證實(shí)了這個字段名是動態(tài)生成的想法。

總結(jié)

以上為本期教學(xué)的所有內(nèi)容,主要講解了如何通過自定義鉤子函數(shù)實(shí)現(xiàn)快速尋找加密函數(shù)入口,并且我們也嘗試了通過不同的調(diào)試方式進(jìn)行定位,需要注意的是,鉤子函數(shù)并非所有場景都能使用,只有當(dāng)目標(biāo)函數(shù)采用了內(nèi)置API才能對其進(jìn)行監(jiān)聽,當(dāng)然這個規(guī)定是死的,事實(shí)上我們完全可以通過proxy來實(shí)現(xiàn)監(jiān)聽任意函數(shù)而不僅僅只是趨限于內(nèi)置的函數(shù),大家懂我意思吧?好了,本期教學(xué)到此暫告一段落,咱們下期再見!


原文轉(zhuǎn)至:IT貓之家,轉(zhuǎn)載請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容