驗證碼的前世此生(前世篇)

驗證碼的前世此生(前世篇)

常在網上晃悠的人,對上面這張圖都不會陌生。特別是在註冊新帳號、確認交易時,它們都會頻繁出現,要求咱們輸入正確的驗證碼,那這些看上去跟咱們要作的事情徹底無關的驗證碼到底有何做用呢?
html

0×1 誕生

首先,先介紹下驗證碼程序的提出者,路易斯·馮·安(Luis von Ahn)。2002年,路易斯和他的小夥伴在卡內基梅隆第一次提出了CAPTCHA(驗證碼)這樣一個程序概念。該程序是指,向請求的發起方提出問題,能正確回答的便是人類,反之則爲機器。這個程序基於這樣一個重要假設:提出的問題要容易被人類解答,而且讓機器沒法解答。程序員

在當時的條件下,識別扭曲的圖形,對於機器來講仍是一個很艱難的任務,而對於人來講,則相對能夠接受。yahoo在當時第一個應用了圖形化驗證碼這個產品,很快解決了yahoo郵箱上的垃圾郵件問題,所以圖形類驗證碼開始了大發展時期。算法

0×2 發展與問題

圖形化驗證碼在被證實有效後,在互聯網上迅速獲得了推廣。國內外各大網站,在關鍵的業務點上都加入了這一類型的驗證碼。api

首先,因爲開發者水平的參差不齊,致使驗證碼自己的實現存在問題,從而致使漏洞能夠繞過,常見的有如下幾種類型:安全

[1] 驗證碼的生成邏輯、答案用戶可見

如將驗證碼答案輸出到頁面中、寫在cookie裏。打比方就是說,在髮捲的時候,把答案寫在了卷子背面。(老師不再用擔憂個人成績)cookie

[2] 驗證碼的生命週期未控制好

如驗證碼能夠重複使用、不設超時。驗證一次,永久使用。網絡

[3] 業務邏輯與驗證碼結合點存在問題

如修改業務參數可致使不用校驗驗證碼也可經過、甚至驗證碼就是擺設。結合到具體的業務點上有什麼危害呢?機器學習

a. 驗證碼寫在cookie中。此處可致使旅客信息泄露。工具

b. 驗證碼與圖片存在對應關係,所以直接訪問html便可獲得答案。此處可致使撞庫與暴力破解密碼。學習

(上述兩例轉自烏雲)

0×3 圖片驗證碼對抗與攻擊升級

在開篇咱們提到了一個重要的假設:

CAPTCHA提出的問題要容易被人類解答,而且讓機器沒法解答。

實際上,CAPTCHA所要處理的問題是:將普通人與惡意的用戶(黑客、垃圾消息發送者)區分開來。那當時間點到達2016年時,黑客們與普通用戶之間的差距已經很大了(想象下中國足球隊對巴西足球隊,並且此時留給中國隊的時間已經很少了)。

所以,CAPTCHA在圖片驗證碼這一應用點上已經沒法知足這一假設了。在這段時間內,出現了不少的增強和識別圖形驗證碼的方法(每一種方法的詳細原理和解釋,能夠參見wooyun drops,在此不作詳述):

附上部分名詞解釋:

預處理:灰度值二值化、去噪點、連通性補全等

切割:經過滴水算法、統計方法等獲得單個字符的所在位置

機器學習算法:將通過處理的每一個字符進行訓練,訓練後獲得識別答案(SVM、KNN、神經網絡等)

字庫:與機器學習算法相似,將處理後的字符人工導入,構造字庫,對長期不變的驗證碼較爲有效

如上圖所示,原始的圖像使用了字體旋轉、背景色混淆等手段,在專業的驗證碼工具面前,也就是幾個命令拼接便可完成識別

如上圖所示,是一個驗證碼識別軟件自建字庫的過程,經過回車確認驗證碼識別正確,若有錯誤,稍帶修改繼續。當保存了上千個正確識別的字庫後,該程序即可達到一個可用的可用的準確率。(其實若不不作其餘限制,此時準確率在30%以上時,便可形成很大的危害,畢竟對於攻擊者來講,發3個包與發1個包的成本差異不大)

看到這裏,客戶們大概能夠回答這個問題了:

→ 爲何我用了驗證碼仍是會被刷?

那普通驗證碼難道沒用了嗎?

那倒也不是,安全是一個博弈的過程。綜合使用以前提到的驗證碼技術(特別是字體粘連等),而且保持關注和變化,攻擊者的識別率也比較低。當攻擊的成本大於可得到的利益時,天然就沒人來攻擊了。(普通用戶在此應強烈要求存在感)

此時,雖然兩方大小上略有差距,可是整體戰鬥力還算是勉強打個平手,互相出招而已。只是隨着戰火的升級,我的輪番上陣後,驗證碼已經違背了他最初設計時的初衷:對普通用戶的友好性逐漸消失。而普通用戶的體驗也就成了這場戰爭中的犧牲品,這也就造就了一批有一批被用戶吐槽的沒法辨認的驗證碼。

正當普通用戶們不斷吐槽的時候,程序員表示這個鍋不想背可是也得背。由於業務老是要作的,而攻擊者們也是要吃飯的,升級了驗證碼的成本,也就限制了風險的等級,因而就變成了這樣一個模式╮(╯_╰)╭:

程序員:熬一夜升級
攻擊者:熬一夜破解
程序員:熬兩晚上升級
攻擊者:熬兩晚上破解
....(心疼)...

你們就在這種你方唱罷我登臺的狀況下看似和氣的度過了一段時間。

0×4 圖片驗證碼的沒落

在日日夜夜的對抗中,攻擊者想到了一個辦法,能夠一勞永逸的解決圖片驗證碼的問題。在我對這些搞灰產的人們表示憧憬以前,先說點題外話。

2009年,google買下了CMU的一個項目:recaptcha。這個項目是CAPTCHA的進階版本。它所基於的假設與CAPTCHA一致,可是它同時讓用戶識別兩張圖片,一張用於驗證用戶身份,而另外一張用於幫助難以用機器識別的電子文檔。

恩,若是讀者有從事此類灰產相關工做的人,請注意recaptcha右下角的小字(stop spam.read books)看看這情懷。

而recaptcha的做者,固然又是:路易斯·馮·安。在recaptcha的基礎上,路易斯進一步提出了一個概念:人類計算(Human Computation) 。

簡單來講,他但願藉由計算機和網絡平臺,發揮人類技能,去解決大規模、複雜的問題,具體到recaptcha項目來講,就是藉助你們的力量去幫助數字化書籍。(該思想的具體應用還包括一個叫ESP GAME的遊戲以及後面會提到的no recaptcha)

可是,在2004年(我能搜到這個新聞的最先時間),就有人已經完美的實現了這個概念:人工打碼,而且起源地:中國(此處我應該感到自豪嗎)。

所謂的人工打碼就是,將驗證碼的請求轉發給某平臺,該平臺會將這個信息發送給平臺上的打碼工,而後打碼工人識別後,將答案反送回請求者。經過打碼平臺的api,攻擊者能夠寫程序實現對目標的自動化操做,而驗證碼的部分只要交給打碼平臺就能夠了。

打碼平臺在國內市場上的火爆,有幾個緣由:

  1. 從2006年開始,國內互聯網的迅猛發展,使得流量變現成爲了可能。各類郵件營銷、SEO、IM工具等都迫切的須要穩定的能夠繞過圖形驗證碼的方法。而近些年興起的基於數據的詐騙、帳號盜取等更進一步加重了這個趨勢。

  2. 打碼平臺的爆發式發展也同時得益於中國經濟蓬勃發展的緣由之一:人口多而且人力成本低。網絡上一種常見的網賺模式,就是打碼工模式,一個只要會上網,能識別驗證碼的人就能夠參與。PS:難道你沒有看見過下面這些廣告嗎?大學生、大媽,無需學歷,只要會上網、會打字,一天包賺XXXXX。固然其中除了打碼平臺,還有不少騙子。

能夠打碼的類型包括:

  1. 普通字母驗證碼
  2. 中文驗證碼
  3. 鼠標類型類驗證碼
  4. 選擇題類型(好比某些網遊中作任何會遇到的驗證碼)
  5. 旋轉類驗證碼
  6. 知識常識問答型驗證碼

以上驗證碼的價格在平臺上都是明碼標價,普通的字母驗證碼1條在1分錢左右,而知識問答類在6分錢左右,相較於利用這些灰產所會產生的利益,真是件美物廉,重點是還很是穩定。

同時我注意到國外的價格如今與國內的價格已經相差不大,如今美國的價錢約爲$1.5/1000,美國的打碼工已經向東南亞擴展。打碼平臺一出現,2.2中提到的增強驗證碼的方法都無用了。由於無論你怎麼變化,驗證碼總須要是人類可以經過的。

0×5 新的征程

打碼平臺的出現,雖然沒有從理論上打破CAPTCHA的原則,可是也從事實上擊破了防止程序自動提交的防護,所以咱們須要新型的安全的驗證方式。這些探索也帶來了如今各類多樣的驗證碼形式,這些咱們將在下篇探討。

最後用一個「富有情懷」的圖片結束。

這張圖不是來自改變世界的極客,也不是來自富有愛心的藝術家。它來自某知名打碼平臺的官網,是否是太有情懷了?(大家的確改變了咱們的工做方式)

面對這樣的情懷,我想我如今只能作一件事情。

做者:目明@阿里安全,更多安全類技術文章,請訪問阿里聚安全博客

相關文章
相關標籤/搜索