爬蟲項目:破解頂象驗證碼
導語:本文略過了簡單的網路抓包過程,只通過通俗易懂的操作思路做出關鍵層面的分析和講解。本文僅用於Web網路安全方面的技術學習交流。
目前市面上,有許多研發滑動驗證碼的廠商,每家廠商都在大肆宣傳自己家的產品如何安全,那麼真實情況到底如何?現在,我們就來評測下這家於去年四月成立,並宣稱其滑動驗證碼能有效的區分人和機器、保護線上產品安全的互聯網安全服務公司——頂象科技。
根據頂象科技官網介紹的民航合作客戶,找到了中國國際航空網站,在知音會員註冊環節(https://m.airchina.com.cn/ac/c/invoke/reset/checkPhone@pg)發現使用到了該驗證碼!經過幾天的研究,事實證明它的安全性並沒有產品官網宣傳的那麼達標!
通常,驗證碼會先對瀏覽器客戶端做環境檢查搜集成設備指紋,然後由服務端返迴流水號(token)、驗證形式和、驗證圖片。前端記錄拖動或點擊答案位置時的行為軌跡,發送服務端進行驗證。雖然js代碼進行了混淆和參數加密,但加以分析可以找到了主要驗證參數的來源。
一.通訊介面
從以上圖片可以發現,頂象的驗證流程是從c1介面開始,將採集的瀏覽器設備指紋等信息放在headers的Param中。因為c1介面是跨域的非簡單請求,這種介面需要瀏覽器先向伺服器發送一次 OPTIONS請求,詢問Allow的行為和報頭,才會再發送數據。介面會通信兩次,所以會產生4個請求,最後返回的簽名參數用來索取驗證碼。
api/a 介面 的Get請求參數
上圖中的參數c 就是 c1介面返回的data值,其他參數有固定的含義,比如期望的圖片寬高為 300 ×150。
該介面會返回本次驗證的流水號sid,以及3張圖片的路徑。即完整的背景圖、缺口的小圖,有缺口的背景圖。
圖片的位置是被打亂的,拼接邏輯被代碼加密,但實際上頁面上會呈現出人可以正常區分的還原圖片。
滑動結束後,POST請求 https://cap.dingxiang-inc.com/api/v1介面。
如果通過驗證,介面會返回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)
2.訓練過程
原始圖像經過卷積提取圖像特徵,根據最後的卷積結果得出標記的具體位置。
實驗記錄loss及accurcy隨訓練步數變化,具體如下圖:
3.訓練結果
經過訓練樣本測試,最終的識別率已高達95%。部分識別示例如下:
解決了驗證圖片的識別問題之後,就可以批量的刷驗證碼了。使用Python語言,pip安裝Selenium 。Selenium是一個優秀的瀏覽器自動化測試工具,使用前需要下載對應的 webdriver驅動程序。以下是程序的執行邏輯(偽代碼):
注意:所有的操作要等待頁面元素出現後再執行,滑動的位移比識圖的答案位置的X軸坐標短11px左右,這是因為缺口圖片有空白,會佔用一些距離。
三.測試結果
經過一番改進測試,按照上述流程執行python程序運行Selenium打開100次,通過頂象驗證的成功率高達94%,但這種方式需要真正的運行瀏覽器,多個應用運行會耗費大量的機器性能和內存,不具有高頻的攻擊性。
最後可以總結出:頂象驗證碼而對於機器而言,可以源源不斷的獲取新的驗證 , 機器識別圖片缺口的位置 , 模擬滑動後提交 ,就能不停的通過驗證,進行下一步的發送簡訊、登錄註冊等觸及網站安全的操作。
在頂象驗證碼破解的過程中,國航某簡訊介面的訪問僅用於Selenium的學習和測試,不帶有攻擊目的。
推薦閱讀: