挖洞经验 | 看我如何综合利用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流程

  1. 用户点击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
    
  2. 用户跳转至Dropbox进行登录和授权
  3. 授权后返回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关联任意用户账户

组合利用攻击链

攻击步骤

  1. 准备阶段

    • 在Dropbox上传恶意文件,文件名为XSS payload:{{constructor.constructor('alert(1)')()}}.jpg
  2. OAuth劫持

    • 构造不含state参数的OAuth回调URL:
      https://www.redacted.com/account/settings/dropbox-callback?code=**
      
    • 将该URL发送给目标受害者
  3. 关联账户

    • 受害者访问该URL后,其redacted.com账户与攻击者的Dropbox账户自动关联
  4. 触发XSS

    • 当受害者从Dropbox导入文件时,恶意文件名中的XSS payload被执行
    • 由于文件名存储在服务器端,形成Stored XSS

漏洞修复建议

  1. Self-XSS修复

    • 对文件名进行严格的输入过滤和输出编码
    • 禁止特殊字符和AngularJS模板语法
  2. OAuth错误配置修复

    • 强制验证state参数的存在性和有效性
    • 修改验证逻辑为:
      if(!isset($_GET['state']) || $_GET['state'] != current_user_state) {
          ACCESS DENIED
          exit()
      }
      ACCESS GRANTED
      
    • 确保state参数是必需且严格验证的
  3. 防御深度

    • 实施内容安全策略(CSP)
    • 对用户提供的所有数据进行严格的输入验证和输出编码

总结

本案例展示了如何通过以下方式提升漏洞危害:

  1. 将仅影响自身的Self-XSS转化为影响他人的Stored XSS
  2. 利用OAuth实现中的逻辑缺陷绕过安全限制
  3. 通过组合多个低危漏洞构建完整的攻击链

这种攻击方式强调了安全防御需要全面考虑各个组件间的交互,以及"低危"漏洞在特定场景下可能带来的高风险。

综合利用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请求: 用户跳转至Dropbox进行登录和授权 授权后返回redacted.com的callback URL: 漏洞点 : 后端验证逻辑存在缺陷: 当state参数不存在时,直接授权通过 攻击者可构造不含state参数的URL关联任意用户账户 组合利用攻击链 攻击步骤 准备阶段 : 在Dropbox上传恶意文件,文件名为XSS payload: {{constructor.constructor('alert(1)')()}}.jpg OAuth劫持 : 构造不含state参数的OAuth回调URL: 将该URL发送给目标受害者 关联账户 : 受害者访问该URL后,其redacted.com账户与攻击者的Dropbox账户自动关联 触发XSS : 当受害者从Dropbox导入文件时,恶意文件名中的XSS payload被执行 由于文件名存储在服务器端,形成Stored XSS 漏洞修复建议 Self-XSS修复 : 对文件名进行严格的输入过滤和输出编码 禁止特殊字符和AngularJS模板语法 OAuth错误配置修复 : 强制验证state参数的存在性和有效性 修改验证逻辑为: 确保state参数是必需且严格验证的 防御深度 : 实施内容安全策略(CSP) 对用户提供的所有数据进行严格的输入验证和输出编码 总结 本案例展示了如何通过以下方式提升漏洞危害: 将仅影响自身的Self-XSS转化为影响他人的Stored XSS 利用OAuth实现中的逻辑缺陷绕过安全限制 通过组合多个低危漏洞构建完整的攻击链 这种攻击方式强调了安全防御需要全面考虑各个组件间的交互,以及"低危"漏洞在特定场景下可能带来的高风险。