Web安全之 CSRF 攻击

Web安全之 CSRF 攻击

简介

CSRF是跨站请求伪造(Cross-Site Request Forgery)的缩写。跨站请求伪造是一种网络攻击方式,攻击者利用已登录的用户在浏览器中存储的合法会话信息,伪造用户发出的请求,以达到欺骗服务器的目的。这种攻击方式并不涉及窃取用户的会话信息,而是利用会话信息。攻击者通常会在用户毫不知情的情况下,在用户的浏览器上执行恶意操作,如更改密码、发布信息、购买商品等。

攻击原理

CSRF的攻击原理基于Web的隐式身份验证机制。在用户访问Web应用时,浏览器会自动携带用户的会话凭证(如Cookie),以便服务器能够识别用户的身份。攻击者通过构造一个恶意网站或链接,诱使用户访问该网站或点击链接,从而触发一个针对目标网站的伪造请求。由于浏览器会自动携带用户的会话凭证,目标网站无法区分正常请求和伪造请求,因此会执行伪造请求中的操作。

攻击目标

CSRF的攻击目标主要是需要用户身份认证的操作,如修改用户信息、更改密码、发表评论、进行转账等。攻击者希望利用用户的身份执行这些操作,以达到窃取数据、篡改内容、转移资金等目的。

案例

  1. 受害者登录 a.com,并保留了登录凭证(Cookie)
  2. 攻击者引诱受害者访问了b.com
  3. b.com 向 a.com 发送了一个请求:a.com/act=xx浏览器会默认携带a.com的Cookie
  4. a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求
  5. a.com以受害者的名义执行了act=xx
  6. 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作

例如: 攻击者构造一个伪造的银行转账请求,诱导受害者点击后,该请求会携带受害者的cookie信息,并向正常站点发起请求,从而完成非法转账。或者攻击者设置了一个自动转发邮件的规则,使得受害者的所有邮件都被自动转发到攻击者的邮箱中。

预防方案

CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对CSRF的防护能力来提升安全性。

  1. 同源检测:通过 Header 中的 Origin HeaderReferrer Header 确定,但不同浏览器可能会有不一样的实现,不能完全保证

  2. CSRF Token 校验:将 CSRF Token输出到页面中(通常保存在 Session 中),页面提交的请求携带这个 Token ,服务器验证 Token 是否正确

  3. 双重cookie验证

    • 流程:
      • 步骤1:在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw
      • 步骤2:在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw
      • 步骤3:后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。
    • 优点:
      • 无需使用Session,适用面更广,易于实施。
      • Token储存于客户端中,不会给服务器带来压力。
      • 相对于Token,实施成本更低,可以在前后端统一拦截校验,而不需要一个个接口和页面添加。
    • 缺点:
      • Cookie中增加了额外的字段。
      • 如果有其他漏洞(例如XSS),攻击者可以注入Cookie,那么该防御方式失效。
      • 难以做到子域名的隔离。
      • 为了确保Cookie传输安全,采用这种防御方式的最好确保用整站HTTPS的方式,如果还没切HTTPS的使用这种方式也会有风险。
  4. SameSite Cookie属性CookieSameSite属性是一种安全策略,用于限制第三方网站获取Cookie的能力,从而增强网站的安全性。SameSite属性可以设置三个值,分别是:

    • Strict:完全禁止第三方获取Cookie,只有在当前网页的URL与请求目标一致时,才会带上Cookie。这种设置可能会对用户体验造成一定的影响,例如,在跳转到其他网站时,可能会因为未携带Cookie而导致登录状态丢失。
    • Lax:比Strict宽松一些,允许在跨站使用GET请求时携带Cookie。例如,在通过链接进行页面跳转时,会带上Cookie,但在通过表单提交数据时,不会带上Cookie
    • None:允许在任何情况下都携带Cookie。但是,为了安全起见,当设置为None时,必须同时设置Secure属性,即Cookie只能通过HTTPS协议发送,否则设置将无效。
  5. 验证码:在关键操作或敏感操作前,要求用户输入验证码。这样即使攻击者能够构造伪造请求,也无法自动执行操作,因为需要用户手动输入验证码。

总结

CSRF是一种严重的网络威胁,对于需要用户身份认证的操作尤其危险。为了保障用户数据的安全性和隐私保护,开发人员在设计和开发网络应用时,应该充分考虑CSRF攻击的防御措施,并采取多种手段提高系统的安全性。同时,用户也应该保持警惕,避免点击不明来源的链接或访问可疑网站,以防止CSRF攻击的发生。