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.实验过程
一.Web前端HTML
kali虚拟机上已安装Apache。先使用命令netstat -tupln | grep 80检查端口是否被占用,再用systemctl start apache2开启Apache,用systemctl status apache2.service确认服务状态。从结果中可以看出Apache正常启动。

进入kali的/var/www/html目录下,用vi 20232407lyh.html命令创建html文件


输入以下内容
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>表单示例</title><style>body {font-family: Arial, sans-serif;background-color: #f0f0f5;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.container {background-color: #fff;padding: 30px;border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);width: 400px;text-align: center;}.container img {border-radius: 50%;width: 100px;height: 100px;margin-bottom: 20px;}.container h2 {margin-bottom: 20px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input[type="text"],.form-group input[type="password"],.form-group input[type="email"],.form-group button[type="submit"] {width: 100%;padding-top: 10px;padding-bottom:10px;border: 1px solid #ccc;border-radius: 5px;}.form-group button[type="submit"] {margin-top:5px;background-color: #007BFF;color: #fff;border: none;cursor: pointer;}.form-group button[type="submit"]:hover {background-color: #0056b3;}</style>
</head>
<body><div class="container"><img src="1.jpg" alt="Profile Picture"><h2>注册表单</h2><form action="/submit-form" method="post"><div class="form-group"><label for="username">用户名</label><input type="text" id="username" name="username" required></div><div class="form-group"><label for="email">邮箱</label><input type="email" id="email" name="email" required></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" name="password" required></div><div class="form-group"><button type="submit">注册</button></div></form><p>或者通过GET方法获取数据:</p><form action="/get-data" method="get"><div class="form-group"><label for="search">搜索</label><input type="text" id="search" name="search" required><button type="submit">搜索</button></div></form></div>
</body>
</html>
该HTML文件的效果如下

二.Web前端javascipt
在2.1的基础上,删除表单的action和method属性,把注册表单改成登录表单,在登录按钮上加入onclick="submit_login()"的属性,并添加一些script代码。这一段代码会在用户登录时,验证用户名、密码的规则,并在用户成功登录后回显"欢迎+输入的用户名"。
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录表单</title><style>body {font-family: Arial, sans-serif;background-color: #f0f0f5;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.container {background-color: #fff;padding: 30px;border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);width: 400px;text-align: center;}.container img {border-radius: 50%;width: 100px;height: 100px;margin-bottom: 20px;}.container h2 {margin-bottom: 20px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input[type="text"],.form-group input[type="password"],.form-group button {width: 100%;padding-top: 10px;padding-bottom:10px;border: 1px solid #ccc;border-radius: 5px;}.form-group button {margin-top:5px;background-color: #007BFF;color: #fff;border: none;cursor: pointer;}.form-group button:hover {background-color: #0056b3;}</style><script>function submit_login() {var username = document.getElementById('username').value;var password = document.getElementById('password').value;var usernameRegex = /^.{4,}$/;var passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/;if (!usernameRegex.test(username)) {alert('用户名必须在4个字符以上');return;}if (!passwordRegex.test(password)) {alert('密码必须是6个字符以上,包含至少一个字母和一个数字');return;}document.write('欢迎 ' + username);};</script>
</head>
<body><div class="container"><img src="1.jpg" alt="Profile Picture"><h2>登录表单</h2><!-- 移除了action和method属性,改为登录表单 --><form><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><div class="form-group"><!-- 登录按钮添加了onclick事件 --><button type="button" onclick="submit_login()">登录</button></div></form><p>或者通过GET方法获取数据:</p><form action="/get-data" method="get"><div class="form-group"><label for="search">搜索</label><input type="text" id="search" name="search" required><button type="submit">搜索</button></div></form></div>
</body>
</html>
最终实现的效果如下。成功对数据进行校验,并能够返回登录结果


对于实现的页面,进行注入攻击:在用户名一栏填入<h1>HTML injection succeed.</h1>,成功实现HTML注入。


在用户名一栏填入<script type="text/javascript"> alert("JavaScript injection succeed.") </script>,成功实现JavaScript注入


三.Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
kali虚拟机自带MySQL,输入命令systemctl start mysql打开服务,输入命令systemctl status mysql确认服务已开启。从结果中可以看出MySQL正常启动

输入以下命令,完成建库、创建用户、修改密码、建表等操作
mysql
-- 创建数据库
CREATE DATABASE 20232407db;
-- 使用数据库
USE 20232407db;
-- 创建用户
CREATE USER 'user20232407' IDENTIFIED BY '050620Lyh';
-- 授予用户权限
GRANT ALL PRIVILEGES ON 20232407db.* TO 'user20232407';
FLUSH PRIVILEGES;
-- 修改用户密码
ALTER USER 'user20232407' IDENTIFIED BY '050620Lyh!';
-- 创建表
CREATE TABLE onetable (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,pwd VARCHAR(255) NOT NULL
);
-- 插入数据
INSERT INTO onetable (name, pwd) VALUES ('liuyuhang', '20232407lyh');
-- 查看表中所有内容
SELECT * FROM onetable;

四.Web后端:编写PHP网页,连接数据库,进行用户认证
在kali中输入命令apt-get install php安装php

编写以下php代码,实现连接数据库和用户认证
<?php
$host = 'localhost';
$dbname = '20232407db';
$user = 'user20232407';
$password = '050620Lyh!';//创建数据库连接
$conn = new mysqli($host, $user, $password, $dbname);//检查连接是否成功
if ($conn->connect_error) {die("数据库连接失败: " . $conn->connect_error);
}//获取POST数据
$username = $_POST['username'];
$password = $_POST['password'];//使用查询语句进行查询
$sql = "SELECT * FROM onetable WHERE name='$username' AND pwd='$password'";
$result = $conn->query($sql);//检查是否有匹配的记录
if ($result->num_rows > 0) {echo "欢迎登录成功: " . $username . "!";
} else {echo "用户名或密码错误";
}//关闭结果集和预处理语句
$result->close();
$stmt->close();//关闭数据库连接
$conn->close();
?>
在前端代码中,修改登录表单的属性如下,删除按钮的onclick属性。具体代码如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录表单</title><style>body {font-family: Arial, sans-serif;background-color: #f0f0f5;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.container {background-color: #fff;padding: 30px;border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);width: 400px;text-align: center;}.container img {border-radius: 50%;width: 100px;height: 100px;margin-bottom: 20px;}.container h2 {margin-bottom: 20px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input[type="text"],.form-group input[type="password"],.form-group button {width: 100%;padding-top: 10px;padding-bottom:10px;border: 1px solid #ccc;border-radius: 5px;}.form-group button {margin-top:5px;background-color: #007BFF;color: #fff;border: none;cursor: pointer;}.form-group button:hover {background-color: #0056b3;}</style><script>function submit_login() {var username = document.getElementById('username').value;var password = document.getElementById('password').value;var usernameRegex = /^.{4,}$/;var passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/;if (!usernameRegex.test(username)) {alert('用户名必须在4个字符以上');return;}if (!passwordRegex.test(password)) {alert('密码必须是6个字符以上,包含至少一个字母和一个数字');return;}document.write('欢迎 ' + username);};</script>
</head>
<body><div class="container"><img src="1.jpg" alt="Profile Picture"><h2>登录表单</h2><!-- 修改1:添加了action和method属性 --><form id="loginForm" action="http://localhost/20232407lyh.php" method="post"><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><div class="form-group"><!-- 修改2:删除了onclick属性 --><button type="submit">登录</button></div></form><p>或者通过GET方法获取数据:</p><form action="/get-data" method="get"><div class="form-group"><label for="search">搜索</label><input type="text" id="search" name="search" required><button type="submit">搜索</button></div></form></div>
</body>
</html>
完成上述操作后,查看实现效果。发现可以正常进行用户认证。输入正确用户名和密码的结果如下:

输入错误密码如下:

五.实现简单的SQL注入和XSS攻击
在用户名中随机输入,密码中输入' OR '1'='1,即可成功登录,实现了SQL注入


在用户名中输入<script>alert("xss atack succeed.");</script>,密码中输入' OR '1'='1,网页弹出窗口,实现了XSS攻击


六.安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击
搭建WebGoat

在网页上注册并登录

(1)完成SQL注入
-
第九个是通过注入看到表中所有用户的数据
构建查询语句的代码为
"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "'";想要查询所有用户数据,要从后面的条件入手,输入内容为
Smith' or '1'='1则查询语句为
SELECT * FROM user_data WHERE first_name = 'John' and last_name 'Smith' or '1' = '1'由于'1' = '1'永真,所以就会返回所有表的数据

-
第十个是数字型SQL注入,目的也是看到表中所有用户的数据
构建查询语句的代码如下
"SELECT * FROM user_data 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由于1=1永真,所以就会返回所有表的数据

-
第十三个是删除日志表,避免留痕
输入内容为
1'; drop table access_log; --开头的';'使得查询语句结束,之后写入完整的删表语句,并通过'--'使得后续的内容成为注释,因此就可以执行删表语句

(2)完成XSS攻击
点击左边的"Cross Site Scripting"
-
第七个是反射型XSS攻击
一共有两个提交框,所以需要测试哪个提交框可以完成攻击。分别尝试在两个框中输入,发现在第一个框中输入时会弹框,说明XSS攻击成功。

-
第十个是基于DOM的XSS攻击,需要先找到在生产过程中留在应用程序中的测试代码的路径
题目当中告诉了我们"The ‘base route’ in this case is: start.mvc#lesson",而js文件中写道“‘test/:param’: ‘testRoute’”,因此答案就是“start.mvc#test/”

-
第十一个是基于DOM的XSS攻击
使用第十节发现的route,执行如下函数,从route中反射参数webgoat.customjs.phoneHome()。
通过url在新的标签页触发,然后控制台会显示一个响应,输入响应中的随机数完成这个题。
构造如下url,访问http://127.0.0.1:8080/WebGoat/start.mvc#test/param1=foobar¶m2=DOMXSS%3Cscript%3Ewebgoat.customjs.phoneHome()%3C%2Fscript%3E

可以看到控制台已经输出了信息,提交-2091151683

(3)完成CSRF攻击(我用的DVWA)
可以看到网站的设计意图是让我们修改密码

如图所示,当我直接提交的时候,在url中出现了两个参数,一个是password_new参数,一个是password_conf参数,内容和我输入的内容是一模一样的,所以大胆猜测这个网站是不经过加密直接使用GET方法传向服务器的,我们可以直接尝试修改url


3.问题及解决方案
无
4.学习感悟、思考等
通过本次 Web 综合实验,我对前端、后端以及常见 Web 攻击方式有了系统性的理解。首先在前端部分,我掌握了 HTML 表单的结构、GET 与 POST 的区别,并利用 JavaScript 实现了对用户名和密码的简单校验,也通过回显功能体会到 DOM 操作的灵活性。同时,在尝试注入简单 HTML 与脚本代码时,更直观地认识到了 XSS 漏洞产生的根本原因。在后端部分,我完成了 MySQL 的安装、建库与建表,并通过 PHP 编写了用户登录认证程序,理解了 Web 后端与数据库交互的基本流程。随后,通过构造最简单的 SQL 注入语句,我深刻体会到不安全的字符串拼接对系统造成的危害。最后,使用 DVWA 进一步实践 SQL 注入、XSS、CSRF 等漏洞,使我对 Web 安全攻击方式、利用流程以及防护思路有了更加全面的认识。本次实验让我对 Web 安全的重要性有了更深刻的感触,也提升了实际动手能力。