20232326 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
2.1.1 Apache服务器安装与配置
Apache服务器已通过phpStudy集成环境成功安装和配置。通过phpStudy控制面板可以正常启动、停止和重启Apache服务。
验证步骤:
-
打开phpStudy面板
-
点击"启动"按钮启动Apache服务
![image]()
-
在浏览器中访问
http://localhost,确认服务器正常运行
![image]()
2.1.2 HTML表单与GET/POST方法
创建了包含GET和POST方法表单的HTML页面([login.html](file:///D:/phpstudy_pro/WWW/login.html)),用于演示不同的HTTP请求方法。
关键代码片段:
<!-- GET 方法表单 -->
<form id="getForm" method="GET" action="">
<div class="form-group">
<label for="getUsername">用户名:</label>
<input type="text" id="getUsername" name="username" required>
</div>
<div class="form-group">
<label for="getPassword">密码:</label>
<input type="password" id="getPassword" name="password" required>
</div>
<button type="submit" class="btn">GET 登录</button>
</form>
<!-- POST 方法表单 -->
<form id="postForm" method="POST" action="">
<div class="form-group">
<label for="postUsername">用户名:</label>
<input type="text" id="postUsername" name="username" required>
</div>
<div class="form-group">
<label for="postPassword">密码:</label>
<input type="password" id="postPassword" name="password" required>
</div>
<button type="submit" class="btn">POST 登录</button>
</form>
验证步骤:
-
访问
http://localhost/login.html
![image]()
-
在GET表单中填写用户名和密码并提交,观察URL变化,查询参数出现在URL中
![image]()
-
在POST表单中填写用户名和密码并提交
![image]()
![image]()
![image]()
GET方法将表单数据附加在URL之后,以?分隔URL和传输数据,参数之间以&相接,适用于少量数据传输且数据对安全性要求不高的场景。而POST方法将表单数据放在HTTP协议的请求头中传输,安全性相对较高,适合传输较大量数据或敏感信息。
2.2 Web前端JavaScript
2.2.1 JavaScript验证功能
在HTML表单基础上增加了JavaScript验证功能,验证用户名和密码规则,并在用户点击登录按钮后回显"欢迎+输入的用户名"。
关键代码片段:
// 简单的JavaScript验证
function validateForm() {
const username = document.getElementById('jsUsername').value;
const password = document.getElementById('jsPassword').value;
if (username.length < 3) {
alert('用户名至少需要3个字符');
return;
}
if (password.length < 6) {
alert('密码至少需要6个字符');
return;
}
// 显示欢迎信息
document.getElementById('jsResult').innerHTML = '欢迎, ' + username + '!';
document.getElementById('jsResult').style.display = 'block';
}

JavaScript通过DOM操作实现了客户端验证功能,提升了用户体验,但不能替代服务器端验证。通过getElementById获取表单元素,使用.value属性获取输入值,并通过条件判断实现验证逻辑。
2.2.2 XSS注入攻击测试
通过回显用户名功能演示XSS注入攻击的可能性。
验证步骤:
-
输入包含HTML标签的用户名,如
<b>test</b>,结果显示加粗的"test"文本,表明存在XSS漏洞
![image]()
-
新做了一个用来测试xss攻击的网页http://localhost/xss_demo.php
![image]()
![image]()
重定向攻击:
![image]()
![image]()
HTML注入:
![image]()
XSS攻击利用了网站对用户输入数据输出时未经严格过滤的特点,将恶意脚本代码注入到网页中执行。
2.3 Web后端MySQL基础
2.3.1 MySQL安装与启动
MySQL数据库已通过phpStudy集成环境成功安装和启动。
输入tasklist | findstr mysql验证

2.3.2 数据库与表结构
DVWA数据库已创建,包含users和guestbook表。
查看数据库
mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "SHOW DATABASES;"

查看users表结构
mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "USE dvwa; DESCRIBE users;"

查看用户数据
mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "USE dvwa; SELECT user_id, first_name, last_name, user FROM users;"

查询到users表的5条用户数据,包含user_id、姓名、用户名等信息
mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "USE dvwa; SELECT user_id, user, password, first_name, last_name FROM users;"

可以看到用户密码使用哈希值来存储
2.4 Web后端PHP网页连接数据库进行用户认证
2.4.1 用户认证页面
创建了用户认证页面([new_login.php](file:///D:/phpstudy_pro/WWW/new_login.php)),实现了基于DVWA数据库的用户登录验证功能。
验证步骤:
访问http://localhost/new_login.php,使用DVWA中的用户凭据登录(admin/password)


采用参数化查询防止SQL注入攻击,使用session管理用户登录状态,通过htmlspecialchars函数防止XSS攻击。
<?php
session_start();
// 处理POST请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取并清理输入数据
$input_username = isset($_POST['username']) ? trim($_POST['username']) : '';
$input_password = isset($_POST['password']) ? trim($_POST['password']) : '';
// 引入数据库配置
require_once 'db_config.php';
try {
// 查询用户信息
$stmt = $pdo->prepare("SELECT * FROM users WHERE user = ? AND password = ?");
$stmt->execute([$input_username, md5($input_password)]);
$user = $stmt->fetch();
if ($user) {
// 登录成功
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $input_username;
echo "<!DOCTYPE html>
<html lang='zh-CN'>
<head>
<meta charset='UTF-8'>
<title>登录成功</title>
<style>
body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; }
.success { background-color: #d4edda; color: #155724; padding: 15px; border-radius: 5px; }
</style>
</head>
<body>
<div class='success'>
<h2>登录成功</h2>
<p>欢迎, " . htmlspecialchars($input_username) . "!</p>
</div>
<p><a href='new_login.php'>重新登录</a></p>
</body>
</html>";
exit;
} else {
// 登录失败
$error_message = "用户名或密码错误";
}
} catch (PDOException $e) {
$error_message = "数据库查询出错: " . $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户登录 - 20232326</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 500px;
margin: 50px auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="text"], input[type="password"] {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
box-sizing: border-box;
}
.btn {
width: 100%;
padding: 12px;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
}
.btn:hover {
background-color: #0056b3;
}
.error {
background-color: #f8d7da;
color: #721c24;
padding: 10px;
border-radius: 5px;
margin-bottom: 15px;
}
.identifier {
text-align: center;
color: #6c757d;
font-size: 14px;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<h2>用户登录</h2>
<p class="identifier">学号: 20232326</p>
<?php if (isset($error_message)): ?>
<div class="error"><?php echo $error_message; ?></div>
<?php endif; ?>
<form method="POST" action="new_login.php">
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit" class="btn">登录</button>
</form>
<div style="margin-top: 20px; padding: 15px; background-color: #e9ecef; border-radius: 5px;">
<h3>可用测试账户:</h3>
<ul>
<li>admin / password</li>
<li>gordonb / hello</li>
<li>pablo / letmein</li>
<li>smithy / password</li>
</ul>
</div>
</div>
</body>
</html>
2.5 最简单的SQL注入、XSS攻击测试
2.5.1 SQL注入测试
创建了SQL注入测试页面([sql_injection_test.php](file:///D:/phpstudy_pro/WWW/sql_injection_test.php)),演示不安全的SQL查询如何导致SQL注入漏洞。
关键代码片段:
// 不安全的查询方式 - 容易受到SQL注入攻击
$unsafe_query = "SELECT first_name, last_name FROM users WHERE user_id = $user_id";
try {
// 执行不安全的查询
$stmt = $pdo->query($unsafe_query);
// ...
} catch (PDOException $e) {
// ...
}
验证步骤:
-
访问
http://localhost/sql_injection_test.php -
输入正常用户ID(如1),确认返回正确的用户信息
![image]()
![image]()
-
尝试SQL注入攻击:
- 输入
1 UNION SELECT user, password FROM users
![image]()
- 输入
SQL注入攻击通过在输入中插入恶意SQL代码,改变原有SQL语句的执行逻辑,从而绕过认证、获取敏感数据甚至控制数据库服务器。
2.5.2 XSS攻击测试
创建了XSS攻击测试页面([xss_demo.php](file:///D:/phpstudy_pro/WWW/xss_demo.php)),演示不安全的输出如何导致XSS漏洞。
关键代码片段:
if ($user_input) {
if ($mode === 'unsafe') {
// 不安全的输出方式 - 容易受到XSS攻击
echo "您输入的内容是: " . $user_input;
} else {
// 安全的输出方式 - 转义特殊字符
echo "您输入的内容是: " . htmlspecialchars($user_input);
}
}
验证步骤:
- 访问
http://localhost/xss_test.php - 在输入框中输入
<script>alert('XSS')</script> - 点击"不安全输出"按钮
![image]()
XSS攻击发生在客户端,攻击者通过在网页中注入恶意脚本,当其他用户浏览该网页时,恶意脚本会在用户浏览器中执行,从而窃取用户信息或进行其他恶意操作。
2.6 安装DVWA并完成SQL注入、XSS、CSRF攻击
2.6.1 DVWA平台安装与配置
DVWA平台已通过phpStudy环境成功安装和配置。
验证步骤:
- 访问
http://localhost/DVWA - 确认DVWA首页正常加载
- 点击"Setup / Reset DB"链接创建/重置数据库
- 点击"Login"使用默认凭据登录(admin/password)
![image]()
2.6.2 SQL注入攻击
在DVWA平台上完成了不同难度级别的SQL注入攻击测试。
验证步骤:
- 点击DVWA菜单中的"SQL Injection"
- 直接输入
' 1' OR '1'='1
![image]()
2.6.3 XSS攻击
在DVWA平台上完成了反射型和存储型XSS攻击测试。
验证步骤:
-
点击DVWA菜单中的"XSS (Reflected)"
-
尝试不同难度级别的攻击:
- Low级别:输入
<script>alert('20232326')</script>
![image]()
![image]()
- Low级别:输入
-
点击DVWA菜单中的"XSS (Stored)"
-
在表单中输入,显示Cookie信息
![image]()
![image]()
2.6.4 CSRF攻击
在DVWA平台上完成了CSRF攻击测试。
DVWA的不同安全级别有不同的防护措施:
Low级别:没有CSRF保护
Medium级别:检查referer头部
High级别:使用token验证
验证步骤:
- 点击DVWA菜单中的"CSRF"
- 修改密码为20232326
![image]()
在登陆页面验证,成功登陆
![image]()
3.问题及解决方案
- 问题1:数据库连接失败
- 问题1解决方案:检查数据库配置信息,确认用户名、密码和数据库名称正确,并确保MySQL服务正在运行
- 问题2:XSS攻击测试时脚本未执行
- 问题2解决方案:确认使用的是不安全输出方式(innerHTML),而非安全输出方式(innerText或htmlspecialchars)
- 问题3:DVWA数据库初始化失败
- 问题3解决方案:手动创建数据库和用户,运行SQL脚本初始化表结构和数据
- 问题4:DVWA登录失败
- 问题4解决方案:确认使用正确的默认凭据(admin/password),如果仍然无法登录,尝试重置数据库或检查安全级别设置
- 问题5:login_check.php页面登录失败
- 问题5解决方案:修复了表单action属性,现在可以使用
http://localhost/test_login.php进行测试,或者继续使用http://localhost/login_check.php - 问题6:login_check.php页面始终显示用户名为'dvwa'
- 问题6解决方案:经检查发现这是由于curl命令中参数传递方式不正确导致的假象,实际通过浏览器访问页面可以正常工作。推荐使用浏览器直接访问页面进行测试,避免命令行参数传递的复杂性。
4.学习感悟、思考等
通过本次实验,我对Web安全有了更深入的理解。从前端HTML表单到后端数据库连接,再到各种安全漏洞的原理和防护措施,整个过程中我体会到了Web开发中安全的重要性。
首先,在HTML和JavaScript层面,我学会了如何构建基本的Web表单,并通过JavaScript实现客户端验证功能。同时,我也认识到了客户端验证的局限性,它只能提升用户体验,不能替代服务器端验证。更重要的是,通过XSS攻击的实践,我深刻理解了输出编码的重要性,任何用户输入的数据在输出时都应该经过适当处理,避免恶意脚本的执行。
其次,在后端开发方面,我掌握了使用PHP连接MySQL数据库的方法,以及如何进行基本的用户认证。通过实践SQL注入攻击,我认识到参数化查询对于防止SQL注入的重要性。传统的字符串拼接方式极易受到SQL注入攻击,而参数化查询可以有效避免这一问题。
最后,通过DVWA平台的实践,我系统地学习了常见的Web安全漏洞,包括SQL注入、XSS和CSRF等。每种漏洞都有其特定的攻击方式和防护措施,只有深入理解其原理,才能在开发中有效地防范这些安全威胁。
这次实验让我意识到,作为一个Web开发者,不仅要关注功能的实现,更要重视安全性。任何一个小小的疏忽都可能导致严重的安全问题。因此,在今后的开发工作中,我会更加注重安全编程规范,采取必要的防护措施,确保应用程序的安全性.


























浙公网安备 33010602011771号