驗證碼就是每次訪問頁面時隨機生成的圖片,內容一般是數字和字母(更BT點的還有中文,呵呵),需要訪問者把圖中的數字字母填到表單中提交,這樣就有效地防止了暴力破解,驗證碼也用於防止惡意灌水、廣告帖等等,以避免服務器遭受惡意攻擊!
那么,驗證碼機制又該如何實現。
目前主流的實現技術主要有session和cookie兩種方式,而這兩種方式可以說技術是一樣的,區別在於將驗證碼字符串存儲在服務器還是客戶端。
前者工作流程:服務器發送驗證碼圖片到客戶端並在服務器保存驗證碼字符串到session,用戶辨認圖片並提交驗證碼字符串到服務器,服務器將用戶提交的驗證碼字符串與session中保存的字符串進行比較。
后者工作流程:服務器發送驗證碼圖片以及驗證碼字符串(可能會進行加密)到客戶端,客戶端將驗證碼字符串存儲到本地cookie,用戶辨認圖片並提交驗證碼字符串以及cookie中所存儲的字符串到服務器,服務器將用戶提交的兩個字符串(進行解密后)進行比較。
相對而言,存放在服務器的session更為安全,只不過消耗服務器內存,程序員除了使用模式識別辨認出驗證碼,沒有其他辦法。而對於使用cookie方式的驗證碼,不增加服務器內存消耗,但我們可以通過對傳輸數據進行分析輕易破解驗證碼。
溯雪是早年大名鼎鼎的黑客神器“刀光雪影”之一,其功能就是暴力破解表單,那時很是很流行的。但是后來有了驗證碼這個東東,幾乎把溯雪推向了死路。但是真的完全是死路了嗎?
(這個軟件是利用asp、cgi對免費信箱、論壇、聊天室進行密碼探測的軟件。密碼探測主要是通過猜測生日的方法來實現,成功率可達60%-70%。溯雪的運行原理是通過提取asp、cgi頁面表單,搜尋表單運行后的錯誤標志,有了錯誤標志后,再掛上字典文件來破解信箱密碼。由於許多人對密碼的設置采用了自己的生日或常用英文單詞等較簡單的方式,這給溯雪留下了很大的施展空間。)
對於驗證碼機制,網上的攻擊手法都是利用數學方法分析圖片,當然我們不能老是跟着別人的思路走噻,那樣多沒創意撒!
破解方式一:session
想想驗證碼的思路:就是每次在登陸的地方訪問一個腳本文件,該文件生成含驗證碼的圖片並將值寫入到session里,提交的時候驗證登陸的腳本就會判斷提交的驗證碼是否與session里的一致。
問題出現了,在登陸密碼錯誤之后,我們不去訪問生成驗證圖片的文件,那么如果session中的驗證碼沒有被清空,此時驗證碼就是跟上次的一樣,辛辛苦苦構建的防暴力破解就形同虛設了。
大致解決方法:密碼錯誤之后session中的驗證碼值被置空且每次檢查驗證碼的時候先檢查是否為空,並重新發送新的id至session.
PowerEasy2005的管理員登陸頁面就是個很好的實例,只要我們把首次訪問的驗證碼辨認出來,以該會話cookie值不斷提交就可以實現暴力破解了。圖中就是用溯雪破解的結果。
類似的情況還有PJBlog2的登陸驗證,其他的程序沒看,體力活了,不好玩。
破解方式二:cookie欺騙
方式1,通過模式識別辨認出圖片所承載的驗證碼字符串,然后提交的時候直接發送識別的字符串。
方式2,通過解密破譯出verifysession的明文。
方式3,提前獲得幾組甚至幾百幾千組驗證碼(需要人眼識別,人手輸入)及其密文。而且所獲得的驗證碼還不能閑置太長時間(以防驗證碼過期),在特定時間連續並快速的提交。
利用驗證碼的漏洞還可以實現DOS(還有刷投票之類的,呵呵),比如這個CSDN博客系統,回復的驗證碼就存在這個問題,所以你可以抓包不斷提交(喂,先說好,不准拿我試驗)