20232313 2025-2026-1 《网络与系统攻防技术》实验八实验报告
1.实验内容
--- 关于Web前端后端的安全,简单了解并实践。
基本实验内容如下:
- 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML;
- 理解JavaScript的基本功能,理解DOM;
- 编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”;
- 尝试注入攻击;
- 了解MySQL基础;
- 编写PHP网页,连接数据库,进行用户认证;
- 进行最简单的SQL注入,XSS攻击测试;
- 安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击。
2.实验过程
总共6个任务,如下:
(1)Web前端HTML相关实践
(2)Web前端javascipt相关实践
(3)Web后端MySQL相关实践
(4)Web后端PHP相关实践
(5)简单的SQL注入,XSS攻击测试
(6)DVWA平台综合实践
我们一个一个来看。
(1)Web前端HTML相关实践
Kali已经自带了Apache2服务器了。很好。
输入systemctl start apache2启用它。
/var/www/html是Kali Linux中Apache网页服务器的默认根目录,用于存放网站文件。输入cd /var/www/html进入。
使用vi 20232313.html新建一个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>
这个网页就是一个干净清爽的登录和搜索页面,上面是登录框,下面是搜索框。
在这里简单说一下html里表单的概念:表单(<form>)是网页上用来收集用户输入数据并提交给服务器的交互元素。
在这里我们已经使用了一个form。它分别使用GET和POST提供了查询和用户登录功能。
切换到图形化界面到该目录下双击这个HTML文件即可运行,结果如下:

搜索框输入“20232313”搜索,看到搜索内容直接显示在URL里,容易被他人看到或浏览器历史记录保存:

使用POST的方法则数据隐藏,适合敏感信息。

(2)Web前端javascipt相关实践
JavaScript 是让网页动起来的代码,比如点击按钮弹出提示、动态加载内容。
DOM是网页的结构树,JavaScript通过操作DOM可以改文字、加样式、删元素,让页面能交互。
我们新添加JS代码,新增对用户输入进行验证的功能:
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:
首先在用户名一栏输入<img src=x onerror=alert(1)>,密码任意,效果如下:

其次使用HTML代码注入,输入<h1>HTML injection succeed.</h1>,效果如下:

(3)Web后端MySQL相关实践
Kali已经安装了MySQL,在这里直接启动即可。
使用systemctl start mysql启动MySQL。接着进行如下配置用于测试:
mysql
-- 创建数据库
CREATE DATABASE 20232313db;
-- 使用数据库
USE 20232313db;
-- 创建用户20232313,密码为wzy1234
CREATE USER 'user20232313' IDENTIFIED BY 'wzy1234';
-- 授予用户权限
GRANT ALL PRIVILEGES ON 20232313db.* TO 'user20232313';
FLUSH PRIVILEGES;
-- 修改用户密码
ALTER USER 'user20232313' IDENTIFIED BY 'wzy12345';
-- 创建表
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 ('wzy', 'wzy1234');
-- 查看表中所有内容
SELECT * FROM testtable;
这段 SQL 代码创建了一个名为20232313db的数据库,并设置了用户权限,然后在该数据库中创建了一个表testtable,插入了一条数据,并查询了表中的所有内容。
这里用到的数据是(wzy, wzy1234),后面测试会用到,先记住。


(4)Web后端PHP相关实践
PHP是kali自带的。kali很方便。
我们打开20232313.html,回到登录界面修改一下。
回到之前的html文件修改一下登录按钮的action设置,改为执行php文件:

还是在/var/www/html目录下,我们新建文件20232313.php,内容如下:
<?php
$host = 'localhost';
$dbname = '20232313db';
$user = 'user20232313';
$password = 'wzy12345';
//创建数据库连接
$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();
?>

接着我们进行测试,发现能够连接上数据库,正常运行:


输入正确用户名密码可以成功登录,如果输入错误用户名密码会给出提示
(5)简单的SQL注入,XSS攻击测试
在这里使用经典的' OR '1'='1,用户名随便即可。这里的原理是利用了点号把前面的字符串注释掉,然后使用OR逻辑添加一个1=1使得判定正确。效果如下:

接着尝试XSS注入。在用户名输入<img src=x onerror=alert("XSSInjectedSucceed")>,密码还是输入' OR '1'='1,效果如下:

输入<img src=x onerror=alert("XSSInjectedSucceed")>时,如果网页未对用户输入进行过滤,浏览器会解析该代码并执行alert("XSSInjectedSucceed"),触发弹窗。
(6)DVWA平台综合实践
在这里我使用的平台是DVWA。至于怎么配置,我们询问一下AI或者查询一下CSDN就可以了,按下不表。
配置好的DVWA应该如下:

我们设置一下难度,调低点:

(6.1) SQL Injection
先简单尝试提交一个数据,发现显示First Name和Surname两个表段数据,并且在URL中显示了id,那么可能就是使用id值在数据库中进行查询。
尝试用1 AND 1=2测试是否存在SQL注入漏洞:

可以看出来这里的数据库查询是直接把用户输入插入查询语句中。
接下来我们来判断表中有几个字段,使用1' order by 1 #,1' order by 2 #数字逐渐递加,直到n的时候报错说明有n-1个字段,如图所示:

尝试后发现会在在1' order by 3 #的时候白屏,说明这次查询只返回两个字段。
有了上面分析的结果,接下来我们就可以使用union联合查询来获取一些信息。
使用' union select database(),version() #来获取当前数据库名称,版本:

使用' union select database(),user() #来获取当前当前用户信息:

接下来我们查询数据库中的所有表的名称,使用-1' union select database(),group_concat(table_name) from information_schema.tables where table_schema='dvwa' #,
这段代码通过闭合字符串、注释截断和UNION查询,从系统表获取数据库表名信息,效果如下:

可以直接可以看到有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)来批量获取目标表的所有字段名称。
之后我们就可以针对性的查询出各用户的用户名和密码,效果如下:

可以看到用户名很清楚,但是密码被加密了。根据128bit长度,尝试用MD5进行破解,发现确实是MD5:

由此我们知道admin用户的密码是password。
(6.2) XSS(DOM)
这里让我们选择不同的标签,可以注意到当我们选择不同的标签时url会产生变化,会出现一个叫做default的参数,如图所示:

尝试对default的值直接修改为我们的代码,修改值为<script>alert(1)</script>,成功注入,效果如下:

(6.3) XSS(Reflected)
发现了一个Name字段,也是直接在URL里显现了:

进行类似上一问的操作,成功:

(6.4) XSS(Stored)
这里提供两个字段。我们还是使用老套路<script>alert(1)</script>,发现第二个可以成功,但是第一个会提示“字符串长度限制”而失败。
我们可以直接使用F12对前端代码进行查看,发现这个限制是放在前端的,我们直接修改即可:


修改后我们注入的alert就可以执行两遍了。这也说明name和message字段都存在存储型XSS注入点。
(6.5) CSRF
这里是提供了一个需要我们对密码进行修改的网页。在URL也可以发现上面有password_new和password_conf这两个参数:

说明这里应该是使用GET进行服务器交互的。我们可以人为对URL进行编辑修改:

一旦运行这个URL,对应账户密码就被修改了。
3.问题及解决方案
- 问题1:DVWA的配置比较麻烦
- 解决方法1:在Kali上配置,同时结合AI的帮助,配置成功了。
4.学习感悟
前人栽树后人乘凉。我们需要及时借鉴前人的智慧。
浙公网安备 33010602011771号