挖洞经验 | 看我如何综合利用Self-XSS和OAuth错误配置实现Stored-XSS
字数 1174 2025-08-18 11:38:08
综合利用Self-XSS和OAuth错误配置实现Stored-XSS教学文档
漏洞概述
本案例展示了如何将两个低危漏洞(Self-XSS和OAuth错误配置)组合利用,形成高风险的Stored XSS攻击。攻击者通过精心构造的攻击链,能够在受害者不知情的情况下执行任意JavaScript代码。
目标系统描述
目标网站redacted.com是一个类似Google Drive和DropBox的文件存储服务,提供文件上传、下载和分享功能。
漏洞发现
1. Self-XSS漏洞
位置:文件上传时的文件名字段
Payload:{{constructor.constructor('alert(1)')()}}.jpg
触发条件:
- 用户上传带有恶意payload文件名的文件
- 用户查看文件管理面板时触发XSS
局限性:
- 需要用户自己上传恶意文件(Self-XSS)
- 仅影响当前用户
2. OAuth错误配置漏洞
功能位置:Dropbox文件导入功能
OAuth流程:
- 用户点击Dropbox关联按钮,发起GET请求:
https://dropbox.com/oauth2/authorize?client_id=**&response_type=code&state=**&redirect_uri=https%3A%2F%2Fwww.redacted.com%2Faccount%2Fsettings%2Fdropbox-callback - 用户跳转至Dropbox进行登录和授权
- 授权后返回redacted.com的callback URL:
https://www.redacted.com/account/settings/dropbox-callback?state=********&code=**
漏洞点:
- 后端验证逻辑存在缺陷:
if(isset($_GET['state'])){ if($_GET['state'] != current_user_state) ACCESS DENIED exit() } ACCESS GRANTED - 当state参数不存在时,直接授权通过
- 攻击者可构造不含state参数的URL关联任意用户账户
组合利用攻击链
攻击步骤
-
准备阶段:
- 在Dropbox上传恶意文件,文件名为XSS payload:
{{constructor.constructor('alert(1)')()}}.jpg
- 在Dropbox上传恶意文件,文件名为XSS payload:
-
OAuth劫持:
- 构造不含state参数的OAuth回调URL:
https://www.redacted.com/account/settings/dropbox-callback?code=** - 将该URL发送给目标受害者
- 构造不含state参数的OAuth回调URL:
-
关联账户:
- 受害者访问该URL后,其redacted.com账户与攻击者的Dropbox账户自动关联
-
触发XSS:
- 当受害者从Dropbox导入文件时,恶意文件名中的XSS payload被执行
- 由于文件名存储在服务器端,形成Stored XSS
漏洞修复建议
-
Self-XSS修复:
- 对文件名进行严格的输入过滤和输出编码
- 禁止特殊字符和AngularJS模板语法
-
OAuth错误配置修复:
- 强制验证state参数的存在性和有效性
- 修改验证逻辑为:
if(!isset($_GET['state']) || $_GET['state'] != current_user_state) { ACCESS DENIED exit() } ACCESS GRANTED - 确保state参数是必需且严格验证的
-
防御深度:
- 实施内容安全策略(CSP)
- 对用户提供的所有数据进行严格的输入验证和输出编码
总结
本案例展示了如何通过以下方式提升漏洞危害:
- 将仅影响自身的Self-XSS转化为影响他人的Stored XSS
- 利用OAuth实现中的逻辑缺陷绕过安全限制
- 通过组合多个低危漏洞构建完整的攻击链
这种攻击方式强调了安全防御需要全面考虑各个组件间的交互,以及"低危"漏洞在特定场景下可能带来的高风险。