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

20232424 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 Web服务器的安装与配置

 此处需要使用Apache服务

Apache支持静态资源托管、动态内容解析(搭配 PHP/Python 等)、虚拟主机、负载均衡、URL 重写等核心 Web 服务需求

 输入命令启动Kali虚拟机Apache服务

systemctl start apache2
systemctl start apache2.service
systemctl status apache2.service #查看Apache状态

打开apache

 打开浏览器,输入localhost验证:Apache成功启动
localhost

2.1.2 HTML表单功能实现

 终端输入cd var/www/html,进入该目录,分别创建使用GET方法和使用POST方法提交表单的html文件

GET与POST是HTTP协议中两种核心表单提交方法,核心区别在于:GET将数据拼接在URL末尾传输,受长度限制、易暴露、可缓存,适用于查询/获取非敏感数据(如搜索、分页)且具有幂等性;POST将数据封装在请求体中,无明确长度限制、相对安全(需配合HTTPS保障敏感数据安全)、不缓存,适用于提交/修改数据(如登录、注册、文件上传)且非幂等

 如图,使用GET方法可以看到用户明文输入的用户名与邮箱:
get表单

 如图,使用POST方法无法看到明文数据:
post表单

2.2 Web前端 JavaScript

2.2.1 JavaScript表单功能实现

 编写一个HTML文件,添加验证用户名、密码的规则
image

 规则验证(用户名不为空且密码长度不少于6位):
用户名密码验证

2.2.2 注入攻击

 利用回显用户名注入HTML
注入成功-1

<h1 style="color:red;">你的页面被我篡改了!</h1>
注入红色

 注入图片
<img src="https://picsum.photos/200/100" alt="注入的图片" style="border:2px solid red;">
注入图片

 注入恶意网站
<a href="https://恶意网站.com" style="color:blue; font-size:18px;">点击领取100元红包</a>
注入恶意网站
 跳转(网站并不存在)
恶意跳转

2.3 Web后端MySQL

 输入命令systemctl start mysql启动MySQL
开启mysql

 输入mysql进入数据库,进行创建步骤

CREATE DATABASE db20232424; #创建数据库
USE db20232424; 进入数据库
CREATE USER 'user1' IDENTIFIED BY 'user@111'; #创建用户
GRANT ALL PRIVILEGES ON db20232409.* TO 'user1'; #授予用户所有权限
FLUSH PRIVILEGES; #刷新权限
ALTER USER 'user1' IDENTIFIED BY 'user@1110'; #修改用户密码

CREATE TABLE tablefirst (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL
); #创建表

INSERT INTO tablefirst VALUES (1,'user1', 'user@111'),(2,'user2', 'user@222'); #插入数据

SELECT * FROM tablefirst查看表内容:
查看表

2.4 使用PHP连接数据库

 编写一个login.php用于连接数据库
image
image

 再编写一个HTML文件作为后端验证通过后的跳转页面,命名为success.html

 尝试登录:
登录1
 成功跳转:
跳转

 用户名与密码验证
用户名错误
密码错误

2.5 基础攻击测试

2.5.1 SQL注入

 万能密码注入,输入test01' OR '1'='1' #
万能密码注入
 成功登录:
image

2.5.2 XSS攻击

 此处进行存储型XSS攻击,将tablefirst表第一条记录的username字段设置为<script>alert("存储型XSS成功!")</script>,此时使用其他用户登录成功后,由于没有使用htmlspecialchars()等转义函数,页面直接将数据库中的内容输出到了HTML中,浏览器会把<script>标签识别为合法的脚本代码,并自动执行其中的alert()语句
image

存储型XSS的本质是:恶意脚本被持久化存储到数据库中,当页面后续读取该数据并直接输出到 HTML(未做转义处理)时,脚本会被浏览器执行。

image

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

 环境准备:需要安装webgoat靶场,安装教程参考:https://blog.csdn.net/2302_82189125/article/details/135894689

2.6.1 SQL注入攻击

 进入靶场后找到左侧导航栏(A3 Injection)-> SQL Injection(intro),完成题目9-13

 ①题目9
 题目语句拼接后得到SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or 1=1
 此时1=1是恒成立的条件,使得整个WHERE子句逻辑变为 “真”,因此查询会返回user_data表中的所有数据,而非仅匹配John且lastName为Smith的记录。
image

 ②题目10
 题目说明“仅一个字段可注入”,需构造输入使WHERE子句恒成立:原查询逻辑为:WHERE login_count = Login_Count AND userid = User_ID需通过注入使条件变为“永真”,同时注释掉后续条件。
 在Login_Count栏填1,在userid填1 OR 1=1 --,拼接后的查询语句为SELECT * FROM user_data WHERE login_count = 1 and userid = 1 OR 1=1 -- ,此时WHERE子句条件恒为真,因此返回表中所有数据。

image

 ③题目11
 该题目场景:员工 John Smith 通过系统注入获取所有同事的薪资数据,系统原查询为字符串拼接形式:SELECT * FROM employees WHERE last_name = '' + name + '' AND auth_tan = '' + auth_tan + '';,特征:last_name(员工姓名)、auth_tan(认证码)均为字符串参数,查询通过单引号包裹用户输入后直接拼接,无输入过滤,存在字符串 SQL 注入漏洞
 注入输入:Employee Name填入1;Authentication TAN填入' or '1'='1,拼接后的恶意查询为SELECT * FROM employees WHERE last_name = '1' AND auth_tan = '' or '1'='1';,'闭合了原查询中auth_tan的单引号;
 or '1'='1引入恒真条件('1'='1是永真表达式),使整个WHERE子句结果为真;最终查询会返回employees表的所有数据,无需匹配特定姓名或认证码

image

 ④题目12
 原查询"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";
 注入输入Employee Name:Smith;Authentication TAN :1'; UPDATE employees SET SALARY = 999999 WHERE LAST_NAME = 'Smith'; --
 最终输入为SELECT * FROM employees WHERE last_name = 'Smith' AND auth_tan = '1'; UPDATE employees SET SALARY = 999999 WHERE LAST_NAME = 'Smith'; --',执行后,John Smith 的薪资被修改为 999999(成为最高薪资),数据完整性被非法破坏

image

 ⑤题目13
 该题目要求删除日志表,避免留痕
 输入1'; drop table access_log; --,开头的';'使得查询语句结束,之后写入删除表语句,并通过'--'注释后续内容,执行删表语句

image

2.6.2 完成XSS攻击

 完成(A3)Injection→Cross Site Scripting的7、10、11题

 ①题目7
 该题目为反射型XSS攻击,分别尝试在两个框中输入,发现只有在第一个框内输入时才能攻击成功
image

 ②题目10
 这个题是基于DOM的XSS攻击,要找到在生产过程中留在应用程序中的测试代码的路径。
 题目说明"The ‘base route’ in this case is: start.mvc#lesson",js文件中有“‘test/:param’: ‘testRoute’”,因此答案为“start.mvc#test/”。

image

 ③题目11
 该题是基于DOM的XSS攻击,需要从route中反射参数webgoat.customjs.phoneHome(),给出控制台显示一个响应的随机数。构造URL并访问:http://127.0.0.1:8080/WebGoat/start.mvc#test/param1=foobar&param2=DOMXSS<script>webgoat.customjs.phoneHome()<%2Fscript>,可以看到控制台给出了随机数“1443434745”,返回题目页面提交,成功

image
image

2.6.3 完成CSRF攻击

 ①题目3
 CSRF攻击是利用用户已登录的身份,诱导用户访问恶意页面,从而以用户身份执行非预期操作。在此练习中,目标是构造外部请求触发“提交”操作,获取flag后在下方验证。首先获取提交查询处的HTML代码,编写为html文件
image
image
 使用浏览器打开该html文件,点击提交,获取到flag:2984,题目三完成。
image
image

3.问题及解决方案

  • 问题1:在做简单SQL注入时,我想测试万能登录test01' OR '1'='1' -- ,但一直注入失败,即便在--后加空格也无法成功
  • 问题1解决方案:将命令改为test01' OR '1'='1' #

# 注释符:在 MySQL 中,#是单行注释符,无论其后是否有空格,都会直接注释掉该行剩余的所有内容,语法要求宽松。

-- 注释符:在 MySQL 中,--作为单行注释符时,后面必须紧跟一个空格(否则数据库会将--识别为普通字符,而非注释标识),语法要求严格。

  • 问题2:在webgoat靶场测试CSRF攻击的题目3时,burpsuite无法正确抓包
  • 问题2解决方案:问题的原因可能是webgoat占用了burpsuite用作代理的8080端口,导致burpsuite无法抓包。解决方法是改用“构造外部请求触发‘提交’操作,获取flag”。

4.学习感悟、思考等

 本次实验让我对 Web 攻防有了直观且深刻的认知,既夯实了技术基础,也建立了强烈的安全意识。
 实验中,从 Apache、MySQL 的配置到 PHP 数据库连接,我掌握了 Web 前后端开发的核心流程,更通过 SQL 注入、XSS、CSRF 等攻防实践,看清了安全隐患的本质。SQL 注入时,--与#注释符的语法差异让我明白细节对攻击效果的影响,而注入成功篡改数据的场景,让我直观感受其对数据机密性和完整性的威胁;XSS 与 CSRF 的实践则让我知晓,未过滤的输入、未验证的请求都可能成为攻击突破口。
 实验中解决端口冲突、代码语法错误等问题的过程,锻炼了我的问题排查能力。更重要的是,我深刻认识到,网络安全藏在每一处细节里,开发时的微小疏忽都可能酿成大错。未来,我会将安全意识贯穿开发全流程,重视输入过滤、参数化查询等防护措施,持续提升攻防能力。

参考资料

20232409 2025-2026-1 《网络与系统攻防技术》实验八实验报告
如何搭建 WebGoat 靶场保姆级教程(附链接)

posted @ 2025-12-07 20:45  20232424陈鹏宇  阅读(18)  评论(0)    收藏  举报