天天看點

記一次破解前端加密詳細過程進入爬蟲主題正式破解

應工作需要爬過各種各樣的航空公司網站,大到B2B平台,小到東南亞某某航空官網,從最初使用webdriver+selenium爬蟲到現在利用http請求解析html,經曆過各種各樣的問題,webdriver+selenium這種辦法雖然萬能,而且可以用JS寫解析腳本友善調試,但是用久了才發現這玩意不管是效率還是穩定性都非常差,放到伺服器上動不動就挂掉,兩三天就需要重新開機一次。後面頭說讓我們改用發http請求(我第一次接觸項目的時候就在想為什麼不直接用發http請求這種方式,我猜他也是第一次接觸爬蟲這個技術領域,沒什麼經驗。而我,本來是招JAVA進的公司,後來JAVA、JS、Python寫了個遍,emmm... 沒事,反正技多不壓身 ^_^),這種方式穩定且快,但是用Python編寫解析腳本的時候你就知道進行調試有多煩,雖然可以用PyQuery或者BeautifulSoup這種解析庫,但是還是不如寫JS腳本在浏覽器裡調試來得舒服。

進入爬蟲主題

要爬取的官網:https://www.jcairlines.com

接口位址:https://www.jcairlines.com/TicketSale/FlightQuery/QuerySeat

目标:根據參數爬取對應的航班資訊

請求資訊:

記一次破解前端加密詳細過程進入爬蟲主題正式破解

響應結果:

記一次破解前端加密詳細過程進入爬蟲主題正式破解

接口測試

從上面的第一張圖可以看到有一個類似加密過的參數:HashCode,而其他的都是根據需要進行直接填充

{"DepartureIataCode":"TPE","ArrivalIataCode":"PNH","FlightDate":"2018-08-24","RouteIndex":"0","TravelType":"OW","HashCode":"8b112088f6966ea42507d0daff86a1d1"}           

複制

下面将這個請求的完整資訊放到Postman中跑一下,看看結果:

記一次破解前端加密詳細過程進入爬蟲主題正式破解

可以看到是沒有問題的,能拿到結果,下面我們準備把HashCode去掉再請求一遍

記一次破解前端加密詳細過程進入爬蟲主題正式破解

emmm... 直接不響應!!!

好吧,搞定這個問題就需要破解這個加密參數是怎麼來的

正式破解

【逆向思維】這個肯定是Ajax請求之前生成的,那就用關鍵字找這個Ajax請求, 在Chrome中開發者模式,找到這網站的所有Source

記一次破解前端加密詳細過程進入爬蟲主題正式破解

【關鍵字】"QuerySeat?imageView2/2/w/1620" 一大堆js檔案一個一個找吧,運氣很好,第一個就是,可以清楚的看到“POST”一詞,那這一定就是一個Ajax請求咯,這裡有一個技巧,一般情況下,伺服器會對靜态資源進行壓縮,是以需要format才能看個大概

記一次破解前端加密詳細過程進入爬蟲主題正式破解
記一次破解前端加密詳細過程進入爬蟲主題正式破解

這樣可以閱讀代碼了,然後輕松找到設定HashCode的地方,然後打一個斷點,随便查一條航線的資料,如下圖。

記一次破解前端加密詳細過程進入爬蟲主題正式破解

單步執行走到這一步,有些眉目了,執行到了encode指向的匿名函數這,裡面代碼看似應該是各種加密函數,不用讀懂它,因為目标隻是執行它,得到相應的結果就行了

記一次破解前端加密詳細過程進入爬蟲主題正式破解

繼續單步:

記一次破解前端加密詳細過程進入爬蟲主題正式破解

繼續...

記一次破解前端加密詳細過程進入爬蟲主題正式破解

上圖中重要的源碼:

return e = OOO0.excess.indexOf("Chrome") >= 0 ? "cv3sdf@#$f3" : OOO0.excess.indexOf("Firefox") >= 0 ? "df23Sc@sS" : "vdf@s4df9sd@s2"           

複制

傳回到上層,沒錯和我想的一樣,目前浏覽器是Chrome,傳回的是 cv3sdf@#$f3

記一次破解前端加密詳細過程進入爬蟲主題正式破解

繼續...

記一次破解前端加密詳細過程進入爬蟲主題正式破解

繼續...

記一次破解前端加密詳細過程進入爬蟲主題正式破解

繼續...

記一次破解前端加密詳細過程進入爬蟲主題正式破解

最終找到了這個匿名函數,複制encode所指向的函數,然後随便取一個名字,友善調用,另外,在另一個視窗中打開Console粘貼代碼,如下圖:

記一次破解前端加密詳細過程進入爬蟲主題正式破解

調用...(報錯了)

記一次破解前端加密詳細過程進入爬蟲主題正式破解

替換成對應的字元串繼續...

記一次破解前端加密詳細過程進入爬蟲主題正式破解

重新調用注入到Console 的encode函數,調用,得到結果!!!

記一次破解前端加密詳細過程進入爬蟲主題正式破解

對比最開始用Postman請求的地方,結果也一緻!!!

還沒有完,這裡隻是得到了js腳本,是以還需嵌入到Python代碼中使用,正常方式有兩種:使用Python第三方類庫js2py和PyV8這兩個都是能都執行js的Python類庫,但是我還是推薦使用js2py,因為PyV8安裝十分繁瑣,具體使用我就不再贅述,網上有很多的教程和Case。

最後需要交代的:“sfei#@%%”這的到底是哪來的,也沒有尋根,我就直接告訴答案,其實這個值就在目前的網頁中,是一個js變量,且是一個固定值,這也是我不想尋根的原因,意義不大。另外在使用http爬蟲的時候headers裡面的内容也必須和HashCode相比對,什麼意思呢,之前代碼出現過通過浏覽器種類,生成不同的字元串,也就是說具體HashCode是和浏覽器有關,是以在構造headers時需要填寫對應的User-Agent,不然伺服器進行校驗的時候還是不會響應的,可以猜測伺服器中也有一段功能相同的代碼,它根據請求參數和headers中User-Agent進行加密計算,得到HashCode以此來驗證請求的HashCode是否合法。

總結

前端加密還是能夠破解出來的,關鍵在于鎖定JS加密源碼位置,并且提取出有用的加密代碼,隻要有使用過js的同學問題都不大。還有很多小細節得注意,伺服器需要對請求做進一步驗證,方式其實和前端是一樣的以此來判斷請求是否合法,至少這個網站是如此。

  • 本文作者:TheUmbra
  • 本文連結:https://blog.csdn.net/lsh19950928/article/details/81585881