前言
滑塊驗證碼是比較常用的驗證碼之一,不過目前越來越多的網站將驗證碼改為點選漢字了,點選漢字確實要比滑塊難的多。滑塊用selenium過可以說是基本沒什么技術含量,要解決的也只有對driver的檢測問題。如果想用代碼過,那確實是有點意思。最難的地方,當屬偽造軌跡。本篇針對W易Y盾某版本滑塊驗證,分析指紋及軌跡的檢測。
Go
原網址:aHR0cHM6Ly9saXZlLnYud28uY24vcGxhdGZvcm0veXRweHovdHRkcmF3Lmh0bWw=(b64)
點擊獲取驗證碼,會出現滑塊驗證,通過抓包找到這一個請求,滑塊驗證碼的圖片鏈接都在這里面了:參數還是挺多的,首先要搞定這些。
這次換一種找入口的方式:在network列表中點擊initiator直接定位到對應代碼處:下好斷點并刷新驗證碼,成功的斷下來了。逐個擊破,首先這個id,經過多次刷新,發現這個id是寫死不變的,那就不用管它了。
然后fp,很明顯就是瀏覽器指紋了,為啥?FingerPrint啊。根據調用棧一層一層往上找可疑的地方。跟到這里的時候,我們發現了這個FP的全稱。。。果然是FingerPrint。看一下a是從這里來的(state commit dispatch 三兄弟。。Vue.js石錘了):
再往上找,也沒有找到太像的地方。搜一下fingerprint,一共有6處,觀察一番后鎖定這里:fingerprint的值是i賦給它的,i又是什么?向上看發現i就是window.g什么東西的。他把這個指紋掛在window對象上了,那就好辦了,HOOK大法安排!直接上油猴腳本了然后清掉cookie,刷新頁面。搞定。
調試觀察一下指紋里都取了什么。在這里取完h后,進行了拼接。最后面加了:和時間戳,即使沒有找到代碼也能一眼看出來。往上找h的來源:發現h是Oe,Oe是由數組k轉換的字符串,K又來源于對Y的元素進行了一些操作。。。一層一層套娃,往上翻,最后找到這里:S就是原本的指紋了,打印看看他檢測了什么:
我們發現在這里,W函數開始的地方,做了一些操作,看樣子就是在定義指紋的內容。v:v1.1,版本號唄,寫死固定。然后h:live.v.wo.cn,域名。u:先取了時間戳p,再對p加了de,瀏覽器中可以查看到de是個常量900000。這里的u[86]就是字母u,取完p后對p加鹽,前面和后面分別加上了三個字母,$這個函數每次執行結果都不一樣,應該是取隨機字符找過去證實確實是在取隨機字符:
繼續跟,然后發現了驚喜:不好意思發錯圖了,是這個:
canvas出現!繼續跟,跟到他做完所有操作進行加密的地方。這里他把數組o和數組i分別通過join拼接,s[139]是###,也就是轉成字符串,到m.e方法里加密,加密完再用逗號拼接好兩個結果,就是fp的值。打印看看o和i的值。i是canvas相關的參數,o是ua之類的東西。先說說這個o,o里面包括ua、屏幕分辨率、語言、版本等,這里可以寫死固定。如果只驗證這些信息,那么以上都可以隨機。但是結合canvas一起發給服務器,那么隨機可能會過不了。
然后參數i,canvas是個相當頭疼的地方。canvas是一種HTML5的標簽,非瀏覽器中是絕對弄不出來的。這個也是目前取瀏覽器指紋比較復雜的一種算法,與其類似的還有WebGL,也就是3D版的Canvas。這里我也沒有太好的方法,但是有一件事,你取了一個這么長的base64,到最后向瀏覽器傳的也只是一個十幾位的數值,我可以把一個長度幾萬個字符的字符串通過算法轉為十幾位的數字,但是你服務器怎么去通過這十幾位的數字還原原本的幾萬個字符呢?是做不到的,這個東西雖然難搞,同時服務器也很難檢測出來。一般來講,如果不是和瀏覽器信息一同返回,那么canvas這個東西可以直接隨機。如果不行,那可以試試改掉圖片base64的最后幾個字符,讓最后幾個字符隨機。如果還是不通過,那么需要去看看他的加密函數做了什么,針對加密函數做出調整。還還還不行,那只能想辦法去搞這個canvas數據了。通過前面我們分析出這個網站是把canvas和瀏覽器信息加密后一同返回給服務器的,那么這里把i完全隨機應該不大行,不過還是僥幸一下,萬一過了呢。
先嘗試全部隨機,在這里下一個斷,重新給n賦個值,隨便改幾個字符:然后一路F8:我們發現,他也能成功加載驗證碼。但是經過一番測試,我發現無論怎么滑動都無法通過驗證。看來這個方法確實不行,那就方案二,改他的圖。一樣的方法,下斷->輸出原本的圖片代碼->修改代碼->替換。這里可以借助在線base64圖片互轉的網站,改掉幾個末尾的字符,確定圖片還是原來的樣子。
我們發現fp確實已經改變了加載驗證碼,滑動,驗證通過。這個地方的偽造需要多考慮一些,不能夠完全隨機,也不能夠完全寫死,fp那兩個串是否需要配合變動。
關于這個地方摳代碼,首先找到W所在函數的頭和尾,一共1000行左右代碼。剪出來。直接剪出來是不能運行的,前面既然已經發現了他前端是vue做的,那么必定是用了webpack之類的工具構建打包,我們需要把webpack入口相關的代碼也剪過來。這個入口,無非就兩種,有的網站會把webpack入口代碼單獨提到一個js文件中,另一種就是和邏輯代碼在一個文件中。webpack執行的地方,往往伴隨著apply、call、及數組的push操作。
我們發現這個js里,入口代碼就在最上面,他直接定義了一個大數組,包裹所有的function,我們把這段也摳走。把這些代碼貼到vscode里補環境。還是那句話,缺啥補啥。先把window和navigator這倆大哥定義了:
運行:這是個啥。。不知道就去瀏覽器里找,在對應代碼處下斷:G實際是document,u[160]是cookie,看代碼,他這里應該是遍歷cookie,如果有就直接賦值,否則返回null。返回null的下一步,就是重新生成唄。把這段for循環直接注掉。另外一處G[u[160]]的地方一樣。
按照如上邏輯補全環境即可,需要注意的是域名,我們要手動把live.v.wo.cn填進去,然后里面的fp。。半隨機半固定,看你心情搞就行。和canvas有關的代碼直接干掉,反正我們已經知道他驗證了些什么了,在關鍵處直接攔截改值就OK。
最后是cb參數,全局搜cb一共就4個地方,都打下斷點。刷新驗證碼,斷下來了:
進入s方法:醒目的uuid,遇見uuid,直接隨機。。A方法我們要看一看:跟著單步走一圈,沒有太復雜的算法,加鹽+二進制處理。這里可以直接摳出來運行。
具體步驟略過(PS:我也比較懶..),這里比較重要的地方我們都已經分析過了。
然后是軌跡生成。欲知后事如何,且聽下回分解。
總結
到目前為止,網站整體沒什么太復雜的地方,比較棘手的只有canvas,這個東西我也是沒什么太好的應對方法。之前看過一個大佬專門開發了一個瀏覽器,修改底層得到各種類型的指紋,絕無重復,需要的時候調一下就出來了,是個很好的想法。下篇找一找軌跡的算法。
聲明:本文分析過程僅供學習,并無任何個人以及商業或其他用途。如有不慎侵權,請聯系我刪除。
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。