短信验证码安全常见逻辑漏洞

  • A+
所属分类:安全文章

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

      在实际应用中,有很多产品的短信验证码接口存在诸多逻辑漏洞,针对手机短信验证码可能存在的问题,这里总结常见的逻辑漏洞如下,供大家参考:

1、短信验证码接口没有设置下发频次

      ①无限制,任意下发;

      ②有一定时间间隔,无限下发;

      短信验证码接口没设频次上限导致短信轰炸。这种情况往往出现在一些小站或者子站,这几年很少看到通过GET请求发送短信验证码了,基本都是使用POST请求,使用抓包软件可以重放请求对于后端没有做限制的网站就可以达到短信轰炸的效果。

      危害:对用户来说个人生活受到骚扰,对企业来说造成一定的负面影响,很多小公司因为短信验证码接口被大量调用出现运营问题,对于公司没有安全工程师的情况下,一般都是业务方发现了数据异常向上汇报,最后和开发一起反溯才会找到这个问题,那么在这段时间中对企业所损失的钱也是无法挽回的。

      预防:这里主要是针对两种攻击场景来进行防御,第一种是对单用户的短信轰炸,即重放发送请求且phonenum为一个值。第二种是对多用户发送短信骚扰的场景,即将phonenum参数设置为字典,重放短信验证码接口。

      ①设置发送间隔,即单一用户发送请求后,与下次发送请求时间需要间隔60秒。

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

      ③设置单IP发送上限,这种情况是预防第二种攻击场景的,由于IP的特殊性可能存在所处IP是大出口,一旦误杀后果会很验证,所以这个限制根据自身情况酌情考虑,对于有风控的团队来说,当发现发送IP存在异常可以对该IP增加二次认证来防止机器操作,也可以降低误杀情况。

2、无效验证

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

     ①获取短信验证码后,随意输入验证码,直接输入两次密码,可成功更改用户密码,没有对短信验证码进行验证,可能导致CSRF等问题。

        短信验证码安全常见逻辑漏洞

     ②任意用户注册

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

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

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

      短信验证码安全常见逻辑漏洞

  3、客户端验证绕过

       客户端验证是不安全的,可能导致任意账号注册、登录及重置任意用户密码等一系列问题。

      ①直接返回明文验证码

      ②返回密文验证码

      ③拦截替换返回包

 4、验证码与手机号未绑定

      一般来说短信验证码仅能使用一次,验证码和手机号未绑定,验证码一段时期内有效,那么就可能出现如下情况:

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

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

     案例一:任意用户密码重置

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

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

     解决方案:

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

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

     短信验证码安全常见逻辑漏洞

5、验证码爆破

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

原文链接:https://blog.csdn.net/qq_36334464/article/details/79467894?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link


推荐↓↓↓


原文始发于微信公众号(系统安全运维):短信验证码安全常见逻辑漏洞

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: