【逻辑漏洞】重置/忘记密码安全问题
- 密码重置令牌泄漏
- 密码重置中毒
- 电子邮件轰炸
- 密码重置令牌生成方式太过简陋
- 使用过期令牌
- 用好的响应替换坏的响应
- 尝试使用自己的重置令牌
- 注销/密码重置中的会话失效
密码重置令牌泄漏
如果密码重置令牌包含在 URL 中,并且用户在请求密码重置后点击了来自第三方网站的链接,那么第三方网站可能会通过HTTP引用者标头获取该令牌。这样的情况下,如果第三方网站是恶意的,它可以利用这个令牌进行跨站请求伪造(CSRF)攻击
CSRF攻击是一种利用用户已通过身份验证的会话执行未经用户授权的操作的攻击方式。攻击者可以伪装成受害者在受害者已经登录的网站上执行操作,例如更改密码、发送消息等。在这种情况下,如果密码重置令牌泄露,并且用户点击了恶意网站上的链接,恶意网站可以在用户不知情的情况下利用令牌请求密码重置,从而接管用户的账户。
密码重置中毒
攻击者可能在密码重置请求期间操纵主机标头,将重置链接指向恶意站点。之后在恶意站点获取用户的密码重置令牌导致账户被接管
修补方案:
- 使用
$_SERVER['SERVER_NAME']
构建密码重置URL,而不是使用$_SERVER['HTTP_HOST']
- 针对允许域名的白名单验证主机标头
- 使用安全的服务器端方法生成绝对URL
电子邮件轰炸
在密码重置请求上缺乏速率限制可能导致电子邮件轰炸,使用户被大量重置邮件淹没。
修补方案:
- 基于IP地址或用户账户实施速率限制。
- 使用CAPTCHA(验证码)来防止自动爆破攻击。
密码重置令牌生成方式太过简陋
可以使用使用Burp Sequencer分析令牌的随机性,如果令牌生成背后的模式或方法可以被预测或暴力破解令牌,容易导致账户接管
修补方案:
- 使用强大的加密方法生成令牌
- 确保足够的随机性和长度以防止可预测性
使用过期令牌
测试过期令牌是否仍然可以用于密码重置
修补方案:
- 实施严格的令牌过期策略,并在服务器端验证令牌过期
用好的响应替换坏的响应
操纵HTTP响应以绕过错误消息或限制
修补方案:
- 实施服务器端检查以确保响应完整性。
- 使用安全的通信渠道如HTTPS来防止中间人攻击。
尝试使用自己的重置令牌
测试攻击者的重置令牌是否可以与受害者的电子邮件一起使用。
修补方案
- 确保令牌绑定到用户会话或其他用户特定属性。
注销/密码重置中的会话失效
确保用户注销或重置密码时会话失效
修补方案:
实施适当的会话管理,确保所有会话在注销或密码重置时失效