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

Apache服务器已通过phpStudy集成环境成功安装和配置。通过phpStudy控制面板可以正常启动、停止和重启Apache服务。

验证步骤:

  1. 打开phpStudy面板

  2. 点击"启动"按钮启动Apache服务
    image

  3. 在浏览器中访问http://localhost,确认服务器正常运行
    image

2.1.2 HTML表单与GET/POST方法

创建了包含GET和POST方法表单的HTML页面([login.html](file:///D:/phpstudy_pro/WWW/login.html)),用于演示不同的HTTP请求方法。

关键代码片段:

<!-- GET 方法表单 -->
<form id="getForm" method="GET" action="">
    <div class="form-group">
        <label for="getUsername">用户名:</label>
        <input type="text" id="getUsername" name="username" required>
    </div>
    <div class="form-group">
        <label for="getPassword">密码:</label>
        <input type="password" id="getPassword" name="password" required>
    </div>
    <button type="submit" class="btn">GET 登录</button>
</form>

<!-- POST 方法表单 -->
<form id="postForm" method="POST" action="">
    <div class="form-group">
        <label for="postUsername">用户名:</label>
        <input type="text" id="postUsername" name="username" required>
    </div>
    <div class="form-group">
        <label for="postPassword">密码:</label>
        <input type="password" id="postPassword" name="password" required>
    </div>
    <button type="submit" class="btn">POST 登录</button>
</form>

验证步骤:

  1. 访问http://localhost/login.html
    image

  2. 在GET表单中填写用户名和密码并提交,观察URL变化,查询参数出现在URL中
    image

  3. 在POST表单中填写用户名和密码并提交
    image
    image
    image

GET方法将表单数据附加在URL之后,以?分隔URL和传输数据,参数之间以&相接,适用于少量数据传输且数据对安全性要求不高的场景。而POST方法将表单数据放在HTTP协议的请求头中传输,安全性相对较高,适合传输较大量数据或敏感信息。

2.2 Web前端JavaScript

2.2.1 JavaScript验证功能

在HTML表单基础上增加了JavaScript验证功能,验证用户名和密码规则,并在用户点击登录按钮后回显"欢迎+输入的用户名"。

关键代码片段:

// 简单的JavaScript验证
function validateForm() {
    const username = document.getElementById('jsUsername').value;
    const password = document.getElementById('jsPassword').value;
    
    if (username.length < 3) {
        alert('用户名至少需要3个字符');
        return;
    }
    
    if (password.length < 6) {
        alert('密码至少需要6个字符');
        return;
    }
    
    // 显示欢迎信息
    document.getElementById('jsResult').innerHTML = '欢迎, ' + username + '!';
    document.getElementById('jsResult').style.display = 'block';
}

image

JavaScript通过DOM操作实现了客户端验证功能,提升了用户体验,但不能替代服务器端验证。通过getElementById获取表单元素,使用.value属性获取输入值,并通过条件判断实现验证逻辑。

2.2.2 XSS注入攻击测试

通过回显用户名功能演示XSS注入攻击的可能性。

验证步骤:

  1. 输入包含HTML标签的用户名,如<b>test</b>,结果显示加粗的"test"文本,表明存在XSS漏洞
    image

  2. 新做了一个用来测试xss攻击的网页http://localhost/xss_demo.php
    image
    image
    重定向攻击:
    image
    image
    HTML注入:
    image

XSS攻击利用了网站对用户输入数据输出时未经严格过滤的特点,将恶意脚本代码注入到网页中执行。

2.3 Web后端MySQL基础

2.3.1 MySQL安装与启动

MySQL数据库已通过phpStudy集成环境成功安装和启动。
输入tasklist | findstr mysql验证
image

2.3.2 数据库与表结构

DVWA数据库已创建,包含users和guestbook表。

查看数据库
mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "SHOW DATABASES;"
image
查看users表结构
mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "USE dvwa; DESCRIBE users;"
image
查看用户数据
mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "USE dvwa; SELECT user_id, first_name, last_name, user FROM users;"
image
查询到users表的5条用户数据,包含user_id、姓名、用户名等信息

mysql -u dvwa -pzsm20050314 -h 127.0.0.1 -e "USE dvwa; SELECT user_id, user, password, first_name, last_name FROM users;"
image
可以看到用户密码使用哈希值来存储

2.4 Web后端PHP网页连接数据库进行用户认证

2.4.1 用户认证页面

创建了用户认证页面([new_login.php](file:///D:/phpstudy_pro/WWW/new_login.php)),实现了基于DVWA数据库的用户登录验证功能。

验证步骤:
访问http://localhost/new_login.php,使用DVWA中的用户凭据登录(admin/password)
image
image

采用参数化查询防止SQL注入攻击,使用session管理用户登录状态,通过htmlspecialchars函数防止XSS攻击。

<?php

session_start();

// 处理POST请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 获取并清理输入数据
    $input_username = isset($_POST['username']) ? trim($_POST['username']) : '';
    $input_password = isset($_POST['password']) ? trim($_POST['password']) : '';
    
    // 引入数据库配置
    require_once 'db_config.php';
    
    try {
        // 查询用户信息
        $stmt = $pdo->prepare("SELECT * FROM users WHERE user = ? AND password = ?");
        $stmt->execute([$input_username, md5($input_password)]);
        $user = $stmt->fetch();
        
        if ($user) {
            // 登录成功
            $_SESSION['loggedin'] = true;
            $_SESSION['username'] = $input_username;
            
            echo "<!DOCTYPE html>
            <html lang='zh-CN'>
            <head>
                <meta charset='UTF-8'>
                <title>登录成功</title>
                <style>
                    body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; }
                    .success { background-color: #d4edda; color: #155724; padding: 15px; border-radius: 5px; }
                </style>
            </head>
            <body>
                <div class='success'>
                    <h2>登录成功</h2>
                    <p>欢迎, " . htmlspecialchars($input_username) . "!</p>
                </div>
                <p><a href='new_login.php'>重新登录</a></p>
            </body>
            </html>";
            exit;
        } else {
            // 登录失败
            $error_message = "用户名或密码错误";
        }
    } catch (PDOException $e) {
        $error_message = "数据库查询出错: " . $e->getMessage();
    }
}
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>用户登录 - 20232326</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 500px;
            margin: 50px auto;
            padding: 20px;
            background-color: #f5f5f5;
        }
        .container {
            background-color: white;
            padding: 30px;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0,0,0,0.1);
        }
        .form-group {
            margin-bottom: 15px;
        }
        label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        input[type="text"], input[type="password"] {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 5px;
            box-sizing: border-box;
        }
        .btn {
            width: 100%;
            padding: 12px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }
        .btn:hover {
            background-color: #0056b3;
        }
        .error {
            background-color: #f8d7da;
            color: #721c24;
            padding: 10px;
            border-radius: 5px;
            margin-bottom: 15px;
        }
        .identifier {
            text-align: center;
            color: #6c757d;
            font-size: 14px;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>用户登录</h2>
        <p class="identifier">学号: 20232326</p>
        
        <?php if (isset($error_message)): ?>
        <div class="error"><?php echo $error_message; ?></div>
        <?php endif; ?>
        
        <form method="POST" action="new_login.php">
            <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>
            <button type="submit" class="btn">登录</button>
        </form>
        
        <div style="margin-top: 20px; padding: 15px; background-color: #e9ecef; border-radius: 5px;">
            <h3>可用测试账户:</h3>
            <ul>
                <li>admin / password</li>
                <li>gordonb / hello</li>
                <li>pablo / letmein</li>
                <li>smithy / password</li>
            </ul>
        </div>
    </div>
</body>
</html>

2.5 最简单的SQL注入、XSS攻击测试

2.5.1 SQL注入测试

创建了SQL注入测试页面([sql_injection_test.php](file:///D:/phpstudy_pro/WWW/sql_injection_test.php)),演示不安全的SQL查询如何导致SQL注入漏洞。

关键代码片段:

// 不安全的查询方式 - 容易受到SQL注入攻击
$unsafe_query = "SELECT first_name, last_name FROM users WHERE user_id = $user_id";

try {
    // 执行不安全的查询
    $stmt = $pdo->query($unsafe_query);
    // ...
} catch (PDOException $e) {
    // ...
}

验证步骤:

  1. 访问http://localhost/sql_injection_test.php

  2. 输入正常用户ID(如1),确认返回正确的用户信息
    image
    image

  3. 尝试SQL注入攻击:

    • 输入 1 UNION SELECT user, password FROM users
      image

SQL注入攻击通过在输入中插入恶意SQL代码,改变原有SQL语句的执行逻辑,从而绕过认证、获取敏感数据甚至控制数据库服务器。

2.5.2 XSS攻击测试

创建了XSS攻击测试页面([xss_demo.php](file:///D:/phpstudy_pro/WWW/xss_demo.php)),演示不安全的输出如何导致XSS漏洞。

关键代码片段:

if ($user_input) {
    if ($mode === 'unsafe') {
        // 不安全的输出方式 - 容易受到XSS攻击
        echo "您输入的内容是: " . $user_input;
    } else {
        // 安全的输出方式 - 转义特殊字符
        echo "您输入的内容是: " . htmlspecialchars($user_input);
    }
}

验证步骤:

  1. 访问http://localhost/xss_test.php
  2. 在输入框中输入<script>alert('XSS')</script>
  3. 点击"不安全输出"按钮
    image

XSS攻击发生在客户端,攻击者通过在网页中注入恶意脚本,当其他用户浏览该网页时,恶意脚本会在用户浏览器中执行,从而窃取用户信息或进行其他恶意操作。

2.6 安装DVWA并完成SQL注入、XSS、CSRF攻击

2.6.1 DVWA平台安装与配置

DVWA平台已通过phpStudy环境成功安装和配置。

验证步骤:

  1. 访问http://localhost/DVWA
  2. 确认DVWA首页正常加载
  3. 点击"Setup / Reset DB"链接创建/重置数据库
  4. 点击"Login"使用默认凭据登录(admin/password)
    image

2.6.2 SQL注入攻击

在DVWA平台上完成了不同难度级别的SQL注入攻击测试。

验证步骤:

  1. 点击DVWA菜单中的"SQL Injection"
  2. 直接输入 ' 1' OR '1'='1
    image

2.6.3 XSS攻击

在DVWA平台上完成了反射型和存储型XSS攻击测试。

验证步骤:

  1. 点击DVWA菜单中的"XSS (Reflected)"

  2. 尝试不同难度级别的攻击:

    • Low级别:输入 <script>alert('20232326')</script>
      image

    image

  3. 点击DVWA菜单中的"XSS (Stored)"

  4. 在表单中输入,显示Cookie信息
    image
    image

2.6.4 CSRF攻击

在DVWA平台上完成了CSRF攻击测试。
DVWA的不同安全级别有不同的防护措施:

Low级别:没有CSRF保护
Medium级别:检查referer头部
High级别:使用token验证

验证步骤:

  1. 点击DVWA菜单中的"CSRF"
  2. 修改密码为20232326
    image
    在登陆页面验证,成功登陆
    image

3.问题及解决方案

  • 问题1:数据库连接失败
  • 问题1解决方案:检查数据库配置信息,确认用户名、密码和数据库名称正确,并确保MySQL服务正在运行
  • 问题2:XSS攻击测试时脚本未执行
  • 问题2解决方案:确认使用的是不安全输出方式(innerHTML),而非安全输出方式(innerText或htmlspecialchars)
  • 问题3:DVWA数据库初始化失败
  • 问题3解决方案:手动创建数据库和用户,运行SQL脚本初始化表结构和数据
  • 问题4:DVWA登录失败
  • 问题4解决方案:确认使用正确的默认凭据(admin/password),如果仍然无法登录,尝试重置数据库或检查安全级别设置
  • 问题5:login_check.php页面登录失败
  • 问题5解决方案:修复了表单action属性,现在可以使用http://localhost/test_login.php进行测试,或者继续使用http://localhost/login_check.php
  • 问题6:login_check.php页面始终显示用户名为'dvwa'
  • 问题6解决方案:经检查发现这是由于curl命令中参数传递方式不正确导致的假象,实际通过浏览器访问页面可以正常工作。推荐使用浏览器直接访问页面进行测试,避免命令行参数传递的复杂性。

4.学习感悟、思考等

通过本次实验,我对Web安全有了更深入的理解。从前端HTML表单到后端数据库连接,再到各种安全漏洞的原理和防护措施,整个过程中我体会到了Web开发中安全的重要性。

首先,在HTML和JavaScript层面,我学会了如何构建基本的Web表单,并通过JavaScript实现客户端验证功能。同时,我也认识到了客户端验证的局限性,它只能提升用户体验,不能替代服务器端验证。更重要的是,通过XSS攻击的实践,我深刻理解了输出编码的重要性,任何用户输入的数据在输出时都应该经过适当处理,避免恶意脚本的执行。

其次,在后端开发方面,我掌握了使用PHP连接MySQL数据库的方法,以及如何进行基本的用户认证。通过实践SQL注入攻击,我认识到参数化查询对于防止SQL注入的重要性。传统的字符串拼接方式极易受到SQL注入攻击,而参数化查询可以有效避免这一问题。

最后,通过DVWA平台的实践,我系统地学习了常见的Web安全漏洞,包括SQL注入、XSS和CSRF等。每种漏洞都有其特定的攻击方式和防护措施,只有深入理解其原理,才能在开发中有效地防范这些安全威胁。

这次实验让我意识到,作为一个Web开发者,不仅要关注功能的实现,更要重视安全性。任何一个小小的疏忽都可能导致严重的安全问题。因此,在今后的开发工作中,我会更加注重安全编程规范,采取必要的防护措施,确保应用程序的安全性.

posted @ 2025-12-08 11:05  20232326朱思敏  阅读(6)  评论(0)    收藏  举报