爬蟲項目:破解頂象驗證碼

導語:本文略過了簡單的網路抓包過程,只通過通俗易懂的操作思路做出關鍵層面的分析和講解。本文僅用於Web網路安全方面的技術學習交流。

目前市面上,有許多研發滑動驗證碼的廠商,每家廠商都在大肆宣傳自己家的產品如何安全,那麼真實情況到底如何?現在,我們就來評測下這家於去年四月成立,並宣稱其滑動驗證碼能有效的區分人和機器、保護線上產品安全的互聯網安全服務公司——頂象科技。

根據頂象科技官網介紹的民航合作客戶,找到了中國國際航空網站,在知音會員註冊環節(m.airchina.com.cn/ac/c/)發現使用到了該驗證碼!經過幾天的研究,事實證明它的安全性並沒有產品官網宣傳的那麼達標!

通常,驗證碼會先對瀏覽器客戶端做環境檢查搜集成設備指紋,然後由服務端返迴流水號(token)、驗證形式和、驗證圖片。前端記錄拖動或點擊答案位置時的行為軌跡,發送服務端進行驗證。雖然js代碼進行了混淆和參數加密,但加以分析可以找到了主要驗證參數的來源。

一.通訊介面

從以上圖片可以發現,頂象的驗證流程是從c1介面開始,將採集的瀏覽器設備指紋等信息放在headers的Param中。因為c1介面是跨域的非簡單請求,這種介面需要瀏覽器先向伺服器發送一次 OPTIONS請求,詢問Allow的行為和報頭,才會再發送數據。介面會通信兩次,所以會產生4個請求,最後返回的簽名參數用來索取驗證碼。

api/a 介面 的Get請求參數

上圖中的參數c 就是 c1介面返回的data值,其他參數有固定的含義,比如期望的圖片寬高為 300 ×150。

該介面會返回本次驗證的流水號sid,以及3張圖片的路徑。即完整的背景圖、缺口的小圖,有缺口的背景圖。

圖片的位置是被打亂的,拼接邏輯被代碼加密,但實際上頁面上會呈現出人可以正常區分的還原圖片。

滑動結束後,POST請求 cap.dingxiang-inc.com/a介面。

如果通過驗證,介面會返回token。

所有產品的運行流程就是:

① 發送設備指紋等信息 => c1介面 => 返回索取驗證碼的簽名參數

② 發送流水號 => api/a 介面 => 返回驗證的流水號sid

③ 拖動結束,發送答案位置和行為軌跡 => api/v1 介面 => 返回驗證的token,如果未通過,執行②

二.識圖

1.訓練條件

本實驗採用優化後的Alexnet來識別滑動驗證碼中的標記位置。經過兩個卷積網路來識別目標:第一個卷積網路識別目標大致位置(誤差5個像素),並根據結果截取包含目標的60x60圖像塊作為第二個網路輸入;第二個卷積網路識別目標在圖像塊的精確位置;最後換算出目標在原始圖片的精確位置。

樣本來自頂象科技滑動驗證碼,其中圖片尺寸為高度150像素,寬度300像素。

顯卡型號:GTX1080

訓練時長:4h

訓練樣本/測試樣本個數:5000/1000

網路模型1:

輸入維度(3, 150, 300)

AlexNet(

(features): Sequential(

(0): Conv2d (3, 64, kernel_size=(5, 5), stride=(3, 3), padding=(2, 2))

(1): ReLU(inplace)

(2): MaxPool2d(kernel_size=(2, 2), stride=(2, 2), dilation=(1, 1))

(3): Conv2d (64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))

(4): ReLU(inplace)

(5): MaxPool2d(kernel_size=(3, 3), stride=(2, 2), dilation=(1, 1))

(6): Conv2d (192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

(7): ReLU(inplace)

(8): Conv2d (384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

(9): ReLU(inplace)

(10): Conv2d (256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

(11): ReLU(inplace)

)

(classifier): Sequential(

(0): Dropout(p=0.5)

(1): Linear(in_features=73728, out_features=4096)

(2): ReLU(inplace)

(3): Dropout(p=0.5)

(4): Linear(in_features=4096, out_features=4096)

(5): ReLU(inplace)

(6): Linear(in_features=4096, out_features=1800)

)

)

損失函數:CrossEntropy

優化器:Adam(lr=1e-3)

網路模型2:

輸入維度(3, 60, 60)

AlexNet(

(features): Sequential(

(0): Conv2d (3, 64, kernel_size=(5, 5), stride=(3, 3), padding=(2, 2))

(1): ReLU(inplace)

(2): Conv2d (64, 192, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2))

(3): ReLU(inplace)

(4): Conv2d (192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

(5): ReLU(inplace)

(6): Conv2d (384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

(7): ReLU(inplace)

(8): Conv2d (256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

(9): ReLU(inplace)

)

(classifier): Sequential(

(0): Dropout(p=0.5)

(1): Linear(in_features=25600, out_features=4096)

(2): ReLU(inplace)

(3): Dropout(p=0.5)

(4): Linear(in_features=4096, out_features=4096)

(5): ReLU(inplace)

(6): Linear(in_features=4096, out_features=900)

)

)

損失函數:CrossEntropy

優化器:SGD(lr=1e-2)

圖:Alexnet基本結構

2.訓練過程

原始圖像經過卷積提取圖像特徵,根據最後的卷積結果得出標記的具體位置。

實驗記錄loss及accurcy隨訓練步數變化,具體如下圖:

圖:loss變化趨勢

圖:正確率變化趨勢

3.訓練結果

經過訓練樣本測試,最終的識別率已高達95%。部分識別示例如下:

解決了驗證圖片的識別問題之後,就可以批量的刷驗證碼了。使用Python語言,pip安裝Selenium 。Selenium是一個優秀的瀏覽器自動化測試工具,使用前需要下載對應的 webdriver驅動程序。以下是程序的執行邏輯(偽代碼):

注意:所有的操作要等待頁面元素出現後再執行,滑動的位移比識圖的答案位置的X軸坐標短11px左右,這是因為缺口圖片有空白,會佔用一些距離。

三.測試結果

經過一番改進測試,按照上述流程執行python程序運行Selenium打開100次,通過頂象驗證的成功率高達94%,但這種方式需要真正的運行瀏覽器,多個應用運行會耗費大量的機器性能和內存,不具有高頻的攻擊性。

最後可以總結出:頂象驗證碼而對於機器而言,可以源源不斷的獲取新的驗證 , 機器識別圖片缺口的位置 , 模擬滑動後提交 ,就能不停的通過驗證,進行下一步的發送簡訊、登錄註冊等觸及網站安全的操作。

在頂象驗證碼破解的過程中,國航某簡訊介面的訪問僅用於Selenium的學習和測試,不帶有攻擊目的。


推薦閱讀:

簡單驗證碼識別
工具應用:利用Tesseract-OCR實現驗證碼識別

TAG:驗證碼 | 驗證碼識別 |