20232304 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.实验过程
2.1 Web前端HTML
Apache已经预装在Kali Linux上,不用额外安装,所以我们要做的首先是确认80端口是否被占用,输入如下命令
netstat -tupln | grep 80
如图所示:

可以看到端口被pid为56542的python程序占用,所以我们需要先kill掉这个进程才能继续,在命令行中输入如下命令:
kill 56542
以杀掉进程,再次检查直到没有进程占用80端口为止,如图所示:

现在没有占用,可以启动Apache,在命令行中输入:
systemctl start apache2
以启动Apache,再使用如下命令确认服务状态:
systemctl status apache2.service
如图所示:

Apache已成功启动。
我们进入当前用户的/var/www/html目录下,新建一个html文件,使用命令
vi 20232304fty.html
输入如下内容:
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录与搜索</title><style>body {font-family: Arial, sans-serif;max-width: 600px;margin: 50px auto;padding: 20px;line-height: 1.6;}.form-section {margin-bottom: 40px;padding: 20px;border: 1px solid #ddd;border-radius: 5px;}input[type="text"], input[type="password"] {width: 100%;padding: 10px;margin: 8px 0;border: 1px solid #ddd;border-radius: 4px;box-sizing: border-box;}input[type="submit"] {background-color: #4CAF50;color: white;padding: 10px 15px;border: none;border-radius: 4px;cursor: pointer;margin-top: 10px;}input[type="submit"]:hover {background-color: #45a049;}label {display: block;margin-top: 10px;}</style>
</head>
<body><h1>简单网页示例</h1><!-- 登录表单 - 使用POST方法 --><div class="form-section"><h2>用户登录</h2><form action="/login" 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><input type="submit" value="登录"></form></div><!-- 搜索表单 - 使用GET方法 --><div class="form-section"><h2>搜索功能</h2><form action="/search" method="get"><label for="search">搜索关键词:</label><input type="text" id="search" name="q" required><input type="submit" value="搜索"></form></div>
</body>
</html>
该网页的效果如下:

2.2 Web前端JavaScript
先了解一下什么是JavaScript和DOM
JavaScript:Web上的一种编程语言,主要用于嵌入动态文本于HTML页面、响应浏览器事件、读写HTML元素、验证数据等。
DOM:全名是文档对象模型,是浏览器用来解析HTML和XML文档的编程接口,将文档描绘成一个层次化的节点树,允许开发人员动态地访问和操作文档的内容和结构。
我们在原HTML上加入JavaScript对用户输入进行验证,添加的JavaScript代码如下:
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();}
注意HTML中使用JavaScript的时候需要将代码用<script>和</script>包围,最后网页的效果如下:



实现了用户输入验证和登录成功回显显示用户名的功能。
我们进行JavaScript注入,在用户名处输入下面的代码:
<script type="text/javascript">alert("JavaScriptInjectionSucceed.")</script>
效果如下:

可以看到注入成功;
使用HTML代码注入,注入代码为<h1>HTML injection succeed.</h1>,效果如下:

可以看到注入成功。
2.3 Web后端MySQL基础
MySQL是Kali自带。
使用systemctl start mysql打开MySQL服务,systemctl status mysql确认服务状态,如图所示

输入下面的命令完成建库,修改密码,建表等操作:
mysql
-- 创建数据库
CREATE DATABASE 20232304db;
-- 使用数据库
USE 20232304db;
-- 创建用户
CREATE USER 'user20232304' IDENTIFIED BY 'Alex1234';
-- 授予用户权限
GRANT ALL PRIVILEGES ON 20232304db.* TO 'user20232304';
FLUSH PRIVILEGES;
-- 修改用户密码
ALTER USER 'user20232304' IDENTIFIED BY 'Fty1234';
-- 创建表
CREATE TABLE testtable (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,pwd VARCHAR(255) NOT NULL
);
-- 插入数据
INSERT INTO testtable (name, pwd) VALUES ('fengtianyue', 'Fty1234');
-- 查看表中所有内容
SELECT * FROM testtable;
运行结果如图所示:

2.4 Web后端编写PHP网页
PHP也是Kali Linux里面本来就有的,不需要额外下载,如图所示:

我们使用下面的PHP代码来实现数据库连接和用户认证
<?php
$host = 'localhost';
$dbname = '20232304db';
$user = 'user20232304';
$password = 'Fty1234';//创建数据库连接
$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();
?>
之后我们在之前的前端代码中将登录按钮的action改为执行该php文件,如图所示:

之后我们尝试在前端登录,如图所示:


可以看到输入正确用户名密码可以成功登录,如果输入错误用户名密码会给出适当提示
2.5 SQL注入与XSS注入
实现SQL注入,只需要随机输入用户名,密码输入经典的' OR '1'='1即可成功登录,如图所示:

由于数据库中并没有fengtianyue123这个用户,所以判定SQL注入成功。
在用户名中输入<img src=x onerror=alert("XSSInjectedSucceed")>,密码输入' OR '1'='1,即可实现XSS攻击,如图所示:

可以看到XSS注入和SQL注入均成功。
2.6 安装DVWA或WebGoat平台,并完成SQL注入,XSS,CSRF攻击
我们这里选择DVWA,使用本地运行的形式。
主界面如图所示:

在做之前一定要先调难度,我这个默认难度是impossible,我在调整难度之前都给我挠秃头了也做不出来。。。
2.6.1 SQL注入部分
我们先输入1,看看结果

输入ID并提交会有显示First Name和Surname,并且在URL中显示了id,那么可能就是使用id值在数据库中进行查询,所以我们用1 and 1=2判断是否存在注入:

可以看到和直接输入1的结果是一样的,说明数据库查询是直接把用户输入插入查询语句中,接下来我们判断注入类型,输入1',查看结果:

报错了,那预计就是字符型注入。
接下来我们来判断表中有几个字段,使用1' order by 1 #,1' order by 2 #数字逐渐递加,直到n的时候报错说明有n-1个字段,如图所示:



到3的时候报错了,说明这次查询只返回两个字段。
接下来我们使用union联合查询:
先使用' union select 1,2 #,结果如下:

接下来获取当前数据库名称,版本以及当前用户,使用' union select database(),version() #


数据库名dvwa,
版本11.8.3-MariaDB-1+bl from Debian
用户dvwa@localhost
接下来我们查询数据库中的所有表的名称,使用-1' union select database(),group_concat(table_name) from information_schema.tables where table_schema='dvwa' #。
其原理是:首先使用单引号(')提前闭合原查询语句中字符串值的边界,并用注释符(#)使原查询后续部分失效;然后通过 UNION SELECT操作符,恶意附加一个额外的查询,从而能够直接从数据库的系统表(如 information_schema.tables)中查询并获取当前数据库(table_schema='dvwa')包含的所有表名的列表(使用 group_concat函数合并成一个字符串)

可以看到有users和guestbook两张表。
我们再尝试在users表中获取所有的字段名,使用-1' union select database(),group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' #
其原理是直接访问存储数据库元数据的系统表 information_schema.columns,从而一次性获取 dvwa数据库中 users表的所有列名称(使用 group_concat函数合并成一个字符串)

可以看到所有列的名称是user_id,first_name,last_name,user,password,avatar,last_login,failed_login
之后我们就可以针对性的查询出各用户的用户名和密码,使用-1' union select group_concat(user_id,first_name),group_concat(user,password) from users #

可以看到用户名很清楚,但是密码被加密了,从形式看来似乎是MD5,我们尝试破解一下:

可以看到用户admin的密码为password,证明了我们的猜测。
2.6.2 XSS部分
2.6.2.1 XSS(DOM)
让我们选择不同的标签,可以注意到当我们选择不同的标签时url会产生变化,会出现一个叫做default的参数,如图所示:


那么我们可以尝试一下用这个default参数作为突破口,尝试让其值等于我们要执行的脚本,如图所示:

可以看到注入成功。
2.6.2.2 XSS(Reflected)
可以看到让我们输入名字,并且url也会随之变化,那么我们也可以认为这个name参数就是注入点,如图所示:

我们依然尝试提交一段代码<script>alert(1)</script>,结果如下:

可以看到还是注入成功。
2.6.2.3 XSS(Stored)
可以看到随着我们输入增多,页面上的留言数量也跟着增多,证明我们输入的信息被存储,如图所示:

我们还是先输入代码<script>alert(1)</script>,结果如下:

可以看到输入不进去了,最多只能输入10个字符。我们来查看一下源代码,看看是在前端做了限制还是在后端做了限制:

可以看到是在前端做了一个maxlength="10"的限制,既然在前端那就好办,直接改就可以了,如图所示

之后我们重新输入代码,结果如图:

可以看到注入成功,并且弹了两次窗,说明name和message字段都存在存储型XSS注入点
2.6.3 CSRF部分
可以看到网站的设计意图是让我们修改密码。

如图所示,当我直接提交的时候,在url中出现了两个参数,一个是password_new参数,一个是password_conf参数,内容和我输入的内容是一模一样的,所以大胆猜测这个网站是不经过加密直接使用GET方法传向服务器的,所以我们可以直接尝试修改url,如图所示:


为了方便体现是否修改成功,提交前的页面是一个输入不匹配的页面,结果是密码被成功修改。说明这个网站存在CSRF漏洞,只要被引诱在无意之间点击了被黑客修改过的url,就可能在不知不觉之间被修改密码。
3.问题及解决方案
- 问题1:不知道怎么安装靶场
- 问题1解决方案:一开始想用Docker容器安装的,奈何实在是连接不上官方的镜像源,国内的镜像源又都需要登录认证,最终无奈放弃了,后来才发现可能只有在Windows下安装会比较麻烦一些,像Kali这种所需各种软件全部齐备的系统,本地安装也是非常简便的~尤其是DVWA,基于Apache2和MySQL,这两个软件在Kali上都是预装好的,配置起来很方便,WebGoat也是不遑多让,有Java环境就可以很方便的安装,甚至在Windows上也很方便。
- 问题2:做题没思路
- 问题2解决方案:都说“天下文章十八抄”,我觉得做CTF相关题目也是如此,初学者最好还是通过别人写好的Writeup来积累思路,做得多了视野开阔了,最终才能融会贯通。
4.学习感悟、思考等
在大一下学期被我放弃的CTF最终还是找上门来(毕竟是专业课),有了以前的经验,这次实验对我来说基本上还算不上特别难,最难的地方是装靶场,还是因为误入歧途才导致的难。虽然本次实验内容对我来说不难,但是在更高阶的技巧积累方面我还差得很远,CTF是一个不断积累的过程,每个人都会有“还能这样解题”的惊叹,但只要肯努力,最后也都能收获属于自己的欣喜和成就。