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

1.实验内容

(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

在kali命令行中输入apt install apache2安装Apache
输入systemctl start apache2查看Apache状态,现在是关闭状态我们把它打开
输入service apache2 start打开
这时查看状态是打开状态
b9cbcbbb0d907e098c75fbfde3a22a2
在浏览器输入127.0.0.1,打开Apache的默认网页
46f4c66c0b8151bc86d7e8c8f9b8863

理解HTML,理解表单,理解GET与POST方法

HTML(HyperText Markup Language)

HTML是超文本标记语言,它是构建网页和网页应用的标准标记语言。HTML通过标签(tags)来定义不同类型的内容,如文本、图片、链接等,这些标签可以嵌入到网页中,并由浏览器进行解析和显示。HTML文档结构通常包括、、等基本元素,开发者使用各种语义化标签来组织内容,从而创建结构清晰的网页。

表单(Form)

表单是网页中用于收集用户输入信息的区域。它允许用户与网站交互,填写信息或选择选项,然后将这些数据提交给服务器处理。表单通常包含以下几种类型的输入字段:

  • 文本框:用户可以输入文本。
  • 密码框:用户输入密码时隐藏字符。
  • 单选按钮:让用户从一组互斥选项中选择一个。
  • 复选框:允许用户从多个选项中选择一个或多个。
  • 下拉列表:提供一个菜单供用户选择。
  • 文件上传:允许用户上传文件至服务器。

表单还必须包含一个提交按钮,以便用户发送他们的输入。表单的数据可以通过GET或POST方法发送到服务器。

GET 方法

GET是HTML表单的默认提交方法,主要用于从服务器获取数据。当使用GET方法时,表单中的数据以variable=value的形式被附加在URL后面,变量之间用&连接,整个查询字符串以?与URL路径分隔。例如:http://example.com/page?name=JohnDoe&age=30
GET请求的优点是简单且可书签化,但它的缺点在于URL长度有限制,不适合传递大量数据,并且不适合传输敏感信息,因为这些信息会直接暴露在URL中,可能被记录在浏览器历史或服务器日志中。

POST 方法

POST方法主要用于向服务器传递数据。与GET方法不同,POST方法的数据不会附加在URL后面,而是放在HTTP请求的主体(body)中。这种方式允许客户端发送更多的数据,包括二进制数据,如文件上传,并且由于数据不在URL中可见,因此相对更安全。

编写一个含有表单的HTML

cd/var/www/html进入html的文件夹
创建编辑文件vim 20232320hxy.html
编辑以POST方法登录的文件

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST方法登陆</title>
</head>
<body>
    <h2>登录</h2>
    <form action="login.php" method="POST">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required><br><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

:wq保存退出
然后在浏览器里打开localhost/20232320hxy.html
就会出现我们编写好的页面,随意输入用户名和密码进行登录
7ebde4396337b8511c768c952b7bc65
d47877c894de1f0f6f12faabc6c84a0
登录后观察到这个POST方法是不会出现用户名及密码的
然后我们对比GET方法
这是GET方法登录的文件
eb1efb929bb769d6d2f0d8286b2e975
编写好后我们打开网页,进行登录
0e3b81550912f27d156aa6988ed5d80
a821d57ae16e9a62f9dcbbb343917a1
然后可以在URL中观察到用户名和明文密码

(2)Web前端javascipt

理解JavaScript的基本功能,理解DOM

JavaScript是一种轻量级、解释型的脚本编程语言,主要用于为网页添加交互功能。它最初是为了"让网页动起来"而创建的,如今已成为Web开发的三大核心技术之一(HTML、CSS、JavaScript)
·JavaScript的核心功能
① 网页内容操作与修改
JavaScript 可以直接读取、修改、添加或删除网页上的任何内容。
比如可以在用户点击按钮时改变文字、图片,或者动态生成新的内容。
② 用户交互响应
能够响应用户的各种操作,如:

鼠标点击、移动、拖拽
键盘按键输入
表单提交
页面滚动等

③ 数据验证
在表单提交到服务器之前,JavaScript可以先在用户的浏览器中进行数据检查,确保输入符合要求(如密码强度、邮箱格式等),提供即时反馈。
④ 动态样式控制
可以实时修改网页元素的CSS样式,实现动画效果、显示/隐藏元素、改变颜色大小等,让网页更加生动。
⑤ 异步数据请求
通过AJAX技术,JavaScript可以在不刷新整个页面的情况下,向服务器请求数据并更新部分页面内容,提供更流畅的用户体验。
⑥ 浏览器控制
可以操作浏览器窗口,如打开新窗口、控制历史记录、读取Cookie、使用本地存储等。
⑦ 计算与逻辑处理
具备完整的编程语言功能,可以进行数学计算、逻辑判断、循环处理等。
⑧ 多媒体控制
可以控制音频、视频的播放,处理图像等多媒体内容

DOM(Document Object Model,文档对象模型)是一个编程接口(API),它将整个HTML文档表示为一个树形结构。简单来说,DOM就是把网页转换成JavaScript能够理解和操作的对象模型。
JavaScript通过DOM提供的接口来访问网页元素。比如:

document.getElementById() - 通过ID获取元素
document.querySelector() - 通过CSS选择器获取元素
document.getElementsByTagName() - 通过标签名获取元素集合

在(1)的基础上扩展代码功能,实现用户点击登陆按钮后回显“欢迎+输入的用户名”

对上面的代码进行了修改,用户输入用户名和密码,点击"登录"按钮,触发onsubmit事件,立即调用 validateForm()函数,validateForm()函数获取输入值后进行用户名和密码的验证,验证成功显示欢迎信息
d8b183b05814d286009ced408540d08
登录操作
75e41ab63373006799209ce7c4cf736
测试输入不符合要求的密码
0679ecf2a4bb280e521d30183cda758
弹出提醒

尝试注入攻击

利用回显用户名注入攻击,由于代码未对用户输入的用户名进行 HTML/JS 转义处理,直接将输入内容作为 HTML 内容插入页面,浏览器会将注入的 HTML 标签或 JavaScript 代码当作合法页面代码解析执行
输入<b>???</b>
e1c9fa392d23f8603c798fb85f126bf
观察得知,输入的用户名被直接插进代码,所以???以粗体形式在页面上显示,注入成功

(3)Web后端

正常安装、启动MySQL

kali虚拟机自带mysql,输入systemctl status mysqlsystemctl start mysql开启MySQL服务
7836430fdb32aef1062f3492fa2ce15
输入mysql就可以直接进行操作了

数据库操作

建库

CREATE DATABASE 20232320HXYYY创建了一个名为20232320HXYYY的数据库
ef404379840e09b3440a8396c600e9c

创建用户、赋予权限、刷新权限和修改密码操作

CREATE USER 'user20232320_1' IDENTIFIED BY'user1@123;创建用户user20232320_1初始密码为user1@123
GRANT ALL PRIVILEGES ON 20232320HXYYY.* TO 'user20232320_1';将对20232324HXYYY数据库的所有操作权限赋予user20232320_1用户
FLUSH PRIVILEGES;刷新权限使授权生效
ALTER USER 'user20232320_1" IDENTIFIED BY 'user_1@123';将user20232320_1用户的登录密码改为了user_1@123
8cb6aef6fbfd4dfc5337d8bacdf02c6

建表

use 20232320HXYYY使用20232320HXYYY数据库,一定要指明是哪个数据库再开始建表

CREATE TABLE USERTABLE(
id INT AUTO INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL
);

0d2719c6bd97a8f6a6474a9b6fd1584
创建一个名为usertable的表用来存储一些用户的用户名和密码
e821547ceb5ade7f887d71a3b9709db
插入数据INSERT INTO usertable VALUES(1,'user_1','user_1@123')(2,'user_2','user_2@123');
查看表内容SELECT * FROM usertable;

(4)Web后端

编写PHP网页,连接数据库

进入/var/www/html/路径cd /var/www/html/
创建并编辑vim 20232320index.htmlvim 20232320login.php
代码思路:前端(HTML/JS) → 表单提交 → 后端(PHP) → 数据库(MySQL) → 验证结果 → 返回页面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页面</title>
    <script>
        // 验证表单
        function validateForm() {
            var username = document.getElementById("username").value;
            var password = document.getElementById("password").value;

            // 验证用户名不能为空
            if (username === "") {
                alert("用户名不能为空");
                return false;
            }

            // 验证密码不能为空且不少于6位
            if (password === "") {
                alert("密码不能为空");
                return false;
            } else if (password.length < 6) {
                alert("密码不少于6位");
                return false;
            }

            // 验证通过后,form会正常提交到PHP页面
            return true;
        }
    </script>
</head>
<body>
    <h2>登录</h2>
    <!-- action指向20232320login.php -->
    <form action="20232320login.php" method="POST" onsubmit="return validateForm()">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username"><br><br>
        <label for="password">密码:</label>
        <input type="password" id="password" name="password"><br><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>
<?php
$servername = "localhost";
$username = "user20232320_1";
$password = "user_1@123";
$dbname = "20232320HXYYY";

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

// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 检查是否通过 POST 提交
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $user = $_POST['username'] ?? '';
    $pass = $_POST['password'] ?? '';

    if (empty($user) || empty($pass)) {
        die("用户名和密码不能为空");
    }

    // 查询数据库验证用户 - 使用usertable表
    // 注意:需要确认usertable表中的字段名
    // 假设字段名为 username 和 password,如果不是请修改
    $sql = "SELECT * FROM usertable WHERE username='$user' AND password='$pass'";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        echo "<h2>登录成功</h2>";
        echo "<p>欢迎用户:<strong>" . $user . "</strong></p>";
        echo "<p>返回登录页</p>";
    } else {
        echo "<h2>登录失败</h2>";
        echo "<p>用户名 " . $user . " 不存在或密码错误!</p>";
        echo "<p>返回重新登录</p>";
    }
} else {
    echo "请通过登录表单提交数据";
}

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

打开网页输入localhost/20232320index.html进入登录页面,输入usertable表里有的用户名user_1和其密码use_1@123,登录成功
a33ed9d1d1cbb9e3383a4775a4cb1bf
输入不存在的用户名
68488dbd03fbbf492ae09d8c6033863

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

利用刚才的登录网站,进行SQL注入和XSS攻击的测试

SQL注入

原理:在输入字段中插入恶意SQL代码,返回在代码里操控代码执行
在我的PHP代码中

$sql = "SELECT * FROM usertable WHERE username='$user' AND password='$pass'";

没有使用预处理语句,存在SQL注入漏洞
输入登录信息

用户名: user_1' OR '1'='1
密码: 任意值(如123456)

注入后为SELECT * FROM usertable WHERE username='user_1' OR '1'='1' AND password='123456','1'='1'永远为真,会返回表中的用户数据
997d9a33d42cba4e68f67c6df142a13

XSS攻击

后端未对用户输入的内容进行 HTML 转义处理,直接将包含
f6058a514c1900d7092c3ed0953b12f

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

这里我选择的是DVWA

下载DVWA

在kali自带的浏览器中搜索https://github.com/digininja/DVWA,找到zip文件下载
f560987ff5e78607f957c56db5208c7

配置

将下载的zip文件解压至/var/www/html目录(需要使用root权限)
70192ccd30d5ac7ec0227539e97e4a0
解压后将config.inc.php.dist 的dist后缀去掉,打开config.inc.php,修改第20、21行
279679f6212589ce7771649ad69fe3f
在kali中输入service mysql start启动数据库
mysql -u root -p,直接回车进入
875142ab5955f918229e7e9fd8fb391
进行一些简单的数据库操作~
186a06c2c74f926d7d41880190ed0a5

访问DVWA

打开浏览器访问 http://localhost/DVWA-master/setup.php
在最下方点击Create/Reset Database
即创建成功
d5e14f04cc408bab7f01ffc16644d0d

SQL注入

在DVWA security处把难度从impossible改为low,点击submit确认
a7686f0adbf41c95979b758197daf9a
进入靶场的SQL Injection模块
·判断注入类型
测试输入
1' or '1'='1如果显示所有用户 → 存在注入
a594384c635b23c3bf9bfdd57c1f320
·判断字段数(ORDER BY法)
1' order by 1 #
1' order by 2 #
1' order by 3 #
1' order by 4 # 当出现空白页面时,前一个数字就是字段数
在测试中到2时还有返回,3就跳转空白页面了
cfd9be11af7e90efde812e8ba2fad71
·确定回显位置(UNION法)
因为字段为2,1' union select 1,2#
92d08ae807e7132058fce61554e8e6d
·获取数据库信息
1e38bbb257ecc6fe6cdf87b7a1fb6ed
c4e4b078f13bbeef8f59cd683171aaa
d58f824a1c01693b1249781b27a6150
42ebee5d57c7a8820aa1db05868ac08
获取的数据库信息有:
当前数据库为dvwa,数据库用户为dvwa@localhost
数据库版本为11.8.3-MariaDB-1+bl from Debian
获取表有:users、guestbook、access_log、security_log

users:用户表(主要目标,可能包含用户名、密码)
guestbook:留言板表
access_log:访问日志表
security_log:安全日志表

XSS

dom

页面可以选择不同英语标签,选择后URL栏中的default也会发生变化
c7adb09f761f8e862dab693b64ff126
把default=English的English改为
146ae833caf69802e9c4f17ef65b394
攻击成功

reflect

url会显示我们输入的信息
4cbdc651b941f68f72385301c062e34
对URL中的name传入xss代码
ef188ce62f121efd311066d4bffce64
攻击成功

stored

页面会保存我们输入的信息
656ab9035212d6ee5b78c6d851b2662
在输入框中输入xss代码
6e7dbfac76b673c544be49af2dfe858
攻击成功

CSRF

跨站请求伪造(CSRF,Cross-Site Request Forgery):攻击者利用用户已登录的身份,在受信任的网站上执行未经授权的恶意操作,伪造用户请求,欺骗服务器信任并执行操作
69c1ce5d76ce697006d9d017b0f176a
本来我们利用已登录的状态在网页中可以更改密码

在url那里可以看到我们修改后的密码,我们直接在url修改
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=yxh20232320&password_conf=yxh20232320&Change=Change#

然后尝试登录,用我们在正常渠道(网页内容)中修改的密码已经登不上了
fdf6049d690c5ef22c68880954a57c1
使用非常规手段修改的密码
2780ed40cb6413139bd0c29f2bd7982
攻击成功

3.问题及解决方案

  • 问题1:在编写PHP网页连接数据库一步时,我登录后始终跳转空白页面
  • 问题1解决方案:因为我在编不同文件的时候改名改过去改过来,跳转时没有跳转至正确的文件

4.学习感悟、思考等

本次实验首先是巩固了我上学期的web知识,本来以为已经忘得一干二净了,但是重新看一遍还是加深了我的记忆。在课堂上我们初步学习的像SQL注入攻击、XSS攻击这样的知识,通过实践的方式自己操作自己体会也更能理解和掌握,另外我通过DVWA靶场进行各类攻击的尝试,体会到这个平台的便捷性,也感受到我们要充分利用现有资源对知识进行巩固

参考资料

https://blog.csdn.net/2302_82189125/article/details/135834194

posted @ 2025-12-03 22:44  20232320黄馨仪  阅读(1)  评论(0)    收藏  举报