CSRF 攻击详解:原理、案例与防御

跨站请求伪造(Cross-Site Request Forgery,简称 CSRF)是一种针对 Web 应用程序的攻击方式。通过 CSRF,攻击者诱导受害者在不知情的情况下,以受害者的身份执行非本意的操作。本文将详细介绍 CSRF 的基本原理、常见攻击方式、在 CTF 中的实战案例,以及如何防御 CSRF 攻击。


一、CSRF 的基本原理

CSRF 攻击的核心思想是:
如果受害者已经登录某个网站,那么攻击者可以诱使受害者的浏览器在后台自动发送请求,这个请求会自动携带受害者的身份验证信息(如 Cookie),从而导致非本意的操作。

1.1 浏览器与 Cookie 的关系

  • Cookie 自动携带:
    当用户在浏览器中登录某个网站时,服务器会通过 Set-Cookie 将身份验证数据(如 SessionID)存储到浏览器中。以后,浏览器在访问同一网站时会自动带上这些 Cookie,无需用户额外操作。

  • 同源策略(SOP):
    浏览器通过同源策略来限制脚本访问其它域的数据,但对于跨站表单提交(如 GET 或 POST 请求),浏览器会自动携带 Cookie。CSRF 就正是利用这一特点来伪造请求。

1.2 CSRF 攻击流程

  1. 受害者登录:
    受害者在目标网站(例如银行、论坛等)登录后,浏览器中保存了有效的 Cookie 和会话信息。

  2. 攻击者构造恶意页面:
    攻击者在自己控制的网站上(例如 hacker.localhost)制作一个恶意页面,该页面中嵌入了指向目标网站的请求。常见的方式包括使用隐藏的 HTML 表单、图片标签或 iframe 等。

  3. 诱导受害者访问恶意页面:
    攻击者通过钓鱼邮件、链接分享或其它方式诱导受害者访问恶意页面。当受害者访问时,浏览器会自动向目标网站发送请求,并携带受害者的 Cookie。

  4. 目标网站执行操作:
    由于请求中包含了合法的 Cookie,目标网站认为这是受害者本人发出的请求,从而执行敏感操作,如转账、修改密码、发布消息等。


二、CSRF 攻击的常见方式

2.1 隐藏表单自动提交

攻击者在恶意页面中构造一个隐藏的 HTML 表单,并使用 JavaScript 自动提交。

示例代码:

<html>
  <body>
    <form id="csrfForm" action="http://targetsite.com/transfer" method="POST">
      
      <input type="hidden" name="to_account" value="attacker_account">
      <input type="hidden" name="amount" value="1000">
    form>
    <script>
      document.getElementById('csrfForm').submit();
    script>
  body>
html>

这种方式依赖于浏览器自动提交表单,并且不会受到同源策略的限制,因为表单提交会自动携带 Cookie。

2.2 利用图片或 iframe

攻击者利用