本文档全面概述了 OAuth 2.0 和 SAML 2.0 身份验证协议中的安全漏洞。它涵盖了两种协议的利用技术、示例和缓解策略,以及与 JWT 相关的漏洞,因为 JWT 通常与 OAuth 2.0 实现一起使用。有关通用基于令牌的身份验证漏洞的信息,请参阅 JSON Web Token 攻击。
来源:SAML Injection/README.md, JSON Web Token/README.md
OAuth 2.0 是一个授权框架,它允许第三方应用程序获得对服务器上用户帐户的有限访问权限。该协议依赖于令牌交换,而不是直接共享凭据。
来源:Server Side Request Forgery/README.md:174-183
| 漏洞 | 描述 | 影响 |
|---|---|---|
| 重定向 URI 验证 | 重定向 URI 参数验证不当 | 通过代码拦截进行帐户接管 |
| 缺少状态参数 | 无防 CSRF 状态参数 | 跨站请求伪造 |
| 客户端密钥泄露 | 公共客户端中的客户端密钥 | 冒充合法客户端 |
| 授权码拦截 | 重定向期间捕获代码 | 会话劫持 |
| 缺少 PKCE | 没有代码交换证明密钥的公共客户端 | 代码拦截攻击 |
来源:Server Side Request Forgery/README.md, JSON Web Token/README.md
JWT(JSON Web Token)通常用作 OAuth 2.0 实现中的令牌格式。
来源:JSON Web Token/README.md:13-94, JSON Web Token/README.md:121-187
此漏洞利用允许将 alg 值设置为 none 的 JWT 库,从而完全绕过签名验证。
# Original JWT
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJsb2dpbiI6InRlc3QiLCJpYXQiOiIxNTA3NzU1NTcwIn0.Sig
# Modified JWT with none algorithm
eyJhbGciOiJub25lIiwidHlwIjoiSldTIn0.eyJsb2dpbiI6InRlc3QiLCJpYXQiOiIxNTA3NzU1NTcwIn0.
来源:JSON Web Token/README.md:152-186
此攻击会欺骗服务器将公钥用作 HMAC 密钥,从而允许攻击者伪造有效令牌。
# Original JWT with RS256 algorithm
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Sig
# Modified JWT with HS256 algorithm, signed with the public key
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Sig
来源:JSON Web Token/README.md:187-210
kid(密钥 ID)参数可用于路径遍历或强制使用可预测的文件。
来源:JSON Web Token/README.md:397-452
jku 头值指向包含公钥的 URL。攻击者可以将此 URL 替换为他们控制的 URL。
来源:JSON Web Token/README.md:457-506
SAML(Security Assertion Markup Language)是一个基于 XML 的身份验证和授权数据交换框架。
来源:SAML Injection/README.md:2-17, SAML Injection/README.md:25-103
从 SAML 响应中省略签名部分,如果服务提供商没有正确验证签名,则可以绕过身份验证。
来源:SAML Injection/README.md:32-64
XSW 攻击利用某些实现验证签名的方式,通过创建包含合法断言和伪造断言的结构。
来源:SAML Injection/README.md:69-102
此攻击通过在属性值中插入注释来绕过验证。
来源:SAML Injection/README.md:105-122
| 漏洞 | 缓解 |
|---|---|
| 重定向 URI 验证 | 对重定向 URI 使用精确匹配 |
| CSRF 攻击 | 始终实现并验证状态参数 |
| 授权码拦截 | 实现 PKCE (RFC 7636) |
| 客户端密钥泄露 | 为公共客户端使用机密客户端或 PKCE |
| 令牌范围问题 | 验证和限制令牌范围 |
| 漏洞 | 缓解 |
|---|---|
| None 算法攻击 | 明确检查 alg 参数并拒绝 "none" |
| 密钥混淆攻击 | 为不同算法使用不同的密钥 |
| kid 参数滥用 | 使用白名单验证 kid 值 |
| jku 头注入 | 白名单允许的 JWKS URL |
| 弱密钥 | 使用强大、随机生成的密钥 |
| 漏洞 | 缓解 |
|---|---|
| 签名验证问题 | 始终要求并验证签名 |
| XML 签名包装 | 实现正确的引用验证 |
| XML 注释注入 | 正确的 XML 解析和验证 |
| XML 外部实体 | 在 XML 解析器中禁用外部实体 |
| XSLT 注入 | 限制或禁用 XSLT 转换 |
来源:SAML Injection/README.md:187-199, JSON Web Token/README.md:523-543
来源:JSON Web Token/README.md:28-32, SAML Injection/README.md:19-21
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(7eb75c)