1.实验内容
1.1Web前端HTML。能安装启停Apache,编写含表单的HTML网页。
1.2Web前端javascipt。能用JS验证表单并回显欢迎信息,测试XSS注入。1.3Web后端数据库。能安装配置MySQL,完成建库建用户建表操作。1.4Web后端数据库连接。能用PHP连接数据库,实现用户登录认证功能。1.5基础攻击测试。能进行简单的SQL注入与XSS攻击测试。1.6安全攻防平台。安装DVWA或WebGoat平台,完成三项主要攻击实践。
2.实验目的
通过搭建Web应用环境,实践前后端开发,并深入理解SQL注入、XSS等常见Web安全漏洞的原理与防护方法。
3.实验环境
安装Kali镜像的VMware虚拟机
4.实验过程
4.1 Web前端HTM
在虚拟机中输入systemctl start apache2,启动Kali中自带的Apache服务,输入systemctl enable apache2,设置Apache服务开机自启,可以通过systemctl status apache2.service来确认Apache服务的状态。

在kali的浏览器中输入localhost,可以看到Apache的欢迎页面,说明Apache服务启动成功。

进入/var/www/html目录下,创建两个简单的提交表单信息的HTML文件,分别采用GET方法和POST方法。


打开浏览器验证


4.2 Web前端javascipt
修改4.1中采用GET方法的提交表单信息的HTML文件,编写JavaScript验证用户名、密码的规则。
<div id="message"></div><script>document.getElementById('loginForm').addEventListener('submit', function(event) {event.preventDefault(); // 阻止表单默认提交var username = document.getElementById('username').value.trim(); // 去除首尾空格var password = document.getElementById('password').value;// 用户名验证:不能为空if (username === '') {document.getElementById('message').innerHTML = '用户名不能为空';document.getElementById('message').style.color = 'red';return;}// 密码验证:6-30个字符,至少包含一个字母和一个数字var passwordRegex = /^(?=.*[A-Za-z])(?=.*\d).{6,30}$/;if (!passwordRegex.test(password)) {document.getElementById('message').innerHTML = '密码必须为6-30个字符,且包含字母和数字';document.getElementById('message').style.color = 'red';return;}document.getElementById('message').innerHTML = '欢迎 ' + username + '!';document.getElementById('message').style.color = 'black';});
</script>
尝试注入攻击:利用回显用户名注入HTML及JavaScript:
在用户名一栏输入HACKED,将显示显示红色、大字体的"HACKED",而不是正常用户名,说明HTML注入攻击成功。

在用户名一栏输入,进行事件处理器攻击,因为图片加载失败,触发onerror事件,执行JavaScript,弹出弹窗,JavaScript注入攻击成功。

4.3 Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
输入systemctl start mysql启动MySQL,并通过systemctl status mysql确认已启动。

输入以下内容,进行建库、创建用户、修改密码、建表
sudo mysql -u root -p
-- 创建数据库
CREATE DATABASE db_20232412;
-- 查看所有数据库
SHOW DATABASES;
-- 使用创建的数据库
USE db_20232412;
-- 创建用户
CREATE USER 'user_20232412'@'localhost' IDENTIFIED BY '20232412';
-- 查看用户
SELECT user, host FROM mysql.user;
-- 授予用户对数据库的所有权限
GRANT ALL PRIVILEGES ON db_20232412.* TO 'user_20232412'@'localhost';
FLUSH PRIVILEGES;
-- 使用ALTER USER修改密码
ALTER USER 'user_20232412'@'localhost' IDENTIFIED BY 'NewPassword20232412';
-- 创建学生表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id VARCHAR(20) NOT NULL,
name VARCHAR(50) NOT NULL,
age INT,
class VARCHAR(50)
);
-- 插入学生数据
INSERT INTO students (student_id, name, age, class) VALUES
('111', '张三', 20, '一班'),
('222', '李四', 21, '二班'),
('333', '王五', 19, '三班');
-- 查看所有表
SHOW TABLES;
-- 查询数据
SELECT * FROM students;
创建数据库配置文件check.php
根据2.2中的HTML文件,将action属性改为PHP文件路径,新建login.html
<script>function validateForm() {const username = document.getElementById('username').value.trim();const password = document.getElementById('password').value;// 用户名验证:不能为空if (username === '') {alert('错误:用户名不能为空!');document.getElementById('username').focus();return false; }// 密码验证:长度6-30个字符if (password.length < 6 || password.length > 30) {alert('错误:密码长度必须为6-30个字符!');document.getElementById('password').focus();return false; }// 密码验证:至少包含一个字母和一个数字const hasLetter = /[a-zA-Z]/.test(password);const hasNumber = /\d/.test(password);if (!hasLetter || !hasNumber) {alert('错误:密码必须包含至少一个字母和一个数字!');document.getElementById('password').focus();return false;}// 所有验证通过alert('验证通过,正在提交表单...');return true;}
</script>
输入的用户名和密码符合规范,能弹出弹窗,用户名和密码正确时,能正确回显“欢迎+输入的用户名”

输入错误时,会提示错误

4.4 最简单的SQL注入,XSS攻击测试
在登录表单中尝试以下输入用户名:,密码为' OR '1'='1,网页弹出窗口实现简单的XSS攻击。

4.5安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击
在主机上安装dvwa,默认用户名和密码是admin和password,在DVWA Security中将难度改为Low。
