20232426 2025-2026-1 《网络与系统攻防技术》实验八实验报告
Web安全
一、 实验内容
- Web前端HTML:能安装启停Apache,编写含表单的HTML网页。
- Web前端JavaScript:能用JS验证表单并回显欢迎信息,测试XSS注入。
- Web后端数据库:能安装配置MySQL,完成建库、建用户、建表操作。
- Web后端数据库连接:能用PHP连接数据库,实现用户登录认证功能。
- 基础攻击测试:能进行简单的SQL注入与XSS攻击测试。
- 安全攻防平台:安装DVWA或WebGoat平台,完成三项主要攻击实践。
二、 实验目的
通过搭建Web应用环境,实践前后端开发,并深入理解SQL注入、XSS等常见Web安全漏洞的原理与防护方法。
三、 实验过程与分析
任务一 Web前端HTML
1. Apache Web服务器的安装与配置
Apache是一款开源的Web服务器软件,广泛用于托管网站、提供Web服务和应用程序。
使用以下命令操作Kali虚拟机中自带的Apache服务:
- 启动服务:
systemctl start apache2 - 查看状态:
systemctl status apache2.service - 关闭服务:
systemctl stop apache2
若虚拟机启用了防火墙,需允许HTTP流量进出:
ufw allow 'Apache'

打开浏览器,输入localhost,若能看到Apache的欢迎页面,说明Web服务器安装成功。

2. HTML表单功能实现
进入虚拟机的/var/www/html目录,使用vi命令创建两个HTML文件,分别采用POST和GET方法提交表单信息:
- POST方法:数据在请求体中发送,不显示在URL中,安全性更高;
<!DOCTYPE html>
<html>
<head><title>GET方式登录</title><style>.login-box {width: 300px;margin: 50px auto;padding: 20px;border: 1px solid #ccc;}label {display: inline-block;width: 80px;}</style>
</head>
<body><div class="login-box"><h3>用户登录(GET方式)</h3><form action="login.php" method="GET"><label for="user">用户名:</label><input type="text" id="user" name="username" required><br><br><label for="pwd">密码:</label><input type="password" id="pwd" name="password" required><br><br><input type="submit" value="提交登录"></form></div>
</body>
</html>
- GET方法:数据拼接在URL中,可见明文用户名和密码。
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>用户登录(POST方式)</title><style>/* 简单样式优化,提升页面美观度 */* {margin: 0;padding: 0;box-sizing: border-box;}body {font-family: Arial, sans-serif;background-color: #f5f5f5;display: flex;justify-content: center;align-items: center;height: 100vh;}.login-container {background-color: white;padding: 30px 40px;border-radius: 8px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);}.login-container h2 {text-align: center;color: #333;margin-bottom: 25px;border-bottom: 2px solid #007bff;padding-bottom: 10px;}.form-group {margin-bottom: 20px;}.form-group label {display: block;color: #666;margin-bottom: 8px;font-weight: 500;}.form-group input {width: 100%;padding: 10px;border: 1px solid #ddd;border-radius: 4px;font-size: 16px;}.form-group input:focus {outline: none;border-color: #007bff;box-shadow: 0 0 0 2px rgba(0,123,255,0.25);}.submit-btn {width: 100%;padding: 12px;background-color: #007bff;color: white;border: none;border-radius: 4px;font-size: 16px;cursor: pointer;transition: background-color 0.3s;}.submit-btn:hover {background-color: #0056b3;}</style>
</head>
<body><div class="login-container"><h2>POST方式 - 用户登录</h2><!-- 核心:method="POST",数据在请求体中传输(不显示在URL) --><form action="login.php" method="POST"><div class="form-group"><label for="username">用户名:</label><!-- name属性必须与后端PHP接收的参数一致(username/password) --><input type="text" id="username" name="username" required placeholder="请输入用户名"></div><div class="form-group"><label for="password">密码:</label><input type="password" id="password" name="password" required placeholder="请输入密码"></div><button type="submit" class="submit-btn">登录</button></form></div>
</body>
</html>
表单显示效果及URL展示如下:
GET:


POST:


任务二: Web前端JavaScript
1. JavaScript表单验证功能实现
静态HTML无法实现复杂验证逻辑,此处通过JavaScript实现以下验证规则:
- 用户名与密码非空;
- 密码长度不低于8位。
JavaScript通过DOM API获取输入值并实时判断,在数据发送到服务器前提供即时反馈:
- 用户名/密码为空:在对应位置显示错误提示;
- 密码长度不足:弹出弹窗提示;
- 所有条件满足:回显用户登录信息。
验证逻辑代码及运行效果如下:



2. 注入攻击测试
由于程序未对用户输入进行安全检查或转义处理,直接将输入作为HTML一部分拼接输出,导致注入攻击风险。
(1)HTML注入
在用户名输入框中输入:<u>HTML injection succeed.</u>,其余字段满足验证条件后,文本会以带下划线的格式回显在页面,证明注入成功。

(2)JavaScript注入
在用户名输入框中输入:<img src='x' onerror='document.body.innerHTML = "JavaScript injection succeed."'>,该代码尝试加载不存在的图片x,触发onerror事件执行JavaScript,将网页body内容替换为指定文本。

任务三: Web后端MySQL
1. MySQL服务启停与状态查看
使用以下命令操作Kali虚拟机中自带的MySQL服务:
- 启动服务:
systemctl start mysql - 查看状态:
systemctl status mysql

2. 数据库基础操作
输入mysql进入数据库命令行,执行以下操作(代码及过程如图17所示):
-- 1. 创建新数据库
CREATE DATABASE db20232426;-- 2. 进入新数据库
USE db20232426;-- 3. 创建用户user1(与原语句一致)
CREATE USER 'user1' IDENTIFIED BY 'user@111';-- 4. 授予用户所有权限(改为授权给新数据库db20232426)
GRANT ALL PRIVILEGES ON db20232426.* TO 'user1'@'localhost';-- 5. 刷新权限
FLUSH PRIVILEGES;-- 6. 修改用户密码(与原语句一致,改为user@1110)
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'user@1110';-- 7. 创建表tablefirst(结构与原语句完全一致)
CREATE TABLE tablefirst (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(100) NOT NULL
);-- 8. 插入测试数据(与原语句一致,用户和密码不变)
INSERT INTO tablefirst VALUES
(1, 'user1', 'user@111'),
(2, 'user2', 'user@222');-- 9. 验证数据(查看表内容,确认创建成功)
SELECT * FROM tablefirst;

任务四: 使用PHP连接数据库实现登录认证
PHP用于处理前端提交的表单数据,实现与MySQL数据库的连接及用户认证功能,核心需求:
- 查询用户是否存在;
- 校验密码是否匹配;
- 返回登录成功/失败信息;
- 安全关闭数据库连接。
注意:后端处理程序文件名需与表单action属性一致,命名为login.php。
代码及运行效果如下:
(图18,数据库连接部分代码)

(用户存在且口令正确)

(用户存在但口令错误)

(用户不存在)
任务五: 基础攻击测试
1. SQL注入攻击
程序未对用户输入进行安全过滤,直接将表单数据拼接至SQL语句,导致攻击者可通过恶意输入改变语句执行逻辑。
(1)已知用户名场景
在密码框注入:' OR '1'='1,后端拼接后的SQL查询条件变为:
WHERE username='已知用户名' AND password='' OR '1'='1'
由于'1'='1'恒成立,WHERE子句返回值恒为真,攻击者无需正确密码即可登录。


(2)未知用户名场景
在用户名和密码栏均输入:' OR '1'='1,绕过整个身份验证逻辑,实现非法登录。


4.5.2 XSS攻击
XSS(跨站脚本)攻击通过向网页注入恶意脚本代码,在用户浏览器中执行。
在用户名输入框注入:' OR '1'='1' -- <img src=1 onerror=alert('XSS成功')>,密码框输入任意值提交。由于系统未过滤或编码输入内容,代码被直接回显至页面:浏览器尝试加载不存在的图片x,触发onerror事件执行JavaScript,弹出警告框。

任务六: WebGoat平台攻击实践
在主机安装WebGoat靶场(安装参考:https://blog.csdn.net/2302_82189125/article/details/135894689),选择WebGoat靶场完成SQL注入、XSS、CSRF三类攻击实践。
1. SQL注入攻击(A3 Injection→SQL Injection(intro)9-13题)
(1)第9题(选择题)
目标:查询表中所有数据
给出语句:SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '____ + ____+ ____';
思路:闭合前面的单引号,构造永真条件
答案:Smith';or;'1'='1

(2)第10题(填空题)
目标:查询表中所有数据
给出语句:SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;
思路:数字型注入,构造永真条件
输入:
- Login_Count:
1 - User_ID:
1 or 1=1

(3)第11题(填空题)
目标:查询表中所有数据
给出语句:SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";
思路:字符型注入,闭合引号后构造永真条件
输入方案一:
- Employee Name:
' or '1'='1 -- - TAN:
1

输入方案二:
- Employee Name:
1 - TAN:
' or '1'='1 --

(4)第12题(填空题)
目标:修改表中特定数据
给出语句:SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";
思路:闭合引号后拼接UPDATE语句
输入:
- Employee Name:
Smith' ; UPDATE employees SET salary = 99999 WHERE userid = 37648; -- - TAN:
3SL99A

(5)第13题(填空题)
目标:删除表中所有数据
推测语句:SELECT * FROM access_log WHERE name = '____';
思路:闭合引号后拼接DROP语句,用注释忽略多余引号
输入:' ; DROP TABLE access_log; --

2. XSS攻击(A3 Injection→Cross Site Scripting 7、10、11题)
(1)第7题(反射型XSS)
目标:通过XSS攻击显示弹框或打印信息
输入:<script>alert('XSS')</script>
说明:仅第一个字符型参数输入框有效,第二个数值型参数输入框无效。

(2)第10题(基于DOM的XSS)
目标:找到测试代码路径
思路:右键检查源代码,在GoatRouter.js中搜索route,发现路由规则:test/:param':'testRoute
答案:start.mvc#test/

(3)第11题(基于DOM的XSS)
目标:通过路由反射参数执行webgoat.customjs.phoneHome()
思路:利用onerror事件执行JavaScript,构造URL:
http://127.0.0.1:8080/WebGoat/start.mvc#test/<img src=x onerror="webgoat.customjs.phoneHome()">
结果:控制台显示随机数672491635。


3. CSRF攻击(A10 Server-side Request Forgery 3、4、7、8题)
仅完成第8题(其余题目因环境问题未解决):
题目场景:模拟登录CSRF攻击
攻击步骤:
- 创建恶意账号(格式:
csrf-用户名); - 保持原账号登录状态,登录恶意账号;
- 回到原账号点击按钮,原账号浏览器会接收恶意账号的Session Cookie,覆盖原有登录状态;
- 原账号后续操作均在恶意账号下执行,攻击者可查看其行为。
(图33,CSRF攻击题目八创建恶意账号)
(图34,CSRF攻击题目八回到原账号提交)
5. 问题及解决
问题一:XSS攻击<script>标签注入失效
- 现象:输入
<script>alert("XSS攻击成功!");</script>后,无弹框且未回显用户名,仅显示欢迎信息。 - 原因:现代浏览器为防止XSS攻击,会拦截通过
innerHTML插入的<script>标签执行。 - 解决:使用
<img>标签的onerror事件绕过防护,输入:<img src=x onerror=alert("XSS攻击成功!")>,图像加载失败时触发事件执行JavaScript。
问题二:PHP连接数据库无验证提示信息
- 现象:输入正确/错误的用户名密码,仅页面跳转,无任何提示。
- 原因:前后端字段名不一致,前端表单字段为
username和password,后端PHP代码获取name和pwd字段,导致无法接收数据。 - 解决:修改PHP代码,使字段名与前端保持一致。
6. 心得体会
本次实验围绕Web安全核心漏洞展开,涵盖前后端开发、SQL注入、XSS攻击、CSRF攻击及WebGoat平台实践,让我对Web攻防逻辑有了直观认识。
实验过程中遇到较多挑战:XSS攻击初期因浏览器默认防护机制未成功,通过查阅资料采用onerror事件绕过;CSRF攻击因BurpSuite安装失败、网络环境异常,仅完成部分题目,暴露了我在工具使用和环境配置上的不足。
通过实践发现,Web攻击的实际实施难度远超理论学习,现代浏览器、框架的安全防护机制进一步增加了攻击门槛。同时,我也深刻体会到,Web安全的核心在于“输入验证”和“输出编码”,任何未过滤的用户输入都可能成为漏洞入口。
八次实验虽已结束,但我仅触及网络攻防技术的冰山一角。未来还需深入学习漏洞原理、防护机制及工具使用,不断提升实践能力,才能在网络安全领域稳步前行。