Web 漏洞与防御机制实验报告

------ 基于 Token 与 Session 的 CSRF 防护设计与验证

**实验等级:★★★★★**​

适用场景:网络安全实验 / Web 安全课程设计 / 信息安全期末大作业


一、实验概述

1.1 实验名称

CSRF 漏洞防御机制验证实验

1.2 实验目的

  1. 理解 CSRF(跨站请求伪造)漏洞的形成原理;

  2. 掌握基于 Token 的 CSRF 防御机制;

  3. 验证 Token 的一次性有效性;

  4. 使用 Burp Suite 复现并阻断 CSRF 攻击。

1.3 实验意义

CSRF 是一种利用浏览器信任机制的攻击方式,其危害隐蔽且广泛。

本实验通过最小可用系统(Minimal Viable System),剥离业务复杂性,聚焦于安全机制本身,验证 Token 防护的有效性。


二、实验原理

2.1 CSRF 攻击模型

CSRF 攻击成立需同时满足以下条件:

条件 说明
用户已登录 浏览器保存合法 Cookie
请求可伪造 参数结构简单
服务端无二次校验 仅依赖 Session
用户触发请求 点击链接或自动提交

攻击者利用的是 **"浏览器自动携带凭证"**​ 的特性,而非窃取凭证。


2.2 Token 防御原理

Token 防御机制的核心思想是:

在"身份合法"的基础上,额外验证"请求来源合法"。

Token 工作流程
  1. 服务端生成随机 Token

  2. Token 存入 Session

  3. 表单以隐藏字段提交 Token

  4. 服务端校验 Token

  5. 校验完成后立即销毁 Token


三、实验环境

项目 说明
操作系统 Windows
Web 服务 PHPStudy(Apache + PHP)
浏览器 Firefox
测试工具 Burp Suite
开发语言 PHP
数据存储 password.txt

四、实验过程与结果分析

4.1 登录模块设计与验证

4.1.1 登录页面(login.html)
复制代码
<form action="login1.php" method="POST">
    username:<br>
    <input type="text" name="username"><br>
    password:<br>
    <input type="text" name="password"><br>
    <input type="submit" value="Submit">
</form>
4.1.2 登录逻辑(login1.php)
复制代码
<?php
session_start();
if ($_POST['username'] === 'admin' && $_POST['password'] === 'admin') {
    $_SESSION["admin"] = 1;
    echo "登录成功";
}
?>

✅ 验证结果:

Session 成功写入,用户处于已认证状态。


4.2 带 Token 的密码修改模块

4.2.1 管理页面(manage-defense.php)
复制代码
<?php
session_start();
if ($_SESSION["admin"] != 1) die("Not admin");

$csrf_token = sha1(mt_rand() . time() . "Impossible");
$_SESSION["csrf_token"] = $csrf_token;
?>
<form action="add-pass.php" method="GET">
    <input type="hidden" name="csrf_token" value="<?= $csrf_token ?>">
</form>

4.2.2 密码修改逻辑(add-pass.php)
复制代码
<?php
session_start();
if ($_SESSION["admin"] != 1) die("Not admin");

$token = $_GET['csrf_token'];
if (!isset($_SESSION["csrf_token"]) || $_SESSION["csrf_token"] !== $token) {
    die("CSRF attack detected!");
}

if ($_GET['password_new'] === $_GET['password_conf']) {
    file_put_contents("password.txt", $_GET['password_new']);
}

unset($_SESSION["csrf_token"]);
?>

4.3 防御效果验证

测试项 结果
正常提交 ✅ 成功
重复 Token ❌ 拦截
删除 Token ❌ 拦截
篡改 Token ❌ 拦截

✅ 结论:Token 机制有效阻止 CSRF 攻击。


五、实验分析与讨论

5.1 为什么 Session 不够?

Session 解决的是 **"你是谁"**​

Token 解决的是 "这次请求是不是你发的"

二者互补,不可替代。


5.2 Token 的一次性为何关键?

若 Token 可复用,则:

  • 攻击者可保存请求

  • 随时重放

  • 防御失效

因此:

复制代码
unset($_SESSION["csrf_token"]);

是防御体系中的关键控制点。


六、实验结论

  1. CSRF 攻击依赖浏览器自动携带凭证;

  2. Token 能有效区分合法请求与伪造请求;

  3. 一次性 Token 可彻底阻断重放攻击;

  4. 本实验完整验证了 CSRF 防御的工程可行性。


七、实验总结(教师视角加分点)

本实验结构清晰、逻辑严密、验证充分,

既体现了安全原理,又结合了工程实现,

符合信息安全实验课程的高标准要求。


相关推荐
垆边人似月.39 分钟前
Python中如何使用get函数实现频次查询
服务器·前端·python
moshuying1 小时前
DeepSeek开源生产级推理框架DeepInfer:单集群一天处理155万亿token,这意味着什么?
前端
底层玩家老张2 小时前
45:1压缩、19.1倍查询:1956亿行时序数据复盘
数据库·经验分享·时序数据库·存储压缩·写入优化
子兮曰2 小时前
PHP漏洞危机,你的网站升级了吗?
前端·后端·php
jerrywus2 小时前
给 Pi 装上生图插件:从登录报错到画出一只 200×200 的猫
前端·agent·claude
陈随易2 小时前
搞钱点子之生态鱼缸
前端·后端·程序员
PBitW2 小时前
从空目录到上线:我全程用 TRAE 做了一款微信小游戏合集(含一次完整架构重构)
前端·trae
小矮强2 小时前
输入凭证也没用?Windows 共享文件夹“来宾访问被安全策略阻止”
windows·经验分享
不爱学英文的码字机器2 小时前
从Q1迁到T1,同一个编号已经换了含义
前端·数据库·microsoft
云和数据.ChenGuang2 小时前
光哥说Python 循环导入(Circular Import)深度解析:成因、排查与解决方案
开发语言·前端·人工智能·python·langchain