我已经看到了如果我什至不使用 cookie 是否可以使用 CSRF 的答案?但是有两个相互矛盾的答案,而且问题本身也没有提供那么多信息。
我正在创建一个 REST API,将由在另一个域上运行的 Web 客户端(我们自己创建)使用,因此我们将执行 CORS 请求。此 API 作为 oauth2 资源服务器运行,因此访问受到身份验证标头中传递的访问令牌的限制。我们那里没有任何 cookie,一切都是无状态的。我正在遵循https://spring.io/blog/2011/11/30/cross-site-request-forgery-and-oauth2文章中的建议
- 我们将使用 SSL
- 我们已经预先注册了重定向 uri
- 根据https://oauth.net/2/grant-types/implicit/上的建议,我们唯一的授权类型是授权代码,不需要客户端机密(因为 Web 客户端源是公开的)而不是隐式授权类型
- 客户端在进行实际资源服务器调用时使用标头进行身份验证
- 获取访问令牌是通过在表单参数 (
x-www-form-urlencoded
) 中传递 1 次授权码来完成的,这似乎是正常的方式,不应该卡在浏览器历史记录中,因为它不是查询参数。 - 客户端在获取授权码时也会使用一些秘密状态参数。在这种情况下,我不确定是否有任何意义,因为客户端不依赖秘密通过交换代码来获取访问令牌。
- 对于您实际获得访问令牌的 oauth/token 端点,唯一允许的来源是我们的 Web 客户端的域
- 对于 oauth/authorize 端点,不允许使用 CORS。也许这太过分了,因为重定向 uri 无论如何都只会指向我们自己的域?
我认为这几乎涵盖了那方面的所有内容。
现在还有另一种可能的攻击媒介,即 oauth2 身份验证服务器本身,它应该是 SSO 并且确实有会话并且可以通过基本身份验证访问。但是,对于 csrf 攻击,您似乎无法采取任何实际有用的操作。您可以向这些 oauth 端点发出请求,但您必须能够读取结果,这被 CORS 配置和重定向 uri 预先注册的事实所阻止。那里没有 POST 可以更改密码、重置电子邮件地址等,所有这些实际上也暴露为资源服务器。
我错过了什么吗?您将如何在这里探测漏洞?