20232303 2025-2026-1 《网络与系统攻防技术》实验八实验报告
1. 实验内容
(1)Web前端HTML
- 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML
(2)Web前端javascript
-
理解JavaScript的基本功能,理解DOM
-
在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
-
尝试注入攻击:利用回显用户名注入HTML及JavaScript
(3)Web后端:MySQL基础
- 正常安装、启动MySQL,建库、创建用户、修改密码、建表
(4)Web后端:编写PHP网页,连接数据库,进行用户认证
(5)最简单的SQL注入,XSS攻击测试
(6)安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击
2. 实验过程
2.1 web前端HTML
2.1.1 安装、启停Apache
Apache(Apache HTTP Server)是一款开源的网页服务器软件,由Apache软件基金会开发和维护。它最初源于NCSA HTTPd服务器,自1995年发展至今,以其卓越的跨平台性(支持Linux、Windows等多种操作系统)和高安全性而闻名,曾是全球市场占有率最高的Web服务器软件。Apache采用模块化设计,可通过API轻松扩展功能,例如集成Perl/Python解释器,并支持SSL加密、虚拟主机、多种认证方式等关键特性,其成功很大程度上得益于其开放的源代码和活跃的开发社区
Apache已经预装在Kali Linux上,使用systemctl start apache2启动Apache,使用systemctl status apache2.service确认Apache服务状态。

Apache HTTP Server 已经成功启动并正在运行。
- 系统状态信息显示服务状态为 active (running),这表明执行的 systemctl start apache2命令已生效,Apache 服务正在后台正常处理请求。
- 截图中的详细数据,如主进程 PID 为 4153、内存占用约 21MB 以及有 6 个工作进程(可见 apache2 -k start的多个实例),均符合 Apache 服务稳定运行时的典型特征。
- 虽然有一条提示“Could not reliably determine the server's fully qualified domain name”,但这属于常见的非致命性警告,通常不影响服务器的基本功能,可通过配置服务器的主机名来消除。
- 此外,“Loaded”一行显示服务的启动模式为“disabled”,意味着Apache服务当前未设置为开机自启,若实验需要可另行配置。
综上所述,Apache服务环境已就绪,可用于后续的Web安全实验操作。
在浏览器中输入localhost打开Apache欢迎页面,再次验证Apache网页服务器安装成功

用systemctl stop apache2可以关闭Apache。
2.1.2 编写一个含有表单的HTML
几乎所有的Web攻击(如SQL注入、XSS跨站脚本)都始于用户与服务器的一次交互,而表单(Form)就是最经典的交互方式。
理解HTML与表单:
HTML是超文本标记语言,是构成网页的骨架。我们用浏览器打开一个网页,看到的文字、图片、链接等,都是由HTML标签定义的。表单是HTML中用于收集用户输入的部分。我们登录网站时填的用户名密码框、搜索时用的搜索框、注册时填的信息表,这些都是表单。表单就像一个数据收集器,它把用户填写的数据打包,准备发送给服务器。
理解GET与POST方法:
表单收集好数据后,主要有两种方式送给服务器:GET和POST。
- GET方法是把用户填写的数据直接附加在网址(URL)的末尾,其特点是数据在URL中可见,有长度限制,适合发送非敏感、数据量小的请求(如搜索)。刷新页面或分享链接时会带上同样的数据。
- POST方法是把用户填写的数据放在HTTP请求的“正文”里发送,不会在浏览器的地址栏中显示。其特点是数据不可见,更安全,没有长度限制,适合发送敏感或数据量大的信息(如登录密码、上传文件)。刷新页面时浏览器会提示“确认重新提交表单”。
进入当前用户的/var/www/html目录,用vi 20232303myform.html命令新建html文件并在其中编写含有表单的HTML。

使用get方法的代码如下所示:

html前端页面如下:

使用GET时,点击提交后,可以看到用户名和口令明文出现在了URL里:

使用post方法的代码如下所示:

html前端页面如下:

使用POST时,点击提交后,数据会在请求体中发送,地址栏不会显示:

至此完成了用户通过表单(前端)输入数据 -> 浏览器通过HTTP协议(GET/POST方法)将数据发送给服务器的过程。
2.2 Web前端javascript
2.2.1 理解JavaScript的基本功能,理解DOM
- JavaScript的基本功能——网页的"行为"
JavaScript是一种在浏览器中运行的脚本语言,负责给网页添加交互行为。
如果说HTML是骨架,CSS是外观,那么JavaScript就是肌肉和神经。
其核心功能有:
(1)操作网页内容:动态地改变HTML元素、属性、样式。
(2)响应用户事件:处理点击、鼠标移动、键盘输入等操作。
(3)验证表单数据:在数据发送到服务器之前,先在客户端进行检查。(实验下一步要做的)
(4)与服务器通信:异步加载数据(AJAX)。
- 理解DOM——网页的"结构化地图"
DOM(文档对象模型)是浏览器将HTML文档解析成的一个树形结构。在这个结构中,每个HTML标签都是一个对象(节点)。
JavaScript需要通过DOM来找到页面上的特定元素(比如找到用户名输入框),然后才能读取它的值或修改它。
2.2.2 编写表单验证与回显
现在需要将JavaScript和DOM的知识结合起来,完成两个具体任务:
(1)客户端验证:在用户点击"登录"后,用JavaScript检查输入是否合法(用户名不能为空,密码长度需大于6位)
(2)动态回显:如果验证通过,在页面上显示"欢迎,[用户名]!"。
将20232303myform.html文件完善如下:
<!DOCTYPE html>
<html>
<head><title>JavaScript表单验证 - Web安全实验</title><script>// 页面加载完成后执行此函数function init() {// 1. 获取表单元素var myForm = document.getElementById('loginForm');// 2. 为表单的"提交"事件绑定一个处理函数myForm.onsubmit = function(event) {// 3. 阻止表单的默认提交行为(非常重要!)event.preventDefault();// 4. 获取用户名和密码输入框的值var username = document.getElementById('username').value;var password = document.getElementById('password').value;var messageDiv = document.getElementById('message');// 5. 清空之前的消息messageDiv.innerHTML = '';messageDiv.style.color = 'black'; // 重置颜色// 6. 编写验证规则// 规则1:用户名不能为空if (username.trim() === '') {messageDiv.innerHTML = '错误:用户名不能为空!';messageDiv.style.color = 'red';return false; // 验证失败,终止函数}// 规则2:密码长度至少为6位if (password.length < 6) {messageDiv.innerHTML = '错误:密码长度不能少于6位!';messageDiv.style.color = 'red';return false;}// 7. 如果所有验证都通过,则显示欢迎信息messageDiv.innerHTML = '欢迎,' + username + '!';messageDiv.style.color = 'green';// 注意:这里我们没有真正提交表单到服务器,只是前端演示。// 真实场景中,验证通过后,可能需要调用 myForm.submit() 或使用AJAX发送数据。};}// 当整个HTML文档加载完毕时,执行init函数window.onload = init;</script>
</head>
<body><h1>用户登录示例(带JavaScript验证)</h1><form id="loginForm" action="" method="post"><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><!-- 这个div用于显示验证消息或欢迎信息 --><div id="message"></div>
</body>
</html>
进行测试如下:
不输入用户名,直接点击登录

输入用户名,但密码少于6位

输入合法的用户名和密码(密码>=6位)

2.2.3 尝试注入攻击:利用回显用户名注入HTML及JavaScript
首先理解这一部分的原理:
XSS攻击(跨站脚本攻击)允许攻击者将恶意脚本注入到网页中,当其他用户访问这个页面时,这些脚本会在他们的浏览器中执行。
本部分注入攻击正是利用了上一步实验中实现的"回显用户名"功能。
messageDiv.innerHTML = '欢迎,' + username + '!';
上一步代码中的这一行存在漏洞:直接将用户输入的username拼接进HTML,因为通过innerHTML插入,所以会解析HTML标签,同时没有对用户输入做任何过滤或转义。
利用漏洞进行注入攻击:
- 基本HTML注入:
在用户名输入框中输入<h1 style="color:red">基本HTML注入</h1>,效果如下:

- JavaScript弹窗
在用户名输入框中输入<script>alert('XSS攻击成功!')</script>,效果如下:

没能成功的原因是由于现代浏览器的安全机制,通过innerHTML插入的<script>标签默认不会执行。
- 图片标签注入
在用户名输入框中输入<img src="x" onerror="alert('XSS via img tag!')">,效果如下:

这一步的原理是<img>标签的src属性指向一个不存在的图片,加载失败会触发onerror事件,执行其中的JavaScript代码。
2.3 Web后端:MySQL基础
MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS),由 Oracle 公司维护,基于 SQL(结构化查询语言)实现数据的存储、管理与操作,是 Web 开发、企业级应用等场景中最常用的数据库之一。
用命令systemctl start mysql打开Kali自带的MySQL服务,输入systemctl status mysql确认服务状态

输入mysql进入数据库,然后进行建库,创建用户、修改密码,建表等操作,具体如下:
- 输入命令
CREATE DATABASE db20232303;创建一个名为db20232303的新数据库。 - 输入命令
USE db20232303;选定当前要操作的数据库。执行后,提示符变为 MariaDB [db20232303]>,表明后续的所有操作都将在db20232303数据库中进行。 - 输入命令
CREATE USER 'user20232303' IDENTIFIED BY '123456';创建一个新的数据库用户,用户名为user20232303,并为其设置了初始密码123456。 - 输入命令
GRANT ALL PRIVILEGES ON db20232303.* TO 'user20232303';授予用户权限。GRANT命令用于授予用户权限。ALL PRIVILEGES表示将所有权限授予用户user20232303,ON db20232303.*表示这些权限仅作用于db20232303数据库下的所有对象。 - 输入命令
FLUSH PRIVILEGES;使MariaDB服务器重新加载权限表,确保刚刚执行的 GRANT授权操作立即生效,无需重启服务。 - 输入命令
ALTER USER 'user20232303' IDENTIFIED BY 'zjh123456';将用户user20232303的密码从初始的123456修改为zjh123456。 - 输入命令:
CREATE TABLE testtable (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,pwd VARCHAR(255) NOT NULL
);
在当前的db20232303数据库中创建一个名为testtable的表。表结构包含三个字段:id(自增主键)、name(非空变长字符串)、pwd(非空变长字符串)。
- 输入命令
INSERT INTO testtable (name, pwd) VALUES ('zhujiahe', 'zjh123456');向 testtable表中插入一行新数据。 - 输入命令
SELECT * FROM testtable;查询并返回指定表中的所有数据。

2.4 Web后端:编写PHP网页,连接数据库,进行用户认证
PHP 是一种广泛用于 Web 后端开发的服务器端脚本语言,核心作用是处理服务器端逻辑、与数据库交互、动态生成网页内容,是构建动态网站(如用户登录系统、数据管理平台等)的重要工具。
使用以下html文件和php文件实现连接数据库并进行用户认证。
20232303myform.html
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>20232303zhujiahe</title></head>
<body><h1>20232303zhujiahe</h1><!-- 登录表单 --><div class="form-section"><h2>用户登录</h2><form id="loginForm" action="http://localhost/20232303zjh.php" method="post"> <label for="username">用户名:</label><input type="text" id="username" name="username" required><label for="password">密码:</label><input type="password" id="password" name="password" required><button type="submit">登录</button></form><div id="welcomeMessage" class="welcome-message"></div></div><script>function submit_login() {const username = document.getElementById('username').value;const password = document.getElementById('password').value;const welcomeMessage = document.getElementById('welcomeMessage');// 验证用户名规则:至少3个字符,只能包含字母和数字if (username.length < 3) {alert('用户名至少需要3个字符');return;}// 验证密码规则:至少6个字符if (password.length < 6) {alert('密码至少需要6个字符');return;}// 显示欢迎信息welcomeMessage.innerHTML = '欢迎 ' + username;welcomeMessage.style.display = 'block';// 清空表单document.getElementById('loginForm').reset();}</script>
</body>
</html>
这个HTML文件构建了一个登录表单,通过JavaScript进行前端基础规则验证,并通过表单的action属性将用户提交的用户名和密码数据以POST方法发送到指定的PHP处理页面。
20232303zjh.php
<?php
$host = 'localhost';
$dbname = 'db20232303';
$user = 'user20232303';
$password = 'zjh123456';//创建数据库连接
$conn = new mysqli($host, $user, $password, $dbname);//检查连接是否成功
if ($conn->connect_error) {die("数据库连接失败: " . $conn->connect_error);
}//获取POST数据
$username = $_POST['username'];
$password = $_POST['password'];//使用查询语句进行查询
$sql = "SELECT * FROM testtable WHERE name='$username' AND pwd='$password'";
$result = $conn->query($sql);//检查是否有匹配的记录
if ($result->num_rows > 0) {echo "欢迎登录成功: " . $username . "!";
} else {echo "用户名或密码错误";
}//关闭结果集和预处理语句
$result->close();
$stmt->close();//关闭数据库连接
$conn->close();
?>
PHP文件成功根据我的数据库配置建立了连接,并查询testtable表以核对用户凭据。其逻辑是:若在表中找到匹配name和pwd的记录则返回欢迎信息,否则报错,从而完成了基于数据库的后端用户认证流程。
若在登陆界面输入数据库中没有存储的用户名和密码

点击登录显示如下结果

输入存储在数据库中的用户名和密码

点击登录显示如下结果

2.5 最简单的SQL注入,XSS攻击测试
随机输入用户名,密码输入' OR '1'='1实现SQL注入

点击登录,数据库中并没有zhujiaheSQL这个用户但却登陆成功

用户名输入<img src=x onerror=alert("xssSucceed")>,密码输入' OR '1'='1实现XSS攻击

2.6 安装DVWA平台,并完成SQL注入、XSS、CSRF攻击
DVWA(全称 Damn Vulnerable Web Application)是一个专门为安全人员、渗透测试人员、网络安全爱好者设计的练习靶场。它是一个搭建在 Web 服务器上的超弱安全性的网站,里面故意做了很多漏洞,供人练习攻击和防护技巧。
2.6.1 安装DVWA平台
下载DVWA压缩包,解压到/var/www/html目录,

重命名解压后的文件夹为DVWA,进入其config目录,复制默认配置文件并进行修改,将数据库配置项替换为已创建的数据库信息,同时将等级调整为low

将修改后的配置文件改名

设置DVWA目录的所属用户为Apache运行用户(www-data),设置目录权限

打开浏览器访问:http://localhost/DVWA ,用户名输入admin,密码输入password

登录后进入Database Setup界面,点击最下方的Create / Reset Database,再次在登陆界面输入用户名和密码进入DVWA主界面

2.6.2 完成SQL注入、XSS、CSRF攻击
- SQL注入
正常提交payload为1

输入1 and 1=1#和1 and 1=2#返回结果没有变化,说明不是数字型注入


输入1' and 1=2#,没有结果返回,说明是字符型注入且单引号闭合。
接下来判断字段,猜测是2个字段,直接从2开始,输入1' order by 2#

没有问题,再递增,输入1' order by 3#

出现异常,说明猜测正确,字段为2。
输入' UNION SELECT 1,database() from information_schema.schemata#获取数据库名

数据库名为db20232303
输入1' UNION SELECT 1,table_name from information_schema.tables where table_schema='db20232303'#获取表名

输入1' OR '1' = '1',这种注入方式会绕过查询的条件,从而返回所有用户的数据

- XSS注入
- XSS(DOM)

可以在URL里看到default参数的值,说明是get型
将default参数值改为<script>alert('20232303zhujiahe')</script>

注入成功
- XSS(Reflected)
在输入框中输入<script>alert('20232303')</script>,注入成功

- XSS(Stored)
在message部分输入<script>alert('zhujiahe')</script>,注入成功

- CSRF
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
进入到CSRF关卡,发现这是一个修改密码的页面,没有确认旧密码是什么,只有新密码和确认新密码的输入框,同时可以看出是使用通过GET请求提交新密码(password_new)和确认密码(password_conf)

直接修改URL,原来密码输入的不匹配,输入新URL后成功修改密码


此时登录DVWA时就要输入新密码20232303了。
配置burpsuite
参考kali-linux自带burpsuite使用完成burpsuite配置使用

3. 问题及解决方案
-
问题1:当输入
<script>alert('XSS攻击成功!')</script>进行XSS攻击时,没有出现弹窗,只显示了欢迎信息并且没有回显用户名。 -
问题1解决方案:通过询问AI得知没能成功的原因是由于现代浏览器的安全机制,通过innerHTML插入的
<script>标签默认不会执行。改为图片标签注入输入输入<img src="x" onerror="alert('XSS via img tag!')">后成功。 -
问题2:一开始无法正常打开DVMA
-
问题2解决方案:经过排查发现是配置文件“config.inc.php ”文件名后面多打了个空格,将文件名改对后就能正常打开了。
-
问题3:配置burpsuite时出现报错

- 问题3解决方案:这个错误提示说明当前的操作系统环境与Burp Suite内置浏览器的“沙箱”安全隔离模式不兼容。允许浏览器在无沙箱模式下运行即可解决问题。
