针对一次性密码重发功能的拒绝服务攻击

Denial of Service attack for One Time Password resend function

在我们的 Web 应用程序中,我们有一个用户重置 his/her 密码的功能。该过程的一部分需要通过 SMS 发送 OTP。问题是,我们的页面中有一个功能,允许用户在由于某些原因(短信提供商错误、网络错误等)而未收到 OTP 的情况下重新发送 OTP。通过最近的渗透测试,发现发送OTP的后端调用容易受到DoS攻击。黑客可以 运行 它向用户发送短信。

我们的防火墙中已有一种机制,可以检测针对拒绝服务的自动攻击。问题是,防火墙将其归类为攻击有每秒请求的最低限制。 (例如,每秒 100 个请求,FW 会阻止它,但允许低于此值的请求)。

假设黑客做了一个程序,每秒通过短信重新发送 otp,防火墙将无法检测到它。我们可以做的另一种选择是以编程方式处理它,但我们想不出最好的方法。谁能就此给我们建议?我们不能只限制OTP可以重发的次数,因为我们担心它会影响用户体验。

您是否查看过实际用例中的时间安排?

例如,如果真实用户在按下重试之前需要 20 秒,那么您可以将该限制添加到您的服务中,而真实用户并不知道该限制已到位。 这并不意味着您不能在此时间之前接受另一个请求,它可以排队直到超时过去。

我想到两件事:

采纳 Macuistin 的想法,但让超时随着时间的推移而增加。我知道我不想一分钟收到 3 条短信。在 X 条消息后不再发送并让他们联系支持人员。如果这是一个合法用户,在收到这么多消息后有些不对劲,你应该停下来。

如何在这之前加一个步骤,发送一个link到one-timelink用户的邮箱,点击link就会发送他们到页面输入在 link 上触发的 OTP(那里也可能会重新发送 link,这不会触发另一封电子邮件)。

这将无法通过 WAF,在这里您可以使用 Captcha 来尝试失败。 验证码仅在特定限制交叉时弹出。您可以对 IP、UserID 和会话变量设置限制。