| 威胁代理/攻击特征 | 安全弱点 | 影响 |
|---|---|---|
| API相关:可利用性 3 | 普及率 2:可检测性 2 | 技术性 3:业务相关 |
| 在 API 中进行身份验证是一个复杂和令人困惑的机制。软件和安全工程师可能对身份验证的边界以及如何正确实现身份验证存在误解。此外,身份验证机制是攻击者的易于攻击的目标,因为它向所有人公开。这两点使得身份验证组件潜在地容易受到许多攻击。 | 存在两个子问题:1. 缺乏保护机制:负责身份验证的 API 端点必须与常规端点有所不同,并实现额外的保护层;2. 机制的错误实现:机制被使用/实现时没有考虑攻击特征,或者用于错误的用例(例如,为物联网客户端设计的身份验证机制可能不适用于 Web 应用程序)。 | 攻击者可以控制系统中其他用户的帐户,读取他们的个人数据,并代表他们执行敏感操作,例如货币交易和发送个人信息。 |
身份验证端点和流程是需要保护的资产。此外,“忘记密码/重置密码”应被视为身份验证机制的一部分。
如果公开面向的 API:
- 允许使用有效用户名和密码列表进行密码猜测。
- 允许攻击者在不提供验证码/帐户锁定机制的情况下对同一用户帐户进行暴力攻击。
- 允许使用弱密码。
- 在 URL 中发送敏感的身份验证细节,例如身份验证令牌和密码。
- 允许用户更改其电子邮件地址、当前密码或执行任何其他敏感操作,而无需要求确认密码。
- 不验证令牌的真实性。
- 接受未签名/弱签名的 JWT 令牌(
{"alg":"none"})。 - 不验证 JWT 过期日期。
- 使用纯文本、未加密或弱哈希的密码。
- 使用弱加密密钥。
除此之外,如果微服务:
- 其他微服务可以在未经身份验证的情况下访问它
- 使用弱或可预测的令牌强制执行身份验证
为了执行用户认证,客户端必须发出如下API请求,其中包含用户凭证:
swiftCopy code
POST /graphql
{
"query":"mutation {
login (username:\"<username>\",password:\"<password>\") {
token
}
}"
}
如果凭证有效,则返回一个认证令牌,后续请求需要提供该令牌以识别用户。登录尝试受到限制性速率限制:每分钟仅允许三个请求。
攻击者可以利用GraphQL查询批处理绕过请求速率限制,加快攻击速度,以暴力登录受害者的帐户:
swiftCopy code
POST /graphql
[
{"query":"mutation{login(username:\"victim\",password:\"password\"){token}}"},
{"query":"mutation{login(username:\"victim\",password:\"123456\"){token}}"},
{"query":"mutation{login(username:\"victim\",password:\"qwerty\"){token}}"},
...
{"query":"mutation{login(username:\"victim\",password:\"123\"){token}}"},
]
为了更新与用户帐户相关联的电子邮件地址,客户端应发出如下API请求:
bashCopy code
PUT /account
Authorization: Bearer <token>
{ "email": "<new_email_address>" }
由于API不需要用户提供当前密码来确认其身份,因此攻击者可以将自己置于窃取认证令牌的位置。他们还可能通过更新受害者帐户的电子邮件地址后启动重置密码工作流程来接管受害者的帐户。
- 确保您了解所有可能的API身份验证流程(实现单击身份验证的移动/ Web/深链接等)。询问您的工程师您错过了哪些流程。
- 阅读有关身份验证机制的信息。确保您了解这些机制及其用法。OAuth不是身份验证,API密钥也不是身份验证。
- 在身份验证、令牌生成或密码存储方面不要重新发明轮子。使用标准。
- 凭据恢复/忘记密码端点应在暴力破解、速率限制和锁定保护方面视为登录端点。
- 对于敏感操作(例如更改帐户所有者电子邮件地址/ 2FA电话号码),要求重新进行身份验证。
- 使用 [OWASP身份验证备忘单][1]。
- 在可能的情况下,实施多因素身份验证。
- 实施反暴力破解机制,以减轻对身份验证端点的凭据填充、字典攻击和暴力攻击。此机制应比API上的常规速率限制机制更严格。
- 实施 [帐户锁定][2]/验证码机制,以防止针对特定用户