type
status
date
slug
summary
tags
category
icon
password
CSRF (Cross-Site Request Forgery),即跨站请求伪造,是一种网络攻击手法,攻击者通过伪造请求在用户不知情的情况下利用用户的身份对目标网站执行恶意操作。简单来说,CSRF 利用的是用户已经登录并获得会话凭证的情况,诱导用户执行一些未授权的操作。

CSRF 的工作原理

  1. 登录状态:用户在浏览器中登录了某个网站(例如银行网站),并拥有有效的会话凭证(如 Cookie)。
  1. 诱导点击:攻击者通过邮件、恶意链接等方式引导用户点击恶意网站或恶意链接。
  1. 伪造请求:恶意网站中的代码利用用户的会话凭证向目标网站发送请求,执行特定操作(如转账、修改信息等)。
  1. 操作成功:因为请求带有合法的会话凭证,目标网站将其视为用户的正常请求,从而执行该操作。
notion image
CSRF 攻击方式可以根据 HTTP 请求方法(POST 和 GET)进行区分,因为不同的请求方法在攻击中的实现细节有所不同。通常,CSRF 攻击主要依赖用户的会话信息(如 Cookie)在用户毫不知情的情况下发起伪造请求。以下是基于 POST 和 GET 请求的 CSRF 攻击方式:

攻击手段

1. GET 请求的 CSRF 攻击

GET 请求的 CSRF 攻击通常利用浏览器自动加载资源的特性,通过嵌入恶意链接、图片、iframe 等方式发起攻击。因为 GET 请求用于获取资源,浏览器会自动带上用户的 Cookie,从而导致伪造请求。
典型的攻击方式:
  • 图片标签(<img>)伪造请求:攻击者可以在恶意页面上嵌入图片标签,指向用户已登录站点的目标 URL。例如:
    • 该代码会在页面加载时自动发送请求,将金额和目标账户作为参数发送到银行网站。如果用户已登录银行网站,银行的服务器会处理此请求,将钱转到攻击者的账户。
  • 链接诱导点击:攻击者可以创建一个看似正常的链接,通过电子邮件或社交媒体诱导用户点击,例如:
    • 当用户点击该链接时,浏览器会自动将用户的身份 Cookie 附加到请求中,银行网站会将该请求视为合法并执行相应操作。
防御措施
  • 使用 CSRF Token:即便是 GET 请求,重要操作也需要携带 Token 以验证请求的合法性。
  • 限制敏感操作的 GET 请求:尽量避免使用 GET 请求执行敏感操作。GET 请求的目的通常是获取数据,而不是修改状态,敏感操作应通过 POST 请求实现。
  • 设置 SameSite Cookie 属性:通过 SameSite 属性限制跨站请求携带 Cookie。

2. POST 请求的 CSRF 攻击

POST 请求的 CSRF 攻击通常通过隐藏表单和自动提交的方式,伪造用户提交的数据。由于 POST 请求多用于数据提交或操作更新,攻击者会在页面中隐藏表单,并利用 JavaScript 自动提交表单,从而在用户不知情的情况下完成敏感操作。
典型的攻击方式:
  • 自动提交的隐藏表单:攻击者在恶意页面中嵌入一个指向目标网站的表单,将表单中的敏感数据作为隐藏字段。页面加载后,表单会自动提交。例如: 这种方法会在用户打开页面时自动提交表单。如果用户在银行网站上处于已登录状态,银行会将此请求视为合法操作,从而完成转账。
    防御措施
    • CSRF Token:在表单提交中使用 CSRF Token,服务器验证 Token 的有效性以防止伪造请求。
    • 验证 HTTP Referer 或 Origin:验证请求的来源地址,确保请求来自同一站点,但该方法可能会受到代理和防火墙的影响。
    • 设置 SameSite Cookie 属性:防止跨站请求时自动携带 Cookie,即便是跨站的 POST 请求也无法成功。

    CSRF 的防御措施

    1. CSRF Token:给每个请求添加一个唯一的令牌 (token),服务器验证该令牌来确认请求的合法性。
    1. SameSite Cookie 属性:通过设置 Cookie 的 SameSite 属性,使浏览器仅在同源请求中携带 Cookie。
    1. 双重提交 Cookie:要求在请求中发送一个 Cookie 和一个请求参数,这两个值应相同,服务器通过比较验证请求。

    CSRF 攻击的步骤

    1. 用户登录目标网站:用户在合法网站(例如银行或社交媒体)上登录,服务器为用户生成一个会话,并通过浏览器存储在 Cookie 中。
    1. 攻击者伪造恶意请求:攻击者创建一个带有恶意请求的页面(如钓鱼网站、社交媒体帖子,甚至是电子邮件中的链接),该请求会指向用户已登录的网站。比如:
      1. 这段代码中的 <img> 标签其实是一种伪装的请求,指向银行网站的“转账”功能。由于图片请求是自动发送的,用户并不会意识到这个操作的存在。
    1. 诱导用户点击或访问:用户访问了包含恶意请求的页面,或被诱导点击恶意链接。因为浏览器会自动带上当前网站的 Cookie(包含用户的身份验证信息),银行网站会接收到一个看似合法的请求。
    1. 请求被执行:银行网站识别到用户的 Cookie,将其视为合法的用户请求,执行相应操作(如转账、购买等),攻击者成功盗取了用户账户中的资金。
     

    实验步骤

    1、打开桌面的XAMPP
    notion image
    2、打开攻击机桌面上的浏览器,在地址栏输入http://127.0.0.1/dvwa 进入DVWA登录界面,账号为admin、密码为password
    notion image
    3、点击左边导航栏中的DVWA Security设置安全等级,此处设置为low即可。
    notion image
    4、点击左边导航栏中的CSRF模块,进入如下界面,可以看出这是一个修改密码的页面:
    notion image
    5、查看PHP源码:点击右下角的View Source,可以看到页面的PHP源码。从源码中可以看出,页面直接用GET方法获取用户的输入信息
    notion image
    6、输入新密码,然后点击change,此时查看浏览器地址栏中的页面地址:可以看到Web直接将输入的信息明文直接存放在HTTP请求里。可以以此而进行攻击
    notion image
    7、进行攻击测试:不要关闭原来的页面,在打开新的页面,输入URL地址http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=newpass2&password_conf=newpass2&Change=Change (此处的url只是将上面url里面的newpass改成了newpass2)可以看到页面显示密码更改
    notion image
    8、此时验证admin用户的密码是否是newpass2:点击左边最后的LogOut,重新登录DVWA,输入用户名admin,密码newpass2,登录成功。由此可见密码已被修改。
    notion image
    9、实验完成
    Linux Crontab命令解决phpstudy 80端口被占用问题
    • Twikoo