跨站点请求伪造(CSRF)类漏洞攻击方式与防御措施|软件安全测试技术系列

跨站点请求伪造(CSRF)类漏洞攻击方式与防御措施|软件安全测试技术系列
最新回答
暗恋是最省钱的

2023-09-28 10:32:42

跨站点请求伪造(CSRF)类漏洞攻击方式与防御措施|软件安全测试技术系列

CSRF攻击概述

跨站点请求伪造(Cross Sites Request Forgery,简称CSRF)是一种利用用户身份操作用户账户的攻击方式。攻击者诱使用户访问一个页面,该页面以用户的身份在第三方有害站点中执行了一次操作,泄露了用户的身份信息。攻击者随后使用这个伪造的、但真实存在的身份信息,到某网站冒充用户执行恶意操作。

完成CSRF攻击的条件

  1. 用户登录受信任网站B,并且在本地生成Cookie:用户在受信任的网站上登录后,浏览器会保存相应的Cookie,用于后续的请求验证。
  2. 在不登出网站B的情况下,访问有害网站C:用户在未登出受信任网站的情况下,访问了攻击者控制的有害网站。有害网站通过某种方式(如隐藏的表单提交)向受信任网站发送请求,利用用户的Cookie进行身份验证。

CSRF的攻击方式

  1. 浏览器的Cookie策略

    Session Cookie:保存在浏览器进程的内存中,浏览器关闭后失效。在浏览网站的过程中,即使浏览器打开了新的Tab页,Session Cookie都是有效的,因此发起CSRF攻击是可行的。

    Third-party Cookie:服务器在Set-Cookie时指定了Expire Time。过期后本地Cookie失效,网站会要求用户重新登录。如果网站返回给浏览器的HTTP头包含P3P头,将允许浏览器发送第三方Cookie,这增加了CSRF攻击的风险。

  2. P3P头的副作用

    P3P Header是W3C制定的一项关于隐私的标准,全称是The Platform for Privacy Preference(隐私偏好平台)。如果网站使用了P3P头,浏览器将不再拦截第三方Cookie的发送,这可能导致CSRF攻击更容易成功。

  3. GET、POST请求

    大多数CSRF攻击通过<img>、<iframe>、<script>等带src属性的标签发送GET请求。然而,CSRF攻击也可以通过构造一个不可见的iframe窗口,并在其中创建一个form表单,然后使用JavaScript自动提交这个表单来发送POST请求。

CSRF的防御方式

  1. 验证码

    原理:在CSRF攻击过程中,用户在不知情的情况下构造了网络请求。添加验证码后,可以强制用户必须与应用进行交互,从而验证请求的真实性。

    优点:简洁而有效。

    缺点:验证码的使用会影响用户体验,且不能给所有的操作都加上验证码。

  2. Referer Check

    原理:利用HTTP头中的Referer判断请求来源是否合法。Referer首部包含了当前请求页面的来源页面的地址,一般情况下Referer的来源页就是发起请求的那个页面。

    优点:简单易操作,只需要在最后给所有安全敏感的请求统一添加一个拦截器来检查Referer的值。

    缺点:出于保护用户隐私的考虑,很多浏览器限制了Referer的发送;从HTTPS跳转到HTTP时,出于安全的考虑,浏览器也不会发送Referer。

  3. 使用Anti CSRF Token

    原理:把参数加密或使用随机数,使攻击者无法猜测到参数值,从而无法构造请求的URL,也就无法发起CSRF攻击。

    例子:在URL中增加一个随机的Token参数,如

    http://host/path/delete?username=abc&item=123&token=
    [random(seed)]。

    优点:比检查Referer方法更安全,并且不涉及用户隐私。

    缺点:加密后的URL非常难读,对用户不友好;加密的参数每次都在改变,导致用户无法对页面进行搜索;普通参数也会被加密或哈希,给数据分析带来困扰。

需要注意的点

  • Token需要足够随机,必须用足够安全的随机数生成算法。
  • Token应该为用户和服务器所共同持有,不能被第三方知晓。
  • Token可以放在用户的Session或者浏览器的Cookie中。
  • 尽量把Token放在表单中,把敏感操作由GET改为POST,以form表单的形式提交,可以避免Token泄露。

通过上述措施,可以有效防御CSRF攻击,保护用户的信息安全。同时,开发人员应持续关注安全漏洞的最新动态,及时更新防御策略,确保系统的安全性。