20232415 2025-2026-1 《网络与系统攻防技术》实验八实验报告

1.实验内容

1.1 Web 前端(HTML):掌握 Apache 服务的安装、启动与停止操作,能够编写包含表单的 HTML 网页。
1.2 Web 前端(JavaScript):运用 JavaScript 实现表单数据验证,完成欢迎信息回显功能,并开展 XSS 注入测试。
1.3 Web 后端(数据库):完成 MySQL 的安装与配置,熟练执行数据库、用户、数据表的创建操作。
1.4 Web 后端(数据库交互):通过 PHP 实现与 MySQL 数据库的连接,开发用户登录认证功能。
1.5 基础安全测试:开展简单的 SQL 注入与 XSS 跨站脚本攻击测试实践。
1.6 安全攻防平台实操:部署 DVWA 或 WebGoat 安全攻防平台,完成至少三项核心攻击场景的实践操作。

2.实验目的

搭建 Web 应用运行环境,完成前后端开发实操,深度理解 SQL 注入、XSS 等典型 Web 安全漏洞的底层原理,并掌握对应的防护手段。

3.实验环境

安装Kali镜像的VMware虚拟机

4.实验过程与分析

4.1 Web前端HTML

4.1.1 Apache Web服务器的安装与配置

在 Kali 虚拟机中,可通过以下命令管理自带的 Apache 服务:
启动服务:执行systemctl start apache2
查看运行状态:执行systemctl status apache2.service
停止服务:执行systemctl stop apache2
此外,若虚拟机已安装并启用防火墙,需额外执行ufw allow 'Apache'命令,放行 Apache 对应的 HTTP 流量,确保服务正常对外提供访问。

image

打开浏览器,在地址栏输入 localhost 并访问。若页面显示 Apache 的默认欢迎页面,则表明 Kali 虚拟机中的 Apache Web 服务器已安装并正常运行。

image

4.1.2 HTML表单功能实现

进入 Kali 虚拟机的/var/www/html目录,通过vi命令创建两个HTML文件,分别实现基于POST和GET方法的表单信息提交功能。

GET方法会将表单数据拼接在URL中明文展示,可直接看到用户名、密码等敏感信息。

image

image

image

POST方法会将表单数据封装在HTTP请求体中传输,不会在URL中暴露,安全性更高。

image

image

image

4.2 Web前端 JavaScript

4.2.2 JavaScript表单功能实现

静态HTML不具备复杂逻辑验证能力,为满足“用户名与密码非空”“密码长度不少于8位”的验证规则,需通过JavaScript实现基础表单验证逻辑。该逻辑可在表单数据提交至服务器前,借助DOM API获取输入框的内容并执行条件判断,从而向用户提供即时的验证反馈。

用户点击登录按钮后,程序将校验输入内容:若用户名或密码为空,会在对应输入框旁展示错误提示;若密码长度未达要求,将弹出弹窗提示错误信息;若所有验证条件均满足,则在页面中回显用户的登录信息。

image

image

image

image

4.2.2 注入攻击

(1)利用回显用户名注入HTML

因程序未对用户输入内容进行安全校验或转义处理,直接将输入内容拼接为HTML代码的一部分输出至页面,这一逻辑缺陷会导致注入攻击漏洞产生。

在用户名输入框中输入恶意内容:<u>HTML injection succeed.</u>。若其他表单字段均满足前端验证规则,该输入内容会被直接回显到页面中,且 “HTML injection succeed.” 会以带下划线的样式呈现,验证了HTML注入攻击的成功触发。

image

在用户名输入框中输入恶意载荷:<img src='x ' onerror='document.body.inner HTML = "JavaScript injection succeed."'>该代码逻辑为:尝试加载一个名为 “x” 的图片资源,因该图片不存在,会触发onerror错误事件;事件触发后执行内嵌的 JavaScript 代码,将网页标签内的所有内容替换为 “JavaScript injection succeed.”,以此完成 JavaScript 注入攻击验证。

image

4.3 Web后端MySQL

在 Kali 虚拟机中,可通过systemctl start mysql命令启动内置的MySQL服务;
执行systemctl status mysql命令,能够查看该服务的运行状态。

image

执行mysql命令进入 MySQL 交互式终端后,可依次完成系列数据库操作:创建数据库、新建数据库用户并为其分配权限,以及数据表的创建、测试数据的插入与查询验证等操作。

CREATE DATABASE db20232415; 

USE db20232415; 

CREATE USER 'SHM' IDENTIFIED BY 'password'; 

GRANT ALL PRIVILEGES ON db20232415.* TO 'SHM'; 

FLUSH PRIVILEGES; 

ALTER USER 'SHM' IDENTIFIED BY 'real password'; 

CREATE TABLE table_1 (

id INT AUTO_INCREMENT PRIMARY KEY,

username VARCHAR(50) NOT NULL,

password VARCHAR(100) NOT NULL

); 

INSERT INTO table_1 VALUES (1,'user_1', 'password_1'),(2,'user2', 'password_2'); 

SELECT * FROM table_1; 

image

4.4 使用PHP连接数据库

PHP作为后端开发语言,主要用于处理前端表单提交的数据。本环节需通过PHP编写代码,实现与MySQL数据库的连接,并完成用户登录认证功能。
该PHP代码需实现以下核心逻辑:查询数据库中是否存在该用户、校验用户输入的密码与数据库中存储的密码是否匹配;最终根据认证结果返回登录成功或失败的提示信息,且操作完成后需安全关闭数据库连接。
为保证表单数据能够正确提交至后端处理程序,后端PHP文件的命名需与前端表单action属性指定的名称保持一致,即命名为login.php。

eeb9b3632c3e5bcf8a067779b33cebc0

访问搭建的 Web 网站并测试登录功能,系统根据数据库校验结果返回反馈:
若用户名与密码均匹配数据库中存储的信息,页面返回 “欢迎信息+登录用户名”;
若用户名存在但密码错误,页面提示 “口令错误”;
若用户名未在数据库中注册,页面给出 “用户不存在” 的提示信息。

13d7630d5e59fd856403c188d0b2e19e

099c92ae41c420edca993c2c49e29c54

25f1d7bf43616d963cae78698b845d8e

4.5 基础攻击测试

4.5.1 SQL注入

因程序未对用户输入内容执行任何安全过滤操作,直接将前端表单提交的数据拼接至 SQL 查询语句中,这一逻辑缺陷导致攻击者可通过恶意输入篡改原 SQL 语句的执行逻辑。
当攻击者已知目标用户名时,可在密码输入框中注入恶意字符串:' OR '1'='1。此时后端拼接生成的SQL查询条件会发生篡改——原本用于验证特定密码的条件,被修改为AND pwd='' OR '1'='1'。由于'1'='1'是恒成立的逻辑表达式,整个WHERE子句的返回值始终为真,最终导致攻击者无需正确密码即可完成登录认证。

3931833b668970d86f15dfd400b50c4d

即便攻击者未掌握合法的用户账号,仍可在用户名和密码输入框中均输入' OR '1'='1这类恒成立的逻辑条件。该操作会篡改SQL查询的验证逻辑,使其绕过完整的身份认证流程,最终实现非法登录。

cc480395c22c25991f42d1387d10c26a

4.6使用WebGoat平台,并完成SQL注入、XSS、CSRF攻击

在主机环境中完成 WebGoat 靶场的安装部署

4.6.1完成SQL注入攻击

该部分需要完成(A3)Injection→SQL Injection(intro)部分的9-13题。

(1)第九题
本题要求借助SQL注入技术,实现对user_data表中全部数据的查询操作。
题目提供的基础SQL语句为:SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '____ + ____+ ____';
这是一道选择题,要达成查询表中所有数据的目标,核心在于两点:一是构造永真条件让WHERE子句始终成立,二是闭合语句中字符串比较时的单引号以保证注入逻辑生效。基于此,需要选择的三个注入值依次为Smith'、or、'1'='1。
具体逻辑为:Smith'先闭合last_name对应的单引号,使后续注入的 SQL 语句脱离字符串包裹;or作为逻辑运算符,用于衔接永真条件;'1'='1是恒成立的字符串比较条件,最终让查询语句返回表中所有数据。

09df4bf47a5e8be6e07db6d504bab15d

(2)第十题
本题需通过SQL注入方式查询user_data表中的全部数据,题目给出的基础SQL语句为:SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;
这是一道填空题,需填写Login_Count和User_ID两个参数的值。要实现查询表中所有数据的目标,核心是在其中一个参数里构造永真条件,使WHERE子句的判断结果始终为真。
基于此,我采用的注入思路是:在Login_Count位置填入任意有效值,在User_ID参数后拼接数字型的永真条件(因该参数为数字类型,无需处理单引号闭合)。最终填写的具体数据如下:
Login_Count:1(任意有效数字均可)
User_ID:1 or 1=1(通过拼接or 1=1构造永真条件,让整个WHERE子句成立,从而返回表中所有数据)

1354b78f60c4fd83873fcbedf8fe48ba

(3)第十一题
本题的目标是通过SQL注入查询employees表中的全部数据,题目给出的基础SQL语句为:SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";
本题为填空题,需填写name(对应 Employee Name)和auth_tan(对应 TAN)两个参数的值。要实现查询表中所有数据的目的,关键是在其中一个参数中构造永真条件,且因参数被单引号包裹(字符型参数),需先闭合引号再拼接永真条件。
我采用的注入策略是:在name位置填入任意有效值,在auth_tan参数中先闭合单引号,再拼接字符型永真条件。最终填写的具体内容如下:
Employee Name:1(任意字符 / 数字均可)
TAN:' or '1'='1(先通过单引号闭合auth_tan原有的引号包裹,再拼接or '1'='1'构造永真条件,使整个WHERE子句恒成立,从而返回表中所有数据)

aa8f18d7eeb9e799891b2257dc837a9a

(4)第十二题
本题需通过SQL注入实现对employees表中特定数据的修改操作,题目给出的基础SQL语句为:SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";
本题为填空题,需填写name(对应 Employee Name)和auth_tan(对应 TAN)两个参数的值。要实现修改表中特定数据的目标,核心思路是:在第一个参数中指定待修改记录的主键/关键标识,第二个参数先配合第一个参数唯一锁定该记录,再拼接数据更新的 SQL 语句。
基于此,我采用的注入策略是:在name位置填入待修改记录的姓氏标识,在auth_tan参数中先补充匹配该记录的 TAN 值以锁定目标,再通过闭合引号、拼接UPDATE语句实现数据修改。最终填写的具体内容如下:
Employee Name:Smith(指定待修改记录的last_name,作为定位目标数据的关键标识)
TAN:3SL99A'; UPDATE employees SET SALARY = 100000 WHERE LAST_NAME = 'Smith(先通过3SL99A'闭合auth_tan原有的单引号,再拼接UPDATE语句,将last_name为 Smith 的员工薪资修改为 100000,实现特定数据的修改)

3e3930ab19fced77a3f5cff5f6958e8c

(5)第十三题
本题需通过SQL注入完成对数据表的删除操作。结合预先输入测试数据的推测,题目所用的基础SQL语句为:SELECT * FROM access_log WHERE name = '____';
要实现删除access_log表中全部数据(实际为删除整张表)的目标,核心思路是先闭合原有SQL语句的单引号,再拼接删除表的SQL语句,同时处理语句末尾多余的单引号以避免语法错误。
基于此,我填写的注入数据为:1'; drop table access_log; --。具体逻辑如下:
1':先闭合name参数对应的单引号,使后续拼接的 SQL 语句脱离字符串包裹并生效;
drop table access_log;:拼接删除表的核心语句,执行整张表的删除操作;
--:添加 SQL 注释符,注释掉原有语句末尾多余的单引号,避免因语法错误导致注入失败。

dbf5e5261701efe399eaa0e3eb931995

4.6.2完成XSS攻击

该部分需要完成(A3)Injection→Cross Site Scripting部分的7、10、11题。

(1)第七题
本题的核心目标是利用反射型XSS攻击实现弹框提示或终端信息打印效果。
测试过程中,我先后在两个输入框中尝试输入 JavaScript 注入代码:<script>alert('xss attack succeed')</script>。经验证发现,仅在第一个输入框中输入该代码时攻击生效,能够成功触发弹框;第二个输入框输入后无效果。
分析原因推测:第一个输入框对应的是字符型参数,可直接解析并执行嵌入的JavaScript代码;而第二个输入框要求传入数值型参数,注入的脚本代码因参数类型不匹配无法被执行。

b9ac0f9e799880af316cd523d7132d80

(2)第十题
本题需利用基于DOM的XSS攻击完成作答,核心前提是找到应用程序生产阶段残留的测试代码对应的路径。
题目中不仅给出了示例参考,还提供了关键提示:这类路径信息通常存在于路由信息中,并给出了格式指引,同时建议从JavaScript代码中定位答案。
具体排查步骤如下:
右键点击页面并选择 “检查”,打开开发者工具查看页面源代码;
遍历所有以.js 为后缀的文件,通过全局搜索 “route” 关键词缩小范围;
最终在 GoatRouter.js 文件中发现核心路由信息,包括:
Lesson/:name':'lessonRoute'
'test/:param':'testRoute'
该内容与题干示例的格式高度吻合,据此合理推断目标路径为start.mvc#test/,验证后确认该答案正确。

b29ee766ffacaf2482e354254c684976

(3)第十一题
本题为基于DOM的XSS攻击题型,要求从路由(route)中反射参数webgoat.customjs.phoneHome(),并使控制台输出一个响应随机数。
解题的核心思路是:复用上一题中找到的测试路径,构造可执行webgoat.customjs.phoneHome()的 JavaScript 注入代码。
我采用的注入方式为:利用图像元素()的onerror事件处理器触发 JavaScript 代码执行(当的src地址无效时,onerror事件会被触发)。具体操作是在 URL 中输入以下内容:http://127.0.0.1:8080/WebGoat/start.mvc#test/<img src=x onerror="webgoat.customjs.phoneHome()">
该 URL 结合了上一题定位的测试路径start.mvc#test/,并通过的构造,在 DOM 解析时触发webgoat.customjs.phoneHome()方法执行。最终控制台成功输出响应的随机数-1599314974,完成题目要求。

4099bb49c9a39e39dc792e95bb2983a8

4.6.3完成CSRF攻击

该部分需要完成(A10)Server-side Request Forgery部分的第8题。

本题是登录场景的跨站请求伪造CSRF攻击模拟,用户需以攻击者身份完成攻击
攻击者需先创建符合规则的恶意账号,账号命名需遵循 “csrf-用户名” 格式;
保持受害者原账号在浏览器中的登录状态不变,同时使用该浏览器登录新建的恶意账号;
操作返回原账号对应的页面,并触发指定按钮的点击操作。

92fd64a1aa77de1a0acf9cad5a1336d1

7d3340defd71ed39d36732c3c5f2efac

5.问题及解决
问题一:
编译安装WebGoat靶场时使用命令java -Dfile.encoding=UTF-8 -jar webgoat-2023.5.jar显示“错误: 找不到或无法加载主类 .encoding=UTF-8”。

83cd41711ec552919c26c888f180c190

解决一:
这是在执行 Java 命令时参数使用错误,导致 JVM 把配置编码的参数 -Dfile.encoding=UTF-8 误当作主类名来尝试加载,从而抛出找不到或无法加载主类的异常。
加上双引号java "-Dfile.encoding=UTF-8" -jar webgoat-2023.5.jar即可编译成功

image

6.心得体会

本次Web安全相关实验涵盖了从Web应用开发到安全攻防测试的全流程,通过亲手搭建环境、编写代码、实施攻击与防御验证,我不仅夯实了Web开发的基础技能,更对典型Web安全漏洞的原理与危害有了直观且深刻的认知,收获颇丰。
在Web前后端开发环节,我系统掌握了Apache服务与MySQL数据库的安装、配置与管理,通过编写 HTML 表单并结合JavaScript实现数据验证,清晰理解了GET与POST两种请求方式的差异——GET方法明文传输数据的特性使其不适用于敏感信息提交,而POST方法将数据封装在请求体中,安全性更优。后续通过PHP实现与MySQL的连接及用户登录认证功能,我深刻体会到前后端数据交互的核心逻辑,也意识到后端代码的严谨性直接影响应用的安全性,为后续安全测试环节埋下了认知伏笔。
安全攻击测试与WebGoat靶场实操是本次实验的核心亮点。在基础攻击测试中,当通过简单的' OR '1'='1注入字符串即可绕过登录认证时,我真切感受到SQL注入漏洞的危险性——仅仅因为未对用户输入进行过滤,就可能导致数据库数据被非法访问。而XSS攻击的实践则让我明白,前端代码若直接将用户输入回显至页面而不做转义处理,攻击者便可注入恶意脚本,窃取用户信息或篡改页面内容。在WebGoat靶场中,从SQL注入的永真条件构造、单引号闭合,到DOM型XSS的路由路径查找与脚本注入,再到CSRF攻击的登录态篡改,每一道题目的解决过程都是对漏洞原理的深度拆解。尤其是在完成SQL注入修改数据表数据、删除表操作时,我深刻认识到这类漏洞若被恶意利用,可能给系统带来严重的打击。

posted @ 2025-12-01 19:52  20232415孙鸿淼  阅读(10)  评论(0)    收藏  举报