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元,表示攻击成功。
相关推荐
一斤代码1 小时前
vue3 下载图片(标签内容可转图)
前端·javascript·vue
中微子1 小时前
React Router 源码深度剖析解决面试中的深层次问题
前端·react.js
光影少年1 小时前
从前端转go开发的学习路线
前端·学习·golang
中微子2 小时前
React Router 面试指南:从基础到实战
前端·react.js·前端框架
3Katrina2 小时前
深入理解 useLayoutEffect:解决 UI "闪烁"问题的利器
前端·javascript·面试
前端_学习之路3 小时前
React--Fiber 架构
前端·react.js·架构
伍哥的传说3 小时前
React 实现五子棋人机对战小游戏
前端·javascript·react.js·前端框架·node.js·ecmascript·js
小红卒3 小时前
upload-labs靶场通关详解:第21关 数组绕过
web安全·网络安全·文件上传漏洞
qq_424409193 小时前
uniapp的app项目,某个页面长时间无操作,返回首页
前端·vue.js·uni-app
我在北京coding3 小时前
element el-table渲染二维对象数组
前端·javascript·vue.js