认证漏洞发生在认证机制存在缺陷,允许攻击者绕过安全控制、冒充合法用户或未经授权访问受保护资源时。本文档涵盖了针对认证系统的各种攻击向量和利用技术,包括JWT漏洞、账户接管方法、MFA绕过和LDAP认证弱点。
有关JWT实现细节和攻击,请参阅JWT令牌攻击。有关完整的账户接管技术,请参阅账户接管技术。有关OAuth和SAML特定漏洞,请参阅OAuth和SAML漏洞。
JSON Web Token 是一种在 Web 应用程序中实现认证和授权的流行方法。由于其无状态性和灵活性,它们被广泛应用于现代应用程序中,但如果实现不当,则会包含许多潜在的安全弱点。
来源: JSON Web Token/README.md1-96 JSON Web Token/README.md120-205
JWT 的签名组件对于验证其真实性至关重要。多种攻击都针对此安全机制:
空签名攻击 (CVE-2020-28042):发送一个包含签名算法但未提供实际签名的 JWT。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
None 算法攻击 (CVE-2015-9235):修改算法字段为 "none" 并移除签名。
# Algorithm variants
none, None, NONE, nOnE
密钥混淆攻击 (CVE-2016-5431):将 RS256(非对称)更改为 HS256(对称),并使用公钥作为 HMAC 密钥。
密钥注入攻击 (CVE-2018-0114):在标头中嵌入一个包含攻击者控制的公钥的 JWK。
公钥恢复:从两个不同的签名 JWT 中计算 RSA 公钥。
来源: JSON Web Token/README.md120-296
JWT 头部包含重要的元数据,可以被操纵以绕过验证:
kid (Key ID) 参数滥用:
/root/res/keys/secret.keyhttp://:7070/privKey.key../../dev/nulljku (JWK Set URL) 注入:
/jwks.json, /.well-known/jwks.json来源: JSON Web Token/README.md395-505
许多应用程序使用弱密钥来签署 JWT。这些弱密钥可以通过以下方式破解:
使用 hashcat 和 jwt_tool 等工具可以显著加速这些攻击。
来源: JSON Web Token/README.md298-393
账户接管 (ATO) 涉及通过各种攻击向量获取对用户账户的未授权访问。
来源: Account Takeover/README.md1-20
密码重置功能通常包含关键漏洞:
通过 Referrer 泄露令牌:重置令牌通过 Referer 头信息泄露给第三方网站。
密码重置中毒:操纵请求头信息以重定向重置令牌。
电子邮件参数操纵:使用各种技术注入额外收件人。
email=victim@mail.com&email=hacker@mail.com
email=victim@mail.com,hacker@mail.com
{"email":["victim@mail.com","hacker@mail.com"]}
弱重置令牌:基于用户数据或弱算法的可预测或可猜测令牌。
用户名冲突:注册包含空格的用户名,以触发合法用户的密码重置。示例:"admin " vs "admin"
Unicode 标准化问题:使用看起来相似但标准化后值相同的 Unicode 字符。示例:demo@gmail.com vs demⓞ@gmail.com
来源: Account Takeover/README.md22-122
几种常见的 Web 漏洞可能导致账户接管:
跨站脚本 (XSS):窃取会话 Cookie 和认证令牌。
HTTP 请求走私:通过格式错误的请求捕获认证数据。
跨站请求伪造 (CSRF):诱骗用户执行认证操作。
JWT 操纵:修改 JWT 令牌以冒充其他用户。
来源: Account Takeover/README.md123-181
多因素认证(MFA)增加了额外的安全层,但仍可能受到各种绕过技术的攻击。
来源: Account Takeover/mfa-bypass.md1-100
简单地操纵响应和状态码有时可以绕过 MFA:
响应操纵:将响应中的 "success":false 更改为 "success":true。
状态码操纵:将 HTTP 4xx 错误更改为 200 OK。
MFA 系统中常见的实现缺陷包括:
2FA 代码泄露:代码出现在响应或 JavaScript 文件中。
代码可重用性:相同的验证码可以多次使用。
缺乏暴力破解保护:对验证尝试没有限制。
缺少完整性验证:一个用户的代码可以用于另一个用户。
强制浏览:直接访问认证后的 URL。
https://example.com/my-account (instead of /2fa/verify)
特殊值接受:使用 null 或 000000 等值作为有效代码。
数组注入:在数组 payload 中发送多个代码。
来源: Account Takeover/mfa-bypass.md1-100
LDAP(轻量级目录访问协议)通常用于认证和目录服务,但可能容易受到注入攻击。
来源: LDAP Injection/README.md1-62
通过操纵过滤逻辑可以绕过 LDAP 认证:
逻辑操纵示例 1:
user = *)(uid=*))(|(uid=*
pass = password
query = (&(uid=*)(uid=*))(|(uid=*)(userPassword={MD5}X03MO1qnZdYdgyfeuILPmQ==))
逻辑操纵示例 2:
user = admin)(!(&(1=0
pass = q))
query = (&(uid=admin)(!(&(1=0)(userPassword=q))))
这些 payload 利用 LDAP 查询中的逻辑运算符来创建始终评估为真的条件。
来源: LDAP Injection/README.md19-40
即使无法获得直接反馈,也可以使用盲技术提取认证凭据:
(&(sn=administrator)(password=*)) : OK
(&(sn=administrator)(password=A*)) : KO
(&(sn=administrator)(password=B*)) : KO
...
(&(sn=administrator)(password=M*)) : OK
...
(&(sn=administrator)(password=MYKE)) : OK
此技术使用二分查找方法逐步发现密码字符。
来源: LDAP Injection/README.md42-68
暴露的版本控制系统仓库可能因泄露凭据、API 密钥和其他敏感认证数据而导致认证漏洞。
来源: Insecure Source Code Management/README.md1-50 Insecure Source Code Management/Git.md1-250 Insecure Source Code Management/Subversion.md1-40 Insecure Source Code Management/Bazaar.md1-53 Insecure Source Code Management/Mercurial.md1-24
暴露的 .git 仓库可能泄露认证密钥:
提取敏感文件:
.git/logs/HEAD 恢复历史记录以查找凭据。认证密钥收集:
来源: Insecure Source Code Management/Git.md25-246
SVN (.svn)、Bazaar (.bzr) 和 Mercurial (.hg) 仓库也可能泄露认证数据:
wc.db 和 .svn-base 文件以提取凭据。来源: Insecure Source Code Management/Subversion.md1-40 Insecure Source Code Management/Bazaar.md1-53 Insecure Source Code Management/Mercurial.md1-24
为防止认证漏洞,请实施以下最佳实践:
| 漏洞类型 | 主要缓解措施 |
|---|---|
| JWT 漏洞 | - 使用强签名密钥/秘密 - 验证算法和签名 - 实施适当的过期机制 - 避免在 payload 中存储敏感数据 |
| 账户接管 | - 实施安全的密码重置功能 - 对敏感操作使用 CSRF 令牌 - 设置安全的 Cookie 属性 - 实施适当的访问控制 |
| MFA 绕过 | - 在服务器端验证 MFA 代码 - 实施速率限制 - 使用后使代码过期 - 验证 MFA 过程的完整性 |
| LDAP 注入 | - 使用参数化查询 - 验证和清理输入 - 实施适当的输入过滤 - 应用最小权限原则 |
| SCM 暴露 | - 配置 Web 服务器以阻止 SCM 目录 - 对敏感文件使用 .gitignore - 扫描仓库中的秘密 - 使用适当的访问控制 |
来源: JSON Web Token/README.md523-542 LDAP Injection/README.md173-174 Account Takeover/README.md182-188 Insecure Source Code Management/README.md47-50
一些专用工具可以帮助识别和利用认证漏洞:
| 工具类别 | 知名工具 |
|---|---|
| JWT 测试 | - jwt_tool - JWT Editor (PortSwigger) - c-jwt-cracker - jws2pubkey |
| 账户接管 | - Burp Suite - OWASP ZAP - smuggler (HTTP 请求走私) |
| LDAP 测试 | - LDAP Blind Explorer - 用于利用的 Python/Ruby 脚本 |
| SCM 提取 | - git-dumper - GitTools - diggit - trufflehog - gitleaks |
来源: JSON Web Token/README.md27-32 LDAP Injection/README.md102-159 Insecure Source Code Management/Git.md117-239
有关相关主题的更多信息,请参阅