如何理解认证及验证机制失效类漏洞
应用程序通过网络要证明一个人的身份的话,就需要这个人的私密且唯一的东西,比如账号密码。绝大多数系统只要你提供了账号密码,就可以确定这个人是你。使用账号密码登录成功后,服务器会下发一个 token(登录凭证),接下来的操作只要带上这个 token 就可以了。
认证及验证机制失效(Identification and Authentication Failures)类漏洞基本也都发生在登录和校验 token 的地方,由于在确认用户身份、用户身份认证、会话管理过程中因逻辑漏洞或使用了不当的机制导致了安全漏洞的出现。
下面列举几个典型案例:
撞库攻击,攻击者通过收集互联网上已经泄露的账号和密码信息,生成对应的字典表,尝试批量登录其他网站后,得到一系列可以登录的用户。如果程序没有做对应的应对措施,就会导致用户数据泄露。
大多数的认证攻击是因为应用程序只使用密码作为登录的唯一因素,如果没有多因子认证,就很容易被攻击。
应用程序的会话超时时间设置不合理。如果一个用户使用公用电脑登录一个网站系统后,用户没有选择"登出"系统而只是关闭了浏览器就离开的话,即使过一段时间攻击者仍然可以打开此电脑的同一个浏览器访问同一个网站来获取此用户的数据,因为用户的账号仍然处于通过认证的状态。
避免出现认证及验证机制失效类漏洞产生需要注意的点
开启多因子认证来防止自动化撞库攻击、暴力破解和被盗的凭证重用攻击。
不要在发布或部署应用程序时设置默认账号密码,特别是管理员身份的账号。
提高密码的复杂度,例如要求密码长度8位以上,区分大小写字母,为大写字母、小写字母、数字、特殊符号中两种及以上的组合,不要有连续的字符比如1234abcd,尽量避免出现重复的字符比如1111。
安全地处理失败的身份校验提示,如使用"用户名或密码错误"提示登录失败而不是使用密码错误或者账号不存在,防止枚举攻击。
登录失败后,限制登录尝试频率并逐渐延长可以重试的间隔时间,检测到撞库攻击或暴力破解时,记录下来异常行为并给对应负责人发报警信息。
对登录成功后下发的 token 需要保证足够的随机性,比如采用足够强的随机数生成算法生成 token,用户登录完成后要生成新的 token 并且给 token 设置一个合理的有效期(例如十分钟、半个小时、一个小时等,时间不宜过长),token 要安全保存,用户长时间不操作或者退出系统要销毁 token。
在执行关键操作(如修改密码、更改手机号或邮箱)时,需要对用户身份进行二次验证。
密码不得以明文形式存储,必须使用不可逆的加密算法或者单向散列算法并使用一个随机生成的 salt 参与计算生成后存储,应用程序中禁止设置万能密码和硬编码密码。