6.1 验证技术
- 基于HTML表单的验证
- 多元机制,如组合型密码和物理令牌
- 客户端SSl证书或智能卡
- HTTP基本和摘要验证
- 使用NTLM或Kerberos整合Windows验证
- 验证服务
6.2 验证机制设计缺陷
6.2.1 密码保密性不强
- 非常短或空白的密码
- 以常用的字典词汇或名称为密码
- 密码和用户名相同
- 使用默认密码
6.2.2 蛮力攻击登录
- 应用程序运行攻击者使用不同的密码重复进行登录尝试,直到找到正确的密码。
6.2.3 详细的失败信息
- 可通过失败消息遍历大量用户名
6.2.4 证书传输易受攻击
- 未加密的证书易被窃听
- 通过URL中的查询字符串传递证书
- cookie中的证书易被窃取
6.2.5 密码修改功能
- 提供详细的错误消息,说明被请求的用户名是否有效
- 允许攻击者无限制猜测“现有密码字段”
- 在验证密码后,仅检查“新密码”和“确认密码”字段的值是否相同,允许攻击者不需要入侵,即可成功查明现有密码
6.2.6 忘记密码功能
- 向用户提出一个次要质询以代替主要登录功能
- 与密码修改功能一样,可能导致蛮力攻击
- 以简单的密码“暗示”代替回复质询
- 在用户正确响应一个质询后,应用程序即允许用户重新控制他们的账户
- 允许用户在成功完成一个质询后重新设置密码
6.2.7 “记住我”功能
- 通过简单cookie执行,cookie易被盗取
- 会话标志符易被预测和推断
- 易被XSS获取
6.2.8 用户伪装功能
- 伪装逻辑中存在的缺陷可导致垂直越权
- “后门”密码(用户通用密码)
- 伪装功能易被推测出
- 通过修改用户数据,肯能造成水平越权
6.2.9 证书确认不完善
- 截短密码,只确认前n个字符
- 不对密码进行大小写检查
- 检查密码之前删除不常用的字符
6.2.10 非唯一性用户名
- 两名用户可使用同一个用户名
6.2.11 可预测的用户名
- 应用程序以可预测的顺序自动生成账户用户名
6.2.12 可预测的初始密码
6.2.13 证书分配不安全
- 账户激活的URL可被推测
6.3 验证机制执行缺陷
6.3.1 故障开放登录机制
- 未经验证即可直接登录
6.3.2 多阶段登录机制中的缺陷
- 应用程序可能认为访问第三阶段的用户已完成第一、二阶段的认证,从而避开第一二阶段认证
- 应用程序可能会信任由第二阶段产生的数据,但是,这些数据会被攻击者篡改
- 应用程序可能认为每个阶段的用户身份不会发生变化,因此不会再每个阶段明确用户身份
6.3.3 不安全的证书存储
- 以MD5或SHA-1等标准算法处理的密码可被查询出来
6.4 保障验证机制的安全
6.4.1 使用可靠的证书
- 强制执行适当的最小密码强度要求
- 使用唯一的用户名
- 系统生产的任何用户名和密码应具有足够的随机性
- 允许用户设置足够强度的密码
6.4.2 安全处理证书
- 以不会造成非授权泄露的方式创建、保存和传送所有证书
- 使用公认加密技术局(SSL等)保护客户端和服务器之间的通信
- 必须保证使用HTTPS加载登录表单,而不是在提交登录信息时才转换到HTTPS
- 只能使用POST请求向服务器传输证书
- 存储用户密码时,使用强大的散列函数,并对其进行“加salt处理”
- “记住我”功能应仅记忆如用户名之类的非保密数据,不应保存明文证书
- 要求用户定期修改密码
6.4.3 正确确认证书
- 确认完整的密码
- 应在登录处理过程中主动防御无法预料的事件
- 仔细进行代码审查,防止逻辑错误
- 严格控制用户权限
- 对多阶段登录进行严格控制
6.4.4 防止信息泄露
- 各种验证机制不应通过公开消息,或者通过从应用程序的其他行为进行推断
- 由一个单独的代码组件负责响应失败的登录尝试
- 防止枚举现有用户名
-
- 不允许自我选择用户名
-
- 使用电子邮箱作为用户名
6.4.5 防止蛮力攻击
- 对验证功能执行的各种质询采取保护措施
- 使用无法预测的用户名
- 在检测到少数几次登录失败后,应立即禁用该账户
- 使用CAPTCHA质询
6.4.6 防止滥用密码修改功能
- 要求用户定期修改密码
- 只能从已通过验证的会话中访问该功能
- 不应以任何方式直接提供用户名
- 要求用户重新输入现有密码
- 新密码应输入两次
- 应使用常规错误消息告知用户现有证书中出现的任何错误
- 使用常规方式(如电子邮件)通知用户其密码已被修改
6.4.7 防止滥用账户恢复功能
- 防止密码回复机制被未授权方攻破
- 不要使用密码“暗示”之类的特性
- 通过电子邮件给用户发送一个唯一的、具有时间限制的、无法猜测的一次性恢复URL帮助用户恢复密码
- 在密码重设功能前,对用户进行质询
6.4.8 日志、监控与通知
- 应在日志中记录所有与验证有关的事件,包括登录、推测、密码修改、密码重设、账号冻结与账户恢复
- 应用程序的实时警报与入侵防御功能应对验证过程中的异常事件进行处理
- 应以非常规方式向用户通报仁和重大的安全事件
- 应以非常规方式向用户通报经常发生的安全事件
6.5 小结
验证功能可能是应用程序受攻击面中的首要目标。现实中的验证机制存在大量的设计与执行缺陷,使用系统化的方法尝试各种攻击途径,即可对这些缺陷发起全面有效的攻击。
除主登录表单外,注册新用户、修改密码、记住密码、回复遗忘的密码与伪装其他用户等功能,都可能成为潜在缺陷的来源。