CSRF(Cross Site Request Forgery,跨站请求伪造)。是一种对网站的恶意利用,通过伪装来自受信任用户的请求来利用受信任的网站。

原理是攻击者构造网站后台某个功能接口的请求地址,诱导用户去点击或者用特殊方法让该请求地址自动加载。用户在登录状态下这个请求被服务端接收后会被误以为是用户合法的操作。对于 GET 形式的接口地址可轻易被攻击,对于 POST 形式的接口地址也不是百分百安全,攻击者可诱导用户进入带 Form 表单可用POST方式提交参数的页面。

CSRF漏洞攻击演示

这是我随便挖掘的开源cve(水的),搭建github200多star开源项目

https://github.com/5kywa1ker/mall

![image-20240530210216512](D:tyOWASPcsrfimage-20240530210216512.png)

原作者采用的是常用于开发和测试阶段的H2轻量级嵌入式数据库,熟悉mysql数据库的同学可以参照下面配置。

# mysql

spring.datasource.url=jdbc:mysql://localhost:3306/mall?useSSL=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#H2
#spring.datasource.url=jdbc:h2:file:./h2db/mall;MODE=MYSQL
#spring.datasource.username=root
#spring.datasource.password=123456
#spring.datasource.driver-class-name=org.h2.Driver
#spring.h2.console.settings.web-allow-others=false
#spring.h2.console.path=/h2-console

搭建完毕后,点击商品加入购物车,进入购物车页面,该页面用于演示csrf漏洞示例。

![image-20240530210735918](D:tyOWASPcsrfimage-20240530210735918.png)

在一些用户输入处,是csrf漏洞的高发区。下面利用burpsuite抓包工具演示如何快速验证漏洞。

![image-20240530210959233](D:tyOWASPcsrfimage-20240530210959233.png)

构建输入进行抓包

![image-20240530211118705](C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20240530211118705.png)

右键生成csrfPOC

![](D:tyOWASPcsrf屏幕截图 2024-05-30 211210.png)

这里可以直接生成html文件,可自由编辑测试

![image-20240530211556716](D:tyOWASPcsrfimage-20240530211556716.png)

这里直接在本地进行测试

![image-20240530211733586](D:tyOWASPcsrfimage-20240530211733586.png)

这里可以构建钓鱼网站,诱骗用户点击链接,我们修改表单内的任意值,用户点击按钮后会发现原网站的信息自动提交,且为我们构建的输入,至此攻击完成。

![image-20240530212055872](D:tyOWASPcsrfimage-20240530212055872.png)

CSRF防范

  1. 使用CSRF Token

在每个表单或敏感请求中包含一个唯一的、不可预测的token,并在服务器端进行验证。这是防范CSRF攻击最常见的方法,也是目前大多数网站的做法。

  • 生成Token:服务器生成一个随机的CSRF token,并将其嵌入到每个表单中或作为HTTP头的一部分。
  • 验证Token:服务器在处理请求时,验证提交的token是否与存储的token匹配。
  1. SameSite Cookie属性

设置Cookie的SameSite属性,限制Cookie的发送范围。

  • SameSite=Lax:默认值,除非是跨站点的POST请求,否则不会发送Cookie。
  • SameSite=Strict:完全禁止跨站点请求发送Cookie。
  • SameSite=None:允许跨站点请求发送Cookie,但必须通过HTTPS。
  1. 验证Referer头

检查HTTP请求的Referer头,确保请求是从同一个网站发起的。

  • 验证Referer:在处理敏感操作前,检查Referer头是否指向自己的网站。
  • 局限性:一些浏览器可能不会发送Referer头,或者用户可能会禁用Referer头。
  1. 双重提交Cookie

将CSRF token存储在一个Cookie中,并在请求中同时提交该token。

  • 设置Token Cookie:服务器生成一个CSRF token,并将其设置为Cookie。
  • 验证Token:在处理请求时,服务器检查请求中包含的token是否与Cookie中的token匹配。