CSRF(跨站请求伪造)攻击演示
目录
- CSRF(跨站请求伪造)攻击演示
- CSRF 是什么
- CSRF 演示项目代码
- CSRF 演示过程
- 服务启动
- 演示
CSRF(跨站请求伪造)攻击演示
CSRF 是什么
CSRF(Cross-Site Request Forgery)跨站请求伪造,是一种网络安全攻击,其目标是利用被攻击者在某个网站的身份(通常是通过 cookie 认证)来伪造被攻击者的请求,以执行某些未经授权的操作。
攻击步骤通常包括以下几个阶段:
- 登录受害者:攻击者诱使受害者登录到一个受信任的网站,并在受信任网站上保留了他们的身份认证凭据(比如 cookie)。
- 构造恶意请求:攻击者在其控制的网站上嵌入了一些恶意代码或链接,这段代码或链接会向目标网站发送请求,利用受信任网站上受害者的身份。
- 发起攻击:受害者在已经登录了的情况下,访问包含恶意代码的页面,这将导致向目标网站发送伪造的请求,执行某些未经授权的操作。这可能包括更改密码、发起转账、删除帐户等。
CSRF 演示项目代码
演示代码:github - csrf-demo
项目目录如下:

其中业务后端 CsrfController.java 代码为:
package com.fhb.csrfdemo;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@RestController
@RequestMapping("/")
public class CsrfController {@GetMapping("/trans")public String trans(HttpServletRequest request, String name, Integer money) {HttpSession session = request.getSession();Object people = session.getAttribute("people");if (people == null) return "没有登录";System.out.println("给" + name + "转账" + money + "元");return "转账成功";}@GetMapping("/login")public String login(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("people", "people");return "登录成功";}
}
业务前端代码较为简单,代码为:
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><h1>CSRF 攻击测试</h1><button onclick="trans()">转账</button><button onclick="login()">登录</button><a href="http://localhost:18080">恶意链接</a>
</body><script lang="js">async function trans() {const response = await fetch("/trans?name=fhb&money=100");const info = await response.text();alert(info);}async function login() {const response = await fetch("/login");const info = await response.text();alert(info);}
</script>
</html>
恶意网站仅为一个 html 文件:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h1>CSRF攻击软件</h1><img src="http://localhost:8080/trans?name=fff&money=10" alt="xxx" srcset="">
</body><script>
</script>
</html>
CSRF 演示过程
服务启动
-
启动 java 程序 CsrfDemoApplication,该 Spring Boot 服务将在 8080 端口提供服务;
-
通过 npm 安装 http-server,进入 malicious-web 文件夹, 通过
http-server . -p 18080启动攻击者网站;
业务网站 ui 如下:

演示
通过 http://localhost:8080 访问目标网站。
- 如果直接点击 “转账” 按钮,将弹出提示框,提示 没有登录 ;
- 如果点击 “登录”,弹出提示框,提示 登录成功,之后点击转账,提示 转账成功,并且在后端打印 给fhb转账100元;
- 在第2步的基础上,点击 “恶意连接”,将跳转到攻击者网站,并且在后端打印 给fff转账10元,表示攻击成功。
相关文章:
CSRF(跨站请求伪造)攻击演示
目录 CSRF(跨站请求伪造)攻击演示CSRF 是什么CSRF 演示项目代码CSRF 演示过程服务启动演示 CSRF(跨站请求伪造)攻击演示 CSRF 是什么 CSRF(Cross-Site Request Forgery)跨站请求伪造,是一种网络安全攻击,其目标是利用被攻击者在…...
图解三傻排序 选择排序、冒泡排序、插入排序
(1)选择排序 // 交换 void swap(int arr[], int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp; }// 选择排序 void selectionSort(int arr[],int len) {if (len < 2) return;for (int minIndex, i 0; i < len - 1; i) {minIndex i;f…...
【数据结构】树与二叉树(六):二叉树的链式存储
文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…...
后端Java日常实习生面试(2023年11月10日)
面试岗位为:Java 后端开发实习生 面试时长:30分钟 面试时间:2023年11月10日 首先介绍一下项目吧 这里介绍时有一个失误,没有主动把屏幕共享给打开,因为我在面试之前已经在 processon 上画好了项目的流程图…...
使用iperf3在macOS上进行网络性能测试
iperf3是一个用于测量网络性能的工具,它可以帮助你了解两台服务器之间的带宽和延迟。本博客将指导你在macOS上安装iperf3,并展示如何连接服务器进行网络性能测试。 步骤1:安装Homebrew 如果你尚未安装Homebrew,可以通过以下步骤…...
09-MySQL主从复制
01-主从复制原理 MySQL主从复制是一种用于实现数据备份、读写分离和扩展性的技术。它基于二进制日志(Binary Log)来将主数据库上的更改操作同步到一个或多个从数据库。 MySQL主从复制的基本原理如下: 主服务器(Master࿰…...
virtualBox虚拟机局域网访问配置
在VirtualBox中,桥接网络是一种网络连接类型,它允许虚拟机连接到物理网络上的路由器或交换机,在物理网络上获得独立的网络地址和访问权限。 一、设置VirtualBox桥接网络的步骤: 打开VirtualBox软件,并选择你想要配置…...
IDEA高效编程快捷键
IDEA高效编程快捷键 for循环快捷键 快速生成for循环 foriTABfor (int i 0; i < ; i) {}在for循环中使用索引 iterTABfor (String s : list) {}在for循环中进行if条件判断 ifnTABif (list null) {} soutTAB快捷键 System.out.println();psfEnter快捷键 p…...
nginx实现vue和后端的双机负载
nginx配置文件,项目是前后端分离的,前端vue,后端springboot 前端使用nginx实现双机负载,前端的访问端口是95280,后端2个服务实例的端口分部为9098,9099 nginx.conf的配置文件 #user root; worker_processes 1;#err…...
ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)
单寄存器内存读写指令 将一个寄存器中的数值写入到内存,或者从内存中读取数据放在某一个指定寄存器中 指令码和功能 1.向内存中写: str{条件码} 目标寄存器,[目标地址]:将目标寄存器的4字节数值写入到目标地址为首地址的空间中 strh{条件码…...
Excel中功能区的存放位置很灵活,可以根据需要隐藏或显示
在这个简短的教程中,你将找到5种快速简单的方法来恢复Excel功能区,以防丢失,并学习如何隐藏功能区,为工作表腾出更多空间。 功能区是Excel中所有操作的中心点,也是大多数可用功能和命令所在的区域。你觉得功能区占用了你太多的屏幕空间吗?没问题,只需单击鼠标,它就被隐…...
HelloGitHub 社区动态,开启新的篇章!
今天这篇文章是 HelloGitHub 社区动态的第一篇文章,所以我想多说两句,聊聊为啥开启这个系列。 我是 2016 年创建的 HelloGitHub,它从最初的一份分享开源项目的月刊,现如今已经成长为 7w Star 的开源项目、1w 用户的开源社区、全网…...
【学术综述】-如何写出一篇好综述-写好综述要注意的问题
文章目录 1.前置1.1 SSD 的结构1.2 FTL的架构和作用 2 动机-why?3 做了什么【做了哪些方面的survey】?4 背景知识【上下文】5 研究的问题6 每个问题对应的解决方案 从昨天晚上【2023.11.09 22:00】到今天22:29的,花了一天的时间在读这篇surve…...
ClickHouse介绍和使用
ClickHouse介绍和使用 1. 简介2. ClickHouse特点3. 数据类型3.1. 整型3.2. 浮点型3.3. Decimal型3.4. 布尔型3.5. 字符串3.6. 枚举类型3.7. 时间类型 4. 表引擎4.1. TinyLog4.2. Memory4.3. MergeTree4.3.1. partition by分区(可选)4.3.2. primary key 主…...
数码管动态扫描
/*----------------------------------------------- 内容:数码管使用动态扫描显示,所以可以同时看到数码管同时显示数字或者字符。 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不…...
Webpack 中 loader 的作用是什么?常用 loader 有哪些?
说说webpack中常见的Loader?解决了什么问题?- 题目详情 - 前端面试题宝典 1、loader 是什么 loader是 webpack 最重要的部分之一。 通过使用不同的 loader,我们能够调用外部的脚本或者工具,实现对不同格式文件的处理。 loader…...
c#,字段和属性的区别
c#,string test和string test{ges;set;}有什么区别 在C#中,string test和string test { get; set; }表达了两种不同的成员声明,它们在类中的作用和访问方式是不同的。 string test: 这是一个字段(field)声明。它声明了一个类型…...
ideal一键部署SpringBoot项目jar包到服务器
一 简介 我们在开发环境部署项目一般通过ideal将项目打包成jar包,然后连接linux服务器,将jar手动上传到服务中,重启服务。 概括的说流程是这样的: 本地打包->上传到服务器->kill掉以前的服务->重新启动jar包服务 每次总是循环这一…...
宝塔部署QQ机器人,提示OpenSSL 1.0.2k-fips 26 Jan 2017
1、报错预览 Traceback (most recent call last):File "/www/wwwroot/python/bot-one/main.py", line 5, in <module>import requestsFile "/www/wwwroot/python/bot-one/343ae0eb0d491a10a1a00c0621b03ed0_venv/lib/python3.9/site-packages/requests/_…...
K8S篇之简述K8S底层原理
k8s底层原理 Kubernetes(简称k8s)是一个开源的容器编排平台,它可以自动化地部署、扩展和管理容器化应用程序。 Kubernetes 底层原理是其能够实现这些功能的关键。 1 节点和控制平面 Kubernetes 由两个主要组件组成:节点Node和控…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
