验证码漏洞问题小结

一、验证码的原理:

验证码是在登录、查询敏感数据、执行敏感操作等地方加入的一类验证验证机制,其原理就是服务器生成一段字符串(字母、数字、汉字、图片等),发送给客户端(一般以图片的形式)。客户端由操作者识别后输入,作为请求的一部分发送给服务器,服务器来验证自己保存的和用法发送的是否一致。

二、验证码的功能:

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、存在不需要验证码的页面(一般适用于登录):

没说的,这种就直接干就可以了。

原文地址:https://www.cnblogs.com/KevinGeorge/p/8391959.html