一、驗證碼的原理:
驗證碼是在登錄、查詢敏感數據、執行敏感操作等地方加入的一類驗證驗證機制,其原理就是服務器生成一段字符串(字母、數字、漢字、圖片等),發送給客戶端(一般以圖片的形式)。客戶端由操作者識別后輸入,作為請求的一部分發送給服務器,服務器來驗證自己保存的和用法發送的是否一致。
二、驗證碼的功能:
1、登錄過程中防止暴力破解。
2、防止爬蟲(訪問頻率或者頻次超限后需要輸入驗證碼)。
3、識別人機,其實也是防爬蟲的一部分。
4、避免垃圾郵件、短信轟炸。
5、防止DDOS攻擊。
三、驗證碼實現機制問題與繞過:
1、驗證碼直接返回到前端頁面或從響應報文中可以獲取的:
響應報文以明文形式或者可逆加密或者可逆編碼的形式返回了驗證碼的內容,攻擊者直接編寫腳本獲取這個驗證碼的值再次提交就可以了。這個存儲的位置可以是響應報文的任何地方,例如數據部分、session部分、cookie部分或者其他頭部字段中。
2、驗證碼不夠隨機,而是有限的選項:
也就是說驗證碼是有庫存的,一共只用有限中可能性,例如20種,那么把這二十種做成一個字典,嘗試不斷暴力破解就可以了。例如,只用二十種字母數字組成的驗證碼,一共生成了而是張圖片,記錄每張圖片的哈希值和對應的驗證碼內容,則可以編寫破解腳本。
3、驗證碼服務器端驗證漏洞:
服務器端對驗證碼的驗證存在以下問題:
(1)只驗證參數存在與否,沒有驗證驗證碼的內容值:任意驗證碼都可以繞過,那就隨機填寫即可。
(2)特殊值可以繞過驗證:例如空值或者所謂的萬能驗證碼000000。
(3)沒有驗證驗證碼參數但是驗證了內容值:去掉參數可以繞過,這里邏輯可能有點亂,寫一個后台簡易邏輯代碼:
1 def login(request): 2 user = request.POST.get["user"] 3 pswd = request.POST.get["user"] 4 if request.POST.get("verifycode") != None: 5 code = request.POST["verifycode"] 6 if code == realcode: 7 return HttpResponse("OK") 8 else: 9 return HttpResponse("Sorry") 10 ret = account_table.object.get(username=user) 11 if ret.password == pswd: 12 return HttpResponse("OK") 13 else: 14 return HttpResponse("Sorry")
4、驗證碼太簡單,可以使用簡單的腳本代碼去識別發送。
例如PKAV的HTTP Fuzzer等等。
5、驗證碼不刷新:
5.1一直不刷新:
這里指,只要不刷新登錄或者操作頁面,驗證碼就一直不刷新,與操作(或者登錄)成功失敗無關,這種情況下只要保持頁面不刷新,就可以爆破。
5.2特定條件下不刷新:
例如,失敗后彈出提示頁面或者對話框,只要不點擊取消或者確定,保持提示頁面或者對話框不退出,就可以利用burpsuite中的intruder模塊進行爆破。
6、存在不需要驗證碼的頁面(一般適用於登錄):
沒說的,這種就直接干就可以了。