授权码注入攻击针对哪些客户端?为何仅针对机密客户端?公共客户端呢?
关于授权码注入攻击与客户端类型的疑问解答
为什么授权码注入攻击仅针对机密客户端?
授权码注入攻击的核心逻辑是:攻击者窃取受害者的授权码后,将这个代码注入到自己和客户端的会话中,冒充受害者获取令牌。这种攻击能成立的前提是客户端可以脱离用户会话的绑定,单独用授权码向授权服务器换取令牌——而只有机密客户端(比如后端服务、桌面应用)具备这个条件:
- 机密客户端拥有仅自己和授权服务器知晓的客户端密钥,换取令牌时会用密钥做身份验证,授权服务器不会额外校验授权码是否和当前用户的会话(比如
state参数、会话Cookie)强绑定; - 攻击者只要拿到有效的授权码,就能在自己的会话里提交给客户端,客户端会用密钥去换令牌,不会怀疑这个授权码不是当前会话生成的。
而公共客户端(比如单页应用SPA、原生移动APP)没有客户端密钥,必须使用PKCE(授权码流程的扩展)来安全换取令牌:
- 公共客户端在发起授权请求前会生成
code_verifier(随机字符串),并将其哈希后的code_challenge发给授权服务器; - 换取令牌时必须提交对应的
code_verifier,授权服务器会验证哈希是否匹配。
攻击者就算窃取到授权码,没有对应的code_verifier也换不到令牌,所以授权码注入攻击对公共客户端完全无效。
公共客户端是否会成为授权码拦截攻击的目标?
会,但攻击的成功率和危害取决于客户端的实现:
- 如果公共客户端没有正确启用PKCE,攻击者通过钓鱼、中间人攻击等手段拦截到授权码后,就能直接用它换取令牌,这种情况下公共客户端就是授权码拦截攻击的目标;
- 如果公共客户端严格实现了PKCE,即使攻击者拦截到授权码,因为没有对应的
code_verifier,也无法完成令牌换取,能有效抵御这类攻击。
另外,公共客户端还可能面临其他变种的授权码相关攻击,比如XSS窃取当前用户会话中的授权码(如果客户端在回调后没有立即清理授权码参数),但这属于会话劫持的范畴,和传统的授权码注入/拦截攻击逻辑不同。
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

