SMS短信身份认证常见缺陷

时间:2024-04-15 14:50:38

0x01 概述

在线服务多使用SMS进行身份验证,但是细微的实现错误极为容易引起重大问题。

B2C服务中此身份验证协议比较流行,他提高使用效率,因为无需记密码,登录名为手机号,接收sms验证代码就可注册和验证身份。

 

 

 0x02 身份验证机制的主要威胁

1、账户接管

攻击手法:在不知道账户的前提下,攻击者直接窃取任意用户账户。(威胁等级高)

2、用户模拟

冒名顶替的威胁并不是那么关键,但是损害取决于具体的服务,模拟成功可以获取已注册用户信息,因为确认机制相同

3、资源枯竭

Web服务器连接到各种SMS消息传递提供者,后者对每条消息收取费用,因此在SMS泛滥期间,服务器本身的资源池(网络空间,内存,队列,磁盘空间)以及SMS网关中的账户余额都可能被耗尽

0x03 弱点和攻击

 

 

团队公开的参阅资料https://hackerone.com/r0hack

 

缺乏限速

 

这是SMS身份验证弱点的一般类别,这种漏洞的利用是显而易见的:由于尝试次数没有足够的限制,因此可以简单地强制使用授权码。

 

通常,确认码由4到6位数字组成,因此搜索所需的最大请求数最多为100万,这对于现代Web来说并不多。

 

速率限制链接到Cookie

 

有时,登录尝试的次数与cookie标识符相关联,攻击者可能会简单地省略相应的cookie标识符,以便不计入登录尝试次数。

 

相同的代码用于不同的动作

 

漏洞在于,一个界面(例如,在注册页面上)发送的确认代码也可以用于另一项操作(例如,用于登录帐户)。

 

来自漏洞赏金的此类漏洞的一个示例:尝试进行身份验证时,用户收到了SMS代码,并且由于尝试次数受到限制,因此无法强行使用该代码,但是,如果攻击者向API发送相同的代码以进行攻击,注册后,应用程序将针对正确的代码返回以下响应:

 

 

在注册界面中没有速率限制限制,这意味着可以通过强行强制注册码并将其作为身份验证的确认码发送来入侵任何帐户。

 

缺少验证码年龄

 

碰巧的次数是没有限制的,但是代码的寿命很短,很难被暴力破解。

 

在错误搜寻期间,在一种流行的服务中的一种机制中发现了一个漏洞:尽管事实上一个6位代码的生命周期只有3分钟(在3分钟内发送100万个请求非常困难),现实上根本没有生命周期,因为应用程序在再次发布代码时发送了相同的代码。

 

显然,开发人员认为,如果没有人输入先前的代码,则无需再次生成随机代码。因此,要尝试百万种组合,大约每2.5至3分钟必须请求并接收一个“新”代码和新cookie。

 

短信洪水

 

速率限制不仅应限制使用单个电话号码登录的尝试次数,还应限制对整个应用程序的请求次数,因为攻击者可能会尝试对特定用户而不是大规模执行泛洪,以损害服务本身(触发DoS或耗尽资金)。

 

不安全的随机数

 

自然,确认代码必须是随机的,因为如果可以预测它(例如,如果它的值仅取决于Unix时间的当前秒),则任何帐户都可以被盗。

 

我们发现的错误之一是,导致漏洞的不是确认代码本身的可预测性,而是漏洞的标识符。在其中一项服务中,每个确认代码都分配有一个数字,事实证明,该数字是全局标识符,并且对于发布给用户的每个下一个代码都会递增。

 

当用户输入代码时,以下JSON请求已发送到服务器:

 

 

原来,此标识符未链接到会话,因此攻击者可能代表当时尝试登录或注册的其他用户发送不正确的确认代码。知道了verify_code_id的当前值,可以通过在当前值上添加不同的数字来发送很多确认请求,从而阻止其他用户并导致拒绝服务。

 

用户*

 

先前描述的漏洞和相应的攻击是DoS攻击的特例。

 

如果在超出速率限制时阻止了用户帐户,则可能会大量拒绝服务:攻击者可以简单地为每个客户端进行几次不成功的身份验证尝试,从而阻止所有帐户。当然,为此,他需要知道他们的电话号码或登录名。

 

短信嗅探

 

通过SMS发送数据是不安全的,这已不是秘密。拦截消息的方式有很多种,包括在SS7信令网络级别上的攻击,在GSM层上对用户的攻击,在SMS提供商的网关上的危害,在蜂窝运营商网站上的客户个人帐户的危害等。

 

所描述的SMS拦截方法通常不是由Web服务本身的弱点引起的,但是在开发应用程序时有必要考虑此类攻击的风险。

 

推荐建议

 

为了降低风险级别,我们建议以下提示:

 

  • 使用6位数的确认码
  • 限制来自一个IP地址的身份验证尝试的次数和频率
  • 考虑当前会话中的尝试次数以及电话号码的总数
  • 几次尝试失败后,请勿阻止用户帐户
  • 对于每次登录尝试,生成一个新的唯一代码
  • 使用单独的代码来确认每个操作
  • 不要使用可预测的标识符和确认码
  • 对于高度敏感的操作,请勿使用SMS确认,实施适当的2FA或至少推送通知或呼叫。