photoshop進(jìn)階書(shū)籍的簡(jiǎn)單介紹
常在網(wǎng)上晃悠的人,對上面這張圖都不會(huì )陌生。特別是在注冊新賬號、確認交易時(shí),它們都會(huì )頻繁出現,要求我們輸入正確的驗證碼,那這些看上去跟我們要做的事情完全無(wú)關(guān)的驗證碼到底有何作用呢?
0×1誕生
首先,先介紹下驗證碼程序的提出者,路易斯·馮·安(Luis von Ahn)。2002年,路易斯和他的小伙伴在卡內基梅隆第一次提出了CAPTCHA(驗證碼)這樣一個(gè)程序概念。該程序是指,向請求的發(fā)起方提出問(wèn)題,能正確回答的即是人類(lèi),反之則為機器。這個(gè)程序基于這樣一個(gè)重要假設:提出的問(wèn)題要容易被人類(lèi)解答,并且讓機器無(wú)法解答。
在當時(shí)的條件下,識別扭曲的圖形,對于機器來(lái)說(shuō)還是一個(gè)很艱難的任務(wù),而對于人來(lái)說(shuō),則相對可以接受。yahoo在當時(shí)第一個(gè)應用了圖形化驗證碼這個(gè)產(chǎn)品,很快解決了yahoo郵箱上的垃圾郵件問(wèn)題,因此圖形類(lèi)驗證碼開(kāi)始了大發(fā)展時(shí)期。
0×2發(fā)展與問(wèn)題
圖形化驗證碼在被證明有效后,在互聯(lián)網(wǎng)上迅速得到了推廣。國內外各大網(wǎng)站,在關(guān)鍵的業(yè)務(wù)點(diǎn)上都加入了這一類(lèi)型的驗證碼。
首先,由于開(kāi)發(fā)者水平的良莠不齊,導致驗證碼本身的實(shí)現存在問(wèn)題,從而導致漏洞可以繞過(guò),常見(jiàn)的有以下幾種類(lèi)型:
[1] 驗證碼的生成邏輯、答案用戶(hù)可見(jiàn)
如將驗證碼答案輸出到頁(yè)面中、寫(xiě)在cookie里。打比方就是說(shuō),在發(fā)卷的時(shí)候,把答案寫(xiě)在了卷子背面。(老師再也不用擔心我的成績(jì))
[2] 驗證碼的生命周期未控制好
如驗證碼可以重復使用、不設超時(shí)。驗證一次,永久使用。
[* ] 業(yè)務(wù)邏輯與驗證碼結合點(diǎn)存在問(wèn)題
如修改業(yè)務(wù)參數可導致不用校驗驗證碼也可通過(guò)、甚至驗證碼就是擺設。結合到具體的業(yè)務(wù)點(diǎn)上有什么危害呢?
a. 驗證碼寫(xiě)在cookie中。此處可導致旅客信息泄露。
b. 驗證碼與圖片存在對應關(guān)系,因此直接訪(fǎng)問(wèn)html即可得到答案。此處可導致撞庫與暴力破解密碼。
(上述兩例轉自烏云)
0×* 圖片驗證碼對抗與攻擊升級
在開(kāi)篇我們提到了一個(gè)重要的假設:
CAPTCHA提出的問(wèn)題要容易被人類(lèi)解答,并且讓機器無(wú)法解答。
實(shí)際上,CAPTCHA所要處理的問(wèn)題是:將普通人與惡意的用戶(hù)(黑客、垃圾消息發(fā)送者)區分開(kāi)來(lái)。那當時(shí)間點(diǎn)到達201* 年時(shí),黑客們與普通用戶(hù)之間的差距已經(jīng)很大了(想象下中國足球隊對巴西足球隊,而且此時(shí)留給中國隊的時(shí)間已經(jīng)不多了)。
因此,CAPTCHA在圖片驗證碼這一應用點(diǎn)上已經(jīng)無(wú)法滿(mǎn)足這一假設了。在這段時(shí)間內,出現了很多的加強和識別圖形驗證碼的方法(每一種方法的詳細原理和解釋?zhuān)梢詤⒁?jiàn)wooyun drops,在此不做詳述):
附上部分名詞解釋?zhuān)?/p>
預處理:灰度值二值化、去噪點(diǎn)、連通性補全等
切割:通過(guò)滴水算法、統計方法等得到單個(gè)字符的所在位置
機器學(xué)習算法:將經(jīng)過(guò)處理的每個(gè)字符進(jìn)行訓練,訓練后得到識別答案(SVM、KNN、神經(jīng)網(wǎng)絡(luò )等)
字庫:與機器學(xué)習算法類(lèi)似,將處理后的字符人工導入,構造字庫,對長(cháng)期不變的驗證碼較為有效
如上圖所示,原始的圖像使用了字體旋轉、背景色混淆等手段,在專(zhuān)業(yè)的驗證碼工具面前,也就是幾個(gè)命令拼接即可完成識別
如上圖所示,是一個(gè)驗證碼識別軟件自建字庫的過(guò)程,通過(guò)回車(chē)確認驗證碼識別正確,如有錯誤,稍帶修改繼續。當保存了上千個(gè)正確識別的字庫后,該程序便可達到一個(gè)可用的可用的準確率。(其實(shí)若不不做其他限制,此時(shí)準確率在* 0%以上時(shí),即可造成很大的危害,畢竟對于攻擊者來(lái)說(shuō),發(fā)* 個(gè)包與發(fā)1個(gè)包的成本差別不大)
看到這里,客戶(hù)們大概可以回答這個(gè)問(wèn)題了:
為什么我用了驗證碼還是會(huì )被刷?
那普通驗證碼難道沒(méi)用了嗎?
那倒也不是,安全是一個(gè)博弈的過(guò)程。綜合使用之前提到的驗證碼技術(shù)(特別是字體粘連等),并且保持關(guān)注和變化,攻擊者的識別率也比較低。當攻擊的成本大于可獲得的利益時(shí),自然就沒(méi)人來(lái)攻擊了。(普通用戶(hù)在此應強烈要求存在感)
此時(shí),雖然兩方大小上略有差距,但是總體戰斗力還算是勉強打個(gè)平手,互相出招而已。只是隨著(zhù)戰火的升級,個(gè)人輪番上陣后,驗證碼已經(jīng)違背了他最初設計時(shí)的初衷:對普通用戶(hù)的友好性逐漸消失。而普通用戶(hù)的體驗也就成了這場(chǎng)戰爭中的犧牲品,這也就造就了一批有一批被用戶(hù)吐槽的無(wú)法辨認的驗證碼。
正當普通用戶(hù)們不斷吐槽的時(shí)候,程序員表示這個(gè)鍋不想背但是也得背。因為業(yè)務(wù)總是要做的,而攻擊者們也是要吃飯的,升級了驗證碼的成本,也就限制了風(fēng)險的等級,于是就變成了這樣一個(gè)模式╮(╯_╰)╭:
程序員:熬一晚上升級
攻擊者:熬一晚上破解
程序員:熬兩晚上升級
攻擊者:熬兩晚上破解
....(心疼)...
大家就在這種你方唱罷我登臺的情況下看似和睦的度過(guò)了一段時(shí)間。
0×* 圖片驗證碼的沒(méi)落
在日日夜夜的對抗中,攻擊者想到了一個(gè)辦法,可以一勞永逸的解決圖片驗證碼的問(wèn)題。在我對這些搞灰產(chǎn)的人們表示憧憬之前,先說(shuō)點(diǎn)題外話(huà)。
2009年,google買(mǎi)下了CMU的一個(gè)項目:recaptcha。這個(gè)項目是CAPTCHA的進(jìn)階版本。它所基于的假設與CAPTCHA一致,但是它同時(shí)讓用戶(hù)識別兩張圖片,一張用于驗證用戶(hù)身份,而另一張用于幫助難以用機器識別的電子文檔。
恩,如果讀者有從事此類(lèi)灰產(chǎn)相關(guān)工作的人,請注意recaptcha右下角的小字(stop spam.read books看看這情懷)。
而recaptcha的作者,當然又是:路易斯·馮·安。在recaptcha的基礎上,路易斯進(jìn)一步提出了一個(gè)概念:人類(lèi)計算(Human Computation) 。
簡(jiǎn)單來(lái)說(shuō),他希望借由計算機和網(wǎng)絡(luò )平臺,發(fā)揮人類(lèi)技能,去解決大規模、復雜的問(wèn)題,具體到recaptcha項目來(lái)說(shuō),就是借助大家的力量去幫助數字化書(shū)籍。(該思想的具體應用還包括一個(gè)叫ESP GAME的游戲以及后面會(huì )提到的no recaptcha)
但是,在200* 年(我能搜到這個(gè)新聞的最早時(shí)間),就有人已經(jīng)完美的實(shí)現了這個(gè)概念:人工打碼,并且起源地:中國(此處我應該感到自豪嗎)。
所謂的人工打碼就是,將驗證碼的請求轉發(fā)給某平臺,該平臺會(huì )將這個(gè)信息發(fā)送給平臺上的打碼工,然后打碼工人識別后,將答案反送回請求者。通過(guò)打碼平臺的api,攻擊者可以寫(xiě)程序實(shí)現對目標的自動(dòng)化操作,而驗證碼的部分只要交給打碼平臺就可以了。
打碼平臺在國內市場(chǎng)上的火爆,有幾個(gè)原因:
[1].從200* 年開(kāi)始,國內互聯(lián)網(wǎng)的迅猛發(fā)展,使得流量變現成為了可能。各種郵件營(yíng)銷(xiāo)、SEO、IM工具等都迫切的需要穩定的可以繞過(guò)圖形驗證碼的方法。而近些年興起的基于數據的詐騙、賬號盜取等更進(jìn)一步加劇了這個(gè)趨勢。
[2].打碼平臺的爆發(fā)式發(fā)展也同時(shí)得益于中國經(jīng)濟蓬勃發(fā)展的原因之一:人口多并且人力成本低。網(wǎng)絡(luò )上一種常見(jiàn)的網(wǎng)賺模式,就是打碼工模式,一個(gè)只要會(huì )上網(wǎng),能識別驗證碼的人就可以參與。PS:難道你沒(méi)有看見(jiàn)過(guò)下面這些廣告嗎?大學(xué)生、大媽?zhuān)瑹o(wú)需學(xué)歷,只要會(huì )上網(wǎng)、會(huì )打字,一天包賺XXXXX。當然其中除了打碼平臺,還有很多騙子。
可以打碼的類(lèi)型包括:
1. 普通字母驗證碼
2. 中文驗證碼
* . 鼠標類(lèi)型類(lèi)驗證碼
* . 選擇題類(lèi)型(比如某些網(wǎng)游中做任何會(huì )遇到的驗證碼)
* . 旋轉類(lèi)驗證碼
* . 知識常識問(wèn)答型驗證碼
以上驗證碼的價(jià)格在平臺上都是明碼標價(jià),普通的字母驗證碼1條在1分錢(qián)左右,而知識問(wèn)答類(lèi)在* 分錢(qián)左右,相較于利用這些灰產(chǎn)所會(huì )產(chǎn)生的利益,真是件美物廉,重點(diǎn)是還非常穩定。
同時(shí)我注意到國外的價(jià)格現在與國內的價(jià)格已經(jīng)相差不大,現在美國的價(jià)錢(qián)約為$1.* /1000,美國的打碼工已經(jīng)向東南亞擴展。打碼平臺一出現,2.2中提到的加強驗證碼的方法都無(wú)用了。因為不管你怎么變化,驗證碼總需要是人類(lèi)能夠通過(guò)的。
0×* 新的征程
打碼平臺的出現,雖然沒(méi)有從理論上打破CAPTCHA的原則,但是也從事實(shí)上擊破了防止程序自動(dòng)提交的防御,因此我們需要新型的安全的驗證方式。這些探索也帶來(lái)了現在各種多樣的驗證碼形式,這些我們將在下篇探討。
最后用一個(gè)“富有情懷”的圖片結束。
這張圖不是來(lái)自改變世界的極客,也不是來(lái)自富有愛(ài)心的藝術(shù)家。它來(lái)自某知名打碼平臺的官網(wǎng),是不是太有情懷了?(你們的確改變了我們的工作方式)
面對這樣的情懷,我想我現在只能做一件事情。