系统使用验证码主要是意图一般有两个个目的,即辅助身份验证(短信或邮箱验证码)和防止攻击者利用自动化脚本恶意攻击网站(数字,图片,视频,行为式等验证码)。
验证码的生命周期
验证码的目的为辅助验证和防止脚本攻击,其生成和销毁的时机以及其是否容易被攻击者猜测和破解是其能否达成设计目的的根本
Step 1:后端识别验证码生成时机,并生成验证码,并设置其失效时机,将验证码返回给用户
Step 2:用户使用验证码进行对应验证操作
Step 3:验证完成后(无论对应验证请求是成功还是失败),验证码销毁,再次使用此验证码进行验证时将作为无效验证码处理
Step 4:到达验证码失效时间后,验证码销毁,再次使用此验证码进行验证时将作为无效验证码处理
以下为验证码设计中常见安全缺陷,在没有特殊标识的情况下,“验证码”指所有验证码
常见问题汇总
验证码由前端生成
验证码由客户端生成是指前端的JS生成验证码并在前端验证,或者将前端生成的样子内容发送给后端工段进行验证,这样的方式并不安全,因为前端的安全性无法保证,攻击者可以篡改JS代码或绕过客户端验证,或固定验证码内容来进行验证码的绕过。
严重程度
中
测试方法
1、观察在获取验证码过程是否给后端发送请求,并由后端返回验证码信息,如没有给后端发送请求则存在安全问题
修复建议
验证码的生成也验证都应在后端进行
出现阶段:Step 1:后端识别验证码生成时机,并生成验证码,并设置其失效时间,将验证码返回给用户
重复的获取短信验证码
在设计短信验证码时没有对短信验证码的请求频次进行限制,导致攻击者可以利用次特性进行短信轰炸,或耗尽服务资源
严重程度
中
测试方法
短时间内多次重发获取短信验证码请求,观察响应信息以及短信是否被发送多次,如短信发送多次则存在安全问题
修复建议
1、限制单个IP的验证码获取次数。
2、在获取验证码时增加其他类型验证码,提升重复获取成本
出现阶段:Step 1:后端识别验证码生成时机,并生成验证码,并设置其失效时间,将验证码返回给用户
已被识别的验证码
这个属于最简单的验证码,过于简单、清晰、可识别性高,可以编写程序进行识别,导致验证码防御体系失效
严重程度
低
测试方法
1、观察验证码有无干扰元素,或干扰元素过少,如下;此类已被识别
修复建议
1、增加验证码的复杂性:可以增加验证码的图片干扰元素,例如线条、文字、背景等,以增加OCR识别的难度。
2、限制请求频率:可以限制用户请求验证码的频率,例如每分钟只能请求一次验证码,以防止暴力破解。
3、较为重要的系统建议使用交互行验证码
出现阶段:Step 1:后端识别验证码生成时机,并生成验证码,并设置其失效时间,将验证码返回给用户
验证码明文出现在Response中
获取验证码的请求中,验证码信息明文出现在Response中,攻击者可以直接读取Response中的验证码字段进行下一步的攻击。
严重程度
中
测试方法
查看获取验证码请求的响应信息,如存在明文验证码信息则存在安全问题
修复建议
验证码不可明文出现在Response中
出现阶段:Step 1:后端识别验证码生成时机,并生成验证码,并设置其失效时间,将验证码返回给用户
验证码可以爆破
由于验证码设置比较简单,可能只有数字或字母组成,也可能是其设定范围有限,导致验证码的数量一共就那么几个,内容可以被猜测。此时服务端未对验证时间、次数作出限制,故存在爆破的可能性。
- 例:对于4位纯数字验证码:从0000~9999的10000种可能用多线程在5分钟内跑完并不是很难。
如果验证码组成相对复杂,如6位验证码,或字母与数字组合则爆破难度则很高,导致攻击成本也提升很多,例如6位的纯数字验证码的验证时间为4位纯数字验证码的100倍
严重程度
低
测试方法
多次尝试获取验证码观察验证码组成,如验证码组成相对简单,如4位纯数字验证码则进行爆破操作,观察后端是否有爆破限制
修复建议
1、根据系统重要程度合理设计验证码负责程度
2、对于验证码构成简单,建议设计防爆破机制
出现阶段:Step 2:用户使用验证码进行对应验证操作
验证码绕过
验证码绕过是指对应验证请求中存在某个控制字段,通过控制该字段的值可以控制是否打开验证码验证功能,攻击者控制了该字段也就验证码的绕过。
严重程度
中
测试方法
1、检查从请求体是否有除必要验证字段外的可疑字段,尝试分析修改可疑字段观察响应结果,如可以通过控制字段绕过验证码的校验即存在安全问题。
2、检查直接删除验证码字段,请求是否可以成功处理
此处较为有效的方式为使用白盒或灰盒方式审计接口的设计中有无验证码控制字段,通过拦截请求一般较为容易遗漏
修复建议
出现阶段:Step 2:用户使用验证码进行对应验证操作
验证码重用
验证码重用是指,验证码在使用后没进行销毁,导致攻击者可以反复利用验证码进行爆破,从而失去了验证码的真正作用,验证码未失效分为两种情况。
- 对应验证操作成功后,验证码未失效
- 对应验证操作失败后,验证码未失效
严重程度
中
测试方法
1、使用正确的用户密码,输入验证码进行验证,拦截请求进行回放,如两次验证请求均成功则说明验证码存在重用问题。
2、使用错误的用户密码,输入验证码进行验证,拦截请求进行回放,如两次验证请求均成功则说明验证码存在重用问题。
修复建议
验证码在使用后必须进行失效处理
出现阶段:Step 3:验证完成后(无论对应验证请求是成功还是失败),验证码销毁,再次使用此验证码进行验证时将作为无效验证码处理