短信验证码安全

× 文章目录
  1. 1. 0x00 事件
  2. 2. 0x01 短信验证码接口没有设置下发频次
  3. 3. 0x02 无效验证码
  4. 4. 0x03 客户端验证绕过
  5. 5. 0x04 验证码与手机号未绑定
  6. 6. 0x05 验证码爆破

0x00 事件

短信验证码常被用于网站用户注册、账户安全登录以及忘记密码、确认下单等应用场景,特别是一些涉及到用户个人敏感行为时候,为了确认操作是用户本人执行的通常会使用短信验证码进行二次认证。

接口来源

  • 注册登录

    • 注册
    • 注册成功欢迎语
    • 登录
    • 找回密码
  • 操作提醒类

    • 操作提醒
    • 确定下单
    • 开通xx服务

0x01 短信验证码接口没有设置下发频次

短信验证码接口没有设置下发频次,发送大量验证码(短信轰炸)

IP数量不断变化,大量手机号码(不在意短信是否空号)

解决方法:

  1. 设置发送间隔:

    限制同一个手机号码重复发送的时间间隔。通常设置为60-120秒,前端做倒计时限制,时间未到不能点击发送短信按钮,后台也做时间间隔限制,时间未到不能发送短信。

  2. 设置单用户发送上限

    根据业务特点,设置每个用户单位时间内发送短信数的上限,如果超过阈值就不允许今天再次调用短信接口(阈值根据业务情况设置)。

  3. 单IP限定

    根据自己的业务特点,设置每个IP每天的最大发送量,另外可校验手机号码和IP是否属于同一地区,由于IP的特殊性可能存在所处IP是大出口,一旦误杀后果会很验证,所以这个限制根据自身情况酌情考虑,对于有风控的团队来说,当发现发送IP存在异常可以对该IP增加二次认证来防止机器操作,也可以降低误杀情况

  4. 流程限制

    注册用户,将发送短信验证码和设置用户名密码分成两个步骤,第一步一个页面用来设置用户名和密码,用户设置用户名和密码发送到后台,获取到后台返回的第一步成功回执之后,进入第二步另一个页面发送手机短信验证码。(增加同一页面批量操作的难度,提交的速度和IP提交限制)

    附:将手机短信验证和用户名密码设置分成两个步骤,用户在设置成功用户名密码后,下一步才进行手机短信验证,并且需要在获取第一步成功的回执之后才可进行校验。

    使用验证码的界面如有多个表单填写项,请设置为部分表单填写后才能使用短信验证码按钮

  5. 加入Token

    对发送者进行唯一性识别:防止修改参数伪造多个IP地址和手机号码进行恶意攻击,用Token作为唯一性识别标识,后台将Token注入到前端,前端可以获取到Token,请求发送短信验证码接口时带上Token,后台接收到Token进行验证,验证未通过不能发送短信。

  6. 增加图片验证码:

    采用图片验证码可有效防止采用自动化工具调用验证码短信接口,即当用户进行“获取短信验证码”操作前,弹出图片验证码,要求用户输入验证码后,服务器端再发送验证短信到用户手机上

    • 生成过程安全:图片验证码必须在服务器端进行产生与校验;
    • 使用过程安全:单次有效,且以用户的验证请求为准;
    • 验证码自身安全:不易被识别工具识别,能有效防止暴力破解,如算术题、中文类、选择题、滑动验证码等;
    • 当多次(2-5次)同一号码请求验证码,请弹出二次验证方式,或直接采用先识别图片验证码或者图形验证码后才允许获取短信验证码的方式
  7. 埋点

    通过js收集一些网页版的设备指纹和客户端信息上报,通过js生成hash指纹区别不通设备,同时上传浏览器ua、分辨率、平台、系统等信息,有宽泛的鉴别能力,通过此方法可以建立自己的情报库。

    对用户进行人机验证,例如,前段js的加载,用户页面停留的时间,判断用户是否代理IP。

    有能力企业可以自己做风控系统

0x02 无效验证码

有验证码模块,但验证模块与业务功能没有关联性,此为无效验证,一般在新上线的系统中比较常见。

  • 获取短信验证码后,随意输入验证码或存在万能验证码,直接输入两次密码,可成功更改用户密码,没有对短信验证码进行验证

  • 任意用户注册

    第一步,利用自己的手机号接收验证码进行验证,下一步跳转到一个设定密码的页面

    第二步,抓包,篡改手机号,使用任意手机号进行注册

业务一致性存在安全隐患,身份验证与密码修改过程分开,验证无效。

0x03 客户端验证绕过

客户端验证是不安全的,通过拦截替换返回信息,绕过客户端本地验证,可能导致任意账号注册、登录及重置任意用户密码等一系列问题

  • 直接返回明文验证码

  • 返回密文验证码

  • 拦截替换返回包

0x04 验证码与手机号未绑定

一般来说短信验证码仅能使用一次,验证码和手机号未绑定,验证码一段时期内有效

  • A手机的验证码,B可以拿来用;

  • A手机在一定时间间隔内接到两个验证码,都可以用。

任意用户密码重置

a、使用自己手机号收取验证码

b、自己的验证码和对方的手机号填上,下一步设置新密码

解决方法:

  1. 在服务器进行有效验证,手机号和验证码在服务器进行唯一性绑定验证。

  2. 在服务端限制验证码发送周期,设置时效,限制次数。

0x05 验证码爆破

短信验证码一般由4位或6位数字组成,若服务端未对验证时间、次数进行限制,则存在被爆破的可能