CSRF(跨站请求伪造)攻击演示

目录

CSRF(跨站请求伪造)攻击演示

CSRF 是什么

CSRF(Cross-Site Request Forgery)跨站请求伪造,是一种网络安全攻击,其目标是利用被攻击者在某个网站的身份(通常是通过 cookie 认证)来伪造被攻击者的请求,以执行某些未经授权的操作。

攻击步骤通常包括以下几个阶段:

  • 登录受害者:攻击者诱使受害者登录到一个受信任的网站,并在受信任网站上保留了他们的身份认证凭据(比如 cookie)。
  • 构造恶意请求:攻击者在其控制的网站上嵌入了一些恶意代码或链接,这段代码或链接会向目标网站发送请求,利用受信任网站上受害者的身份。
  • 发起攻击:受害者在已经登录了的情况下,访问包含恶意代码的页面,这将导致向目标网站发送伪造的请求,执行某些未经授权的操作。这可能包括更改密码、发起转账、删除帐户等。

CSRF 演示项目代码

演示代码:github - csrf-demo

项目目录如下:

其中业务后端 CsrfController.java 代码为:

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 "登录成功";
    }
}

业务前端代码较为简单,代码为:

html 复制代码
<!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 文件:

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 演示过程

服务启动

  1. 启动 java 程序 CsrfDemoApplication,该 Spring Boot 服务将在 8080 端口提供服务;

  2. 通过 npm 安装 http-server,进入 malicious-web 文件夹, 通过 http-server . -p 18080 启动攻击者网站;

业务网站 ui 如下:

演示

通过 http://localhost:8080 访问目标网站。

  1. 如果直接点击 "转账" 按钮,将弹出提示框,提示 没有登录
  2. 如果点击 "登录",弹出提示框,提示 登录成功 ,之后点击转账,提示 转账成功 ,并且在后端打印 给fhb转账100元
  3. 在第2步的基础上,点击 "恶意连接",将跳转到攻击者网站,并且在后端打印 给fff转账10元,表示攻击成功。
相关推荐
学不会•22 分钟前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
活宝小娜3 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点3 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow3 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o3 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā4 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
黑客Ash4 小时前
【D01】网络安全概论
网络·安全·web安全·php
沉默璇年5 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder5 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript