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

1.实验内容

  1. Web前端 - HTML基础
  2. Web前端 - JavaScript与DOM
  3. Web后端 - MySQL基础
  4. Web后端 - PHP与数据库连接
  5. 基本安全攻击实践
  6. 综合安全平台实战

2.实验过程

1.建立Web前端html。

(1)启动Apache。使用命令systemctl start apache2打开Apache服务,并使用命令ufw allow 'Apache'允许Apache流量进出防火墙。在浏览器中输入localhost进入Apache默认网页确定服务。

image
image
image

(2)编写简单的登录html网页。进入/var/www/html目录创建html文件,分别是login-get.html,login-post.html,submit-get.html,submit-post.html。用以对比get方法和post方法登录的区别。表单代码及结果如下。

    <form action="submit-get.html" method="get">
        <div>
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <br>
        <div>
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <br>
        <div>
            <input type="submit" value="登录">
            <input type="reset" value="重置">
        </div>
    </form>
 <form action="submit-post.html" method="post">
        <div>
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <br>
        <div>
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <br>
        <div>
            <input type="submit" value="登录">
            <input type="reset" value="重置">
        </div>
    </form>

image
image
image
image

2.插入Web前端javascipt。

(1)加入javascipt重新编写html,命名为login.html。javascipt验证规则代码及结果如下。

            // 获取输入值
            const username = document.getElementById('username').value.trim();
            const password = document.getElementById('password').value;
            const messageDiv = document.getElementById('message');
            
            // 验证用户名非空
            if (!username) {
                messageDiv.innerHTML = "错误:用户名不能为空";
                messageDiv.style.color = "red";
                return;
            }
            
            // 验证密码非空
            if (!password) {
                messageDiv.innerHTML = "错误:密码不能为空";
                messageDiv.style.color = "red";
                return;
            }
            
            // 验证密码长度至少6位
            if (password.length < 6) {
                messageDiv.innerHTML = "错误:密码至少需要6位";
                messageDiv.style.color = "red";
                return;
            }
            
            // 验证密码包含大小写字母和数字
            const hasUpperCase = /[A-Z]/.test(password);
            const hasLowerCase = /[a-z]/.test(password);
            const hasNumber = /[0-9]/.test(password);
            
            if (!hasUpperCase || !hasLowerCase || !hasNumber) {
                messageDiv.innerHTML = "错误:密码必须包含大小写字母和数字";
                messageDiv.style.color = "red";
                return;
            }
            
            // 所有验证通过,显示欢迎消息
            messageDiv.innerHTML = `欢迎 ${username}`;
            messageDiv.style.color = "green";

image
image
image

(2)尝试注入攻击。在用户名中输入<div style="color:red;font-size:24px;">页面已被黑客篡改!</div>,浏览器会将整个字符串作为HTML解析,创建并渲染
元素及其样式。结果如下。

image

3.建立Web后端:MySQL数据库。

(1)使用命令systemctl start mysql启动MySQL,输入mysql进入数据库。

image

(2)进行建库、创建用户、修改密码、建表等操作,具体代码如下。

-- 1. 创建数据库
CREATE DATABASE test8;

-- 2. 创建用户
-- 创建用户并设置密码
CREATE USER '20232411' IDENTIFIED BY '111';

-- 3. 授予用户所有权限
GRANT ALL PRIVILEGES ON test8.* TO '20232411';
FLUSH PRIVILEGES;

-- 4. 修改用户密码
ALTER USER '20232411' IDENTIFIED BY '20232411';

-- 5. 使用test8数据库
USE test8;

-- 6. 创建表
CREATE TABLE users (
    username VARCHAR(50) NOT NULL,
    password VARCHAR(100) NOT NULL,
    PRIMARY KEY (username)
);

-- 7. 插入数据
INSERT INTO users (username, password) VALUES
('20232411', 'Dd1111'),
('test', 'Dd2222'),
('aaa', 'Aa123456');

-- 8. 查看数据
SELECT * FROM users;

(3)具体操作结果如下。

image

4.建立Web后端:PHP网页认证。编写PHP网页,命名为。代码及结果如下。

<?php
// 连接数据库
$host = 'localhost';
$dbname = 'test8';
$username = '20232411';
$password = '20232411';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}

// 获取表单数据
$username = isset($_POST['username']) ? trim($_POST['username']) : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';

// 验证输入
if (empty($username) || empty($password)) {
    echo "错误:用户名和密码不能为空";
    exit;
}

// 查询用户
$sql = "SELECT password FROM users WHERE username = '$username'";
$result = $pdo->query($sql);
$user = $result->fetch(PDO::FETCH_ASSOC);

// 验证用户
if ($user && $password === $user['password']) {
    echo "欢迎 $username";
} else {
    echo "错误:用户名或密码不正确";
}
?>

image
image

5.进行最简单的SQL注入,XSS攻击测试。

(1)简单的SQL注入。在已知第一个用户密码的情况下,在用户名输入admin' OR '1'='1,密码输入第一个用户密码。注入结果如下。

image

(2)简单的XSS攻击测试。使用admin' OR '1'='1' -- <img src=x onerror="alert('XSS成功!')">,密码输入第一个用户密码,在sql注入成功后浏览器会处理<img src=x onerror="alert('XSS成功!')">,使攻击成功。攻击结果如下。

image

6.安装DVWA平台,选择low级别,完成SQL注入、XSS、CSRF攻击。

(1)SQL注入题目。

image
首先在表单中输入1,如上图正常结果显示。
image
尝试输入万能密码1’or 1=1#,得到所有用户的姓名。
image
image
image
使用order by进行判断字段数。输入1' order by 3#时报错了,说明字段只有2列。
image
通过联合查询,输入1' union select database(),user()#获取库名和当前连接库的用户名。
image
输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#查看表信息:dvwa 数据库只有一个数据表,users。
image
猜测users表的字段为user和password,输入:1' union select user,password from users #进行查询:查看到用户名、密码,密码判断采用md5进行加密。
image
通过https://www.cmd5.com/对admin用户密码进行解密得到明文password。

(2)XSS攻击题目。

  1. XSS(DOM)(DOM型跨站脚本攻击)。
    image
    选择English然后点击Select,查看URL变化。
    image
    直接在URL处更改为default=<script>alert(/xss/)</script>,访问攻击成功。
  2. XSS (Reflected)(反射型跨站脚本攻击)。
    image
    输入1,查看结果。
    image
    image
    输入<script>alert('hack')</script>查看返回结果,可以看到攻击成功。
  3. XSS (Stored)(存储型跨站脚本攻击)。
    image
    image
    在message输入框里输入<script>alert(1)</script>
    image
    ![image](https://img2024.cnblogs.com/blog/3262800/202512/3262800-20251206135548629-214842885.png
    F12打开之后在elements里面找到name元素,修改name输入框maxlength从10到100。
    image
    image
    在name输入框里输入<script>alert(1)</script>
    image
    查看数据库发现,攻击信息已存入数据库中。

(3)CSRF攻击攻击题目。

image
尝试两次密码不一致,分别是pass和password。页面顶部URL如上图。
image
新打开页面输入URLhttp://localhost/dvwa-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#,可以看到密码成功修改了,攻击成功。

3.问题及解决方案

  • 问题1:在/var/www/html目录下无法创建文件。
  • 问题1解决方案:使用root权限打开文件管理系统即可。
  • 问题2:使用<script>alert('XSS攻击成功!')</script>语句和<script>alert(document.cookie)</script>语句进行xss攻击都失败。
  • 问题2解决方案:由于现代浏览器的安全机制,当使用innerHTML将脚本插入文档时,script元素不会被执行。因此改用img标签,使用<img src=x onerror="alert('XSS成功!')">语句进行攻击。

4.学习感悟、思考

通过本次《网络与系统攻防技术》实验八的实践操作,我对 Web 前后端开发逻辑与网络安全防护体系有了更为立体和深刻的认知。从搭建基础 Web 环境到直面各类安全漏洞攻击,每一个实验步骤都让我在理论与实践的碰撞中收获颇丰。此次实验也让我对网络安全的 “攻防平衡” 有了更深层次的思考。攻击与防护是相互促进的两个方面:通过模拟攻击,我们能精准定位应用漏洞;而针对漏洞的防护措施,又会推动攻击技术的升级。我深刻认识到 “安全意识” 应贯穿于开发全流程——从需求分析阶段就需考虑潜在风险,编码时遵循安全规范,部署后持续进行漏洞扫描与修复。同时,本次实验中遇到的文件创建权限问题、浏览器安全机制限制等,也让我学会了从技术原理出发排查问题,培养了独立解决实际问题的能力。

posted @ 2025-12-06 14:20  20232411董琰祥  阅读(2)  评论(0)    收藏  举报