挖掘web程序中的OAuth漏洞:利用redirect_uri和state参数接管账户
本文探讨了攻击者如何利用OAuth漏洞,重点是滥用redirect_uri和state参数以接管用户账户。如果redirect_uri参数验证不严,可能会导致未经授权的重定向到恶意服务器,从而使攻击者能够捕获敏感信息。同样,state参数的错误实现可能使OAuth流程容易受到跨站请求伪造(CSRF)攻击。
Web应用程序开发人员可以通过了解这些漏洞并实施推荐的预防策略,来保护其OAuth实现免受这些常见攻击向量的影响。本文将介绍这些账户接管的方法,因为这两种漏洞在基于OAuth的身份验证中最为常见。让我们开始吧。
1. 通过Open redirection
进行OAuth账户接管
通过OAuth 2.0中的redirect_uri参数进行账户劫持是最常见的安全漏洞之一,攻击者可以窃取有效的授权代码或访问令牌,从而获得对受害者数据的未经授权访问。这种攻击利用了redirect_uri参数的错误配置或验证不当,使攻击者能够将用户重定向到恶意服务器。
img
1.1 攻击工作原理
在此攻击中,攻击者的目标是授权代码和访问令牌。通过捕获这些元素,攻击者可以冒充受害者并访问与OAuth服务注册的任何应用程序。理解浏览器在HTTP重定向(301/302响应)中如何处理#后面的URI片段,对于理解此攻击至关重要。
1.2 攻击场景
考虑一个测试网站,允许用户使用社交媒体帐户登录。由于OAuth提供商的配置错误,攻击者可以窃取与其他用户账户关联的授权代码。
① 初始重定向: 当用户尝试访问一个需要登录的安全应用页面(例如,https://security.tecno.com)时,应用程序将其重定向到登录页面。
② 登录后重定向: 成功登录后,应用程序将用户重定向回 https://security.tecno.com。
1.3 漏洞利用
敏感数据(如访问令牌)通常通过 redirect_uri
参数附加到URL中。如果 redirect_uri
被操纵为重定向到攻击者的服务器,则攻击者可以拦截这些数据。
① 攻击者启动OAuth流程,并将 redirect_uri
参数修改为指向他们控制的服务器。
② 在用户登录并授权后,OAuth服务器将用户重定向到恶意 redirect_uri
,例如 https://attackerdomain.com
。
③ 攻击者的服务器从重定向的URL中捕获授权代码或访问令牌。
④ 攻击者使用被窃取的授权代码或访问令牌完成OAuth流程,获得对受害者账户和数据的访问。
有时,重定向URL接受外部URL。如果redirect_uri接受外部URL,攻击者可以利用重定向获得未经授权的访问。例如,使用一个重定向器,如 https://accounts.google.com/signout/chrome/landing?continue=https://appengine.google.com/_ah/logout?continue%3Dhttp://attackerdomain.com
,可以允许攻击者将流程引导到他们的服务器。
1.4 OAuth redirect_uri 的常见绕过方法
由于此漏洞源于与开放重定向类似的问题,因此其绕过方法也类似。您可以尝试在实际场景中使用的常见开放重定向绕过方法来规避修复。以下是一些常见的绕过方法:
img
1.5 预防策略
① 严格验证: 确保对 redirect_uri
参数进行严格验证,使用授权URI的白名单。
② 精确匹配: 对 redirect_uri
验证使用精确匹配,避免使用通配符或部分匹配。
③ PKCE: 使用授权码交换的证明密钥(PKCE)为安全性增加一层,特别是针对公共客户端。
通过实施这些预防措施,供应商可以显著降低通过 redirect_uri
或在OAuth流程中不安全重定向导致的OAuth账户接管风险。
2. 通过state
参数的CSRF攻击进行账户接管
跨站请求伪造(CSRF)是一种攻击,攻击者诱使用户的浏览器在用户已认证的Web应用程序上执行不必要的操作。在OAuth的上下文中,如果state参数未正确实现,这可能导致未经授权的操作,例如账户接管。
2.1 CSRF在OAuth中的工作原理
攻击者可以利用CSRF操纵OAuth流程,导致用户的浏览器发出执行未经授权操作的请求。对此的一种常见防御措施是使用state参数,它通过确保OAuth流程是由合法客户端发起的来帮助防止CSRF。
2.2 示例攻击场景
为了演示CSRF如何利用OAuth,考虑一个示例攻击,其中攻击者使用缺失或未正确验证的state参数来劫持OAuth过程。
① 攻击者开始与目标授权服务器的OAuth流程以获取授权代码,但在获取代码后停止该过程。
② 攻击者设置一个包含iframe的恶意网站,该iframe指向OAuth客户端的回调URL,并附上攻击者的授权代码:
img
③ 受害者访问恶意网站,他们的浏览器会自动向OAuth客户端的回调URL发送请求,并附带攻击者的授权代码。
④ OAuth客户端错误地使用攻击者的授权代码,以为这是由受害者发起的合法OAuth流程。这使得攻击者能够获得对受害者账户的访问权限。
2.3 社交媒体集成攻击场景
想象一个测试网站,允许用户通过附加他们的社交媒体档案来登录OAuth。如果OAuth流程的实施不安全,攻击者可以利用这一点来劫持其他用户的账户。
① 附加社交媒体账户: 用户点击“附加社交账户”以将他们的社交媒体资料链接到他们的账户。
② 捕获OAuth代码: 攻击者使用自己的凭证登录并捕获包含授权代码的OAuth请求。
③ 丢弃请求: 攻击者生成授权代码,但丢弃请求以防止将他们的账户链接到该资料。
④ 恶意HTML文件: 攻击者创建一个简单的HTML文件,其中包含一个指向带有其授权代码的OAuth回调URL的iframe标签,并将该文件托管在一个服务器上。
⑤ 受害者访问恶意网站: 当受害者访问恶意网站时,他们的浏览器自动发送请求,攻击者的授权代码被链接到受害者的账户。
2.4 使用State参数缓解CSRF
为了缓解这种攻击,OAuth客户端应使用state参数。该参数应为客户端生成的唯一、不可猜测的值,并发送给授权服务器。授权服务器随后将该值返回给客户端,包含在重定向URI中。
① State参数生成: OAuth客户端生成一个唯一的state参数,并将其包含在初始授权请求中。
② State参数验证: 当授权服务器使用授权代码重定向回客户端时,它还包含state参数。
③ State参数检查: OAuth客户端检查返回的state参数是否与其最初生成的参数匹配。如果不匹配或缺失,客户端将以错误结束流程。
实施state参数是防止OAuth中CSRF攻击的关键防御机制。
通过确保state参数在整个OAuth流程中是唯一的并得到验证,客户端可以防止未经授权的操作,维护OAuth流程的完整性。
3. 通过其他OAuth攻击进行账户接管
3.1 令牌重放攻击
令牌重放攻击涉及攻击者截获并重用有效令牌以获得对系统或应用程序的未经授权访问。这种类型的攻击利用了OAuth令牌一旦发出,就可以在过期或被撤销之前访问资源的事实。
3.2 攻击原理
① 令牌拦截: 攻击者在令牌传输过程中捕获有效令牌。这可以通过多种方法实现,例如网络嗅探、中间人(MITM)攻击或利用不安全的通信渠道。
② 令牌重放: 攻击者重用拦截的令牌,以受害者的身份进行身份验证并获得对受保护资源的访问。
3.3 示例攻击场景
① 初始访问: 用户登录应用程序并获得访问令牌。
② 令牌捕获: 攻击者通过MITM攻击或其他手段拦截访问令牌。
③ 令牌使用: 攻击者使用拦截的令牌以受害者的身份发起API请求或访问资源。
④ 未经授权的访问: 攻击者可以执行合法用户能够执行的任何操作,可能访问敏感数据或执行未经授权的操作。
4. 针对“令牌重放攻击”的缓解策略
令牌过期和刷新令牌: 发放短生命周期的访问令牌(例如,5-10分钟);提供可用于在不要求用户重新身份验证的情况下获取新访问令牌的刷新令牌。
与PKCE的令牌绑定: 使用授权码交换的证明密钥(PKCE)将授权码与请求它的客户端绑定。这确保即使授权码被截获,攻击者也无法将其兑换为令牌。
使用安全Cookie: 将令牌存储在安全的HttpOnly Cookie中,以保护其不被在浏览器中运行的JavaScript访问。
5. 结论
OAuth账户接管是一项重大安全威胁。开发人员理解攻击向量并确保严格验证redirect_uri、正确使用state参数、会话管理以及对点击劫持的防御是保护用户账户免受未经授权访问的关键步骤。保护OAuth流程不仅保护用户数据,还维护Web应用程序的完整性和信誉。希望大家记住上述关键安全防御措施!
无偿 获 取 网 安 资 料:
申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关