菜单

身份验证漏洞

相关源文件

认证漏洞发生在认证机制存在缺陷,允许攻击者绕过安全控制、冒充合法用户或未经授权访问受保护资源时。本文档涵盖了针对认证系统的各种攻击向量和利用技术,包括JWT漏洞、账户接管方法、MFA绕过和LDAP认证弱点。

有关JWT实现细节和攻击,请参阅JWT令牌攻击。有关完整的账户接管技术,请参阅账户接管技术。有关OAuth和SAML特定漏洞,请参阅OAuth和SAML漏洞

JWT (JSON Web Token) 漏洞

JSON Web Token 是一种在 Web 应用程序中实现认证和授权的流行方法。由于其无状态性和灵活性,它们被广泛应用于现代应用程序中,但如果实现不当,则会包含许多潜在的安全弱点。

来源: JSON Web Token/README.md1-96 JSON Web Token/README.md120-205

JWT 签名攻击

JWT 的签名组件对于验证其真实性至关重要。多种攻击都针对此安全机制:

  1. 空签名攻击 (CVE-2020-28042):发送一个包含签名算法但未提供实际签名的 JWT。

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
    
  2. None 算法攻击 (CVE-2015-9235):修改算法字段为 "none" 并移除签名。

    # Algorithm variants
    none, None, NONE, nOnE
    
  3. 密钥混淆攻击 (CVE-2016-5431):将 RS256(非对称)更改为 HS256(对称),并使用公钥作为 HMAC 密钥。

  4. 密钥注入攻击 (CVE-2018-0114):在标头中嵌入一个包含攻击者控制的公钥的 JWK。

  5. 公钥恢复:从两个不同的签名 JWT 中计算 RSA 公钥。

来源: JSON Web Token/README.md120-296

JWT 头部操作

JWT 头部包含重要的元数据,可以被操纵以绕过验证:

  1. kid (Key ID) 参数滥用:

    • 使用文件路径读取可预测文件:/root/res/keys/secret.key
    • 使用远程 URL:http://:7070/privKey.key
    • 路径遍历到已知文件:../../dev/null
  2. jku (JWK Set URL) 注入:

    • 将 URL 替换为攻击者控制的、托管恶意公钥的端点。
    • 常见 JWK 端点:/jwks.json, /.well-known/jwks.json

来源: JSON Web Token/README.md395-505

JWT 密钥攻击

许多应用程序使用弱密钥来签署 JWT。这些弱密钥可以通过以下方式破解:

  1. 字典攻击:使用 jwt_tool 或 hashcat 等工具,配合字典进行攻击。
  2. 暴力破解攻击:测试所有可能的字符组合。

使用 hashcatjwt_tool 等工具可以显著加速这些攻击。

来源: JSON Web Token/README.md298-393

账户接管技术

账户接管 (ATO) 涉及通过各种攻击向量获取对用户账户的未授权访问。

来源: Account Takeover/README.md1-20

密码重置漏洞

密码重置功能通常包含关键漏洞:

  1. 通过 Referrer 泄露令牌:重置令牌通过 Referer 头信息泄露给第三方网站。

  2. 密码重置中毒:操纵请求头信息以重定向重置令牌。

  3. 电子邮件参数操纵:使用各种技术注入额外收件人。

    email=victim@mail.com&email=hacker@mail.com
    email=victim@mail.com,hacker@mail.com
    {"email":["victim@mail.com","hacker@mail.com"]}
    
  4. 弱重置令牌:基于用户数据或弱算法的可预测或可猜测令牌。

  5. 用户名冲突:注册包含空格的用户名,以触发合法用户的密码重置。示例:"admin " vs "admin"

  6. Unicode 标准化问题:使用看起来相似但标准化后值相同的 Unicode 字符。示例:demo@gmail.com vs demⓞ@gmail.com

来源: Account Takeover/README.md22-122

导致账户接管的 Web 漏洞

几种常见的 Web 漏洞可能导致账户接管:

  1. 跨站脚本 (XSS):窃取会话 Cookie 和认证令牌。

  2. HTTP 请求走私:通过格式错误的请求捕获认证数据。

  3. 跨站请求伪造 (CSRF):诱骗用户执行认证操作。

  4. JWT 操纵:修改 JWT 令牌以冒充其他用户。

来源: Account Takeover/README.md123-181

MFA 绕过技术

多因素认证(MFA)增加了额外的安全层,但仍可能受到各种绕过技术的攻击。

来源: Account Takeover/mfa-bypass.md1-100

响应和状态操纵

简单地操纵响应和状态码有时可以绕过 MFA:

  1. 响应操纵:将响应中的 "success":false 更改为 "success":true

  2. 状态码操纵:将 HTTP 4xx 错误更改为 200 OK。

MFA 实现缺陷

MFA 系统中常见的实现缺陷包括:

  1. 2FA 代码泄露:代码出现在响应或 JavaScript 文件中。

  2. 代码可重用性:相同的验证码可以多次使用。

  3. 缺乏暴力破解保护:对验证尝试没有限制。

  4. 缺少完整性验证:一个用户的代码可以用于另一个用户。

  5. 强制浏览:直接访问认证后的 URL。

    https://example.com/my-account   (instead of /2fa/verify)
    
  6. 特殊值接受:使用 null000000 等值作为有效代码。

  7. 数组注入:在数组 payload 中发送多个代码。

来源: Account Takeover/mfa-bypass.md1-100

LDAP 认证漏洞

LDAP(轻量级目录访问协议)通常用于认证和目录服务,但可能容易受到注入攻击。

来源: LDAP Injection/README.md1-62

认证绕过

通过操纵过滤逻辑可以绕过 LDAP 认证:

  1. 逻辑操纵示例 1:

    user  = *)(uid=*))(|(uid=*
    pass  = password
    query = (&(uid=*)(uid=*))(|(uid=*)(userPassword={MD5}X03MO1qnZdYdgyfeuILPmQ==))
    
  2. 逻辑操纵示例 2:

    user  = admin)(!(&(1=0
    pass  = q))
    query = (&(uid=admin)(!(&(1=0)(userPassword=q))))
    

这些 payload 利用 LDAP 查询中的逻辑运算符来创建始终评估为真的条件。

来源: LDAP Injection/README.md19-40

盲 LDAP 利用

即使无法获得直接反馈,也可以使用盲技术提取认证凭据:

(&(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 仓库可能泄露认证密钥:

  1. 提取敏感文件:

    • .git/logs/HEAD 恢复历史记录以查找凭据。
    • 从提交中提取包含认证数据的文件。
    • 使用 git-dumper、GitHack 或 GitTools 等工具。
  2. 认证密钥收集:

    • 使用 noseyparker、trufflehog 或 gitleaks 等工具查找泄露的密钥。
    • 扫描提交历史中的 API 密钥、密码和 JWT 密钥。

来源: Insecure Source Code Management/Git.md25-246

其他 SCM 系统

SVN (.svn)、Bazaar (.bzr) 和 Mercurial (.hg) 仓库也可能泄露认证数据:

  • SVN:访问 wc.db.svn-base 文件以提取凭据。
  • Bazaar:使用 bzr_dumper 提取仓库内容。
  • Mercurial:使用 rip-hg.pl 提取敏感认证数据。

来源: 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

有关相关主题的更多信息,请参阅