当前位置: 博客首页>> 网络安全 >> 阅读正文

CSRF漏洞介绍与防御

作者: 分类: 网络安全 发布于: 2024-06-27 20:22:41 浏览:1,216 评论(0)


简介

跨站请求伪造(也称为 CSRF)是一种 Web 安全漏洞,允许攻击者诱导用户执行他们不打算执行的操作。它允许攻击者部分规避同源策略,该策略旨在防止不同网站相互干扰。

CSRF攻击攻击原理及过程如下:

  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

  2. 在用户信息用过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

  3. 用户未退出网站A之前,在同一浏览器中打开一个TAB页访问网站B;

  4. 网站B接受到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。

image20240626112027296.png

要使 CSRF 攻击成为可能,必须具备三个关键条件:

  • **一个功能操作。**应用程序中存在攻击者有可能诱导用户的操作。这可能是特权操作(例如修改其他用户的权限)或对用户特定数据的任何操作(例如更改用户自己的邮箱、密码)。
  • 基于 Cookie **的会话处理。**执行该操作涉及发出一个或多个 HTTP 请求,并且应用程序仅依赖会话cookie 来识别发出请求的用户。没有其他机制可用于跟踪会话或验证用户请求。
  • **没有不可预测的请求参数。**执行该操作的请求不包含攻击者无法确定或猜测其值的任何参数。例如,当用户更改密码时,如果攻击者需要知道现有密码的值,则该功能不会受到攻击,因为攻击者预先构造的恶意链接中无法提前预测并定义“现有密码”的值。

例如,假设一个应用程序包含一个允许用户更改其帐户上的电子邮件地址的功能。当用户执行此操作时,他们会发出如下 HTTP 请求:

POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=xxx
email=xxx@xxx.com

这符合 CSRF 所需的条件:

  • 攻击者对更改用户帐户上的电子邮件地址的操作很感兴趣。执行此操作后,攻击者通常能够触发密码重置并完全控制用户的帐户。
  • 应用程序使用会话 cookie 来识别发出请求的用户。没有其他令牌或机制来跟踪用户会话。
  • 攻击者可以轻松确定执行操作所需的请求参数的值。

有了这些条件,攻击者就可以构建一个包含以下 HTML 的网页:

<html>
    <body>
    <form action="https://vulnerable-website.com/email/change" method="POST">
    	<input type="hidden" name="email" value="xxx@xxx.com" />
    </form>
    <script>
    	document.forms[0].submit();
    </script>
    </body>
</html>

如果受害者用户访问攻击者的网页,将会发生以下情况:

  • 攻击者的页面将触发对易受攻击的网站的 HTTP 请求。

  • 如果用户登录到易受攻击的网站,他们的浏览器将自动在请求中包含他们的会话 cookie。

  • 易受攻击的网站将以正常方式处理请求,将其视为由受害者用户发出,并更改其电子邮件地址。

防御CSRF漏洞

CSRF Token:

  • 对于一般的会话令牌,是不可预测的
  • 绑定到用户的会话
  • 在执行相关操作之前,在每种情况下都经过严格验证

验证 HTTP Referer 字段

  • 验证referer

  • 分割出referer中的域名

  • 根据后缀匹配域名是否是可信域

验证码

  • 敏感操作需要验证码(手机、图片)
  • 设置特殊密码验证,如支付密码
       

转载时请注明出处及相应链接。

本文永久链接: https://blog.baigei.com/articles/csrf-bug