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

目录

一、实验基本信息

  1. 实验环境:Kali Linux虚拟机 + VMware Workstation;windows主机

  2. 实验工具:Apache、MySQL数据库、DVWA等

  3. 实验时间:2025.12.05

二、实验内容

  1. Web前端HTML

    • 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
  2. Web前端Javascipt

    • 理解JavaScript的基本功能,理解DOM,在(1)的基础上,编写JavaScript验证用户名、密码的规则,在用户点击登陆按钮后回显“欢迎+输入的用户名”。

    • 尝试注入攻击:利用回显用户名注入HTML及JavaScript。

  3. Web后端

    • MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表。

    • 编写PHP网页,连接数据库,进行用户认证 。

  4. 最简单的SQL注入,XSS攻击测试

  5. 安装DVWA平台,并完成SQL注入、XSS、CSRF攻击

三、实验要求

  1. 能够正常安装、启动、停止Apache服务

  2. 理解HTML表单和GET/POST方法

  3. 使用JavaScript实现前端验证规则、回显

  4. 安装使用MySQL数据库,编写PHP网页,连接数据库,进行用户认证

  5. 尝试SQL注入攻击和XSS注入

  6. DVWA上尝试完成SQL注入、XSS攻击等

四、实验过程

4.1 Web前端HTML

  • 4.1.1 安装与启停Apache

    • Apache(全称 Apache HTTP Server)是一个开源的、跨平台的Web服务器软件,由Apache软件基金会维护。它用于托管网站、处理HTTP请求、响应静态或动态内容,是互联网上最流行的Web服务器之一。

    • 在kali虚拟机终端中输入以下命令

    sudo apt install apache2 #安装Apache
    sudo systemctl start apache2 #启动Apache
    

    image

    • 在kali的浏览器中访问 http://localhost

    image

    可以看到“Apache2 Debian Default Page”,说明Apache成功安装并且能正常启动

    • 在kali终端中输入sudo systemctl stop apache2,刷新浏览器页面

    image

    可以看到"Unable to connect",说明Apache启停正常。

    • 重新启动Apache,接下来的实验需要打开Apache
  • 4.1.2 编写含表单HTML

    • 在kali的/var/www/html/目录下新建文件login.html,编写一个简单的含有表单的登录页面,并访问 http://localhost/login.html 查看效果

    image

    image

4.2 Web前端Javascipt

  • 4.2.1 编写JavaScript验证用户名、密码的规则,实现回显

    在(1)的基础上,编写JavaScript验证用户名、密码的规则,在用户点击登陆按钮后回显“欢迎+输入的用户名”,新的代码写入kali的/var/www/html/目录下的新建文件JSlogin.html中。

    • 用户名、密码验证规则以及回显的实现
      <body>
          <div class="login-container">
              
              <h2>用户登录</h2>
              <form id="loginForm">
                  <div class="form-group">
                      <label for="username">用户名</label>
                      <input type="text" id="username" name="username" class="input-field" 
                             placeholder="请输入用户名(3-50个字符)" required>
                      <div id="usernameError" style="color:#dc3545; font-size:14px; margin-top:5px; display:none;"></div>
                  </div>
                  
                  <div class="form-group">
                      <label for="password">密码</label>
                      <input type="password" id="password" name="password" class="input-field" 
                             placeholder="请输入密码(至少6位)" required>
                      <div id="passwordError" style="color:#dc3545; font-size:14px; margin-top:5px; display:none;"></div>
                  </div>
                  
                  <button type="submit" class="submit-btn">登录</button>
              </form>
              
              <!-- 欢迎信息显示区域(存在XSS漏洞) -->
              <div class="welcome-area" id="welcomeArea">
                  <!-- 这里将直接显示用户输入的内容 -->
                  <p style="color:#666; text-align:center;">登录后将在这里显示欢迎信息</p>
              </div>
              
              <div class="form-footer">
                  <p>© 20232315 登录系统 | <a href="#">忘记密码?</a></p>
              </div>
          </div>
          
          <script>
              ......
              ......
                      // JavaScript验证用户名规则
                      if (!username) {
                          usernameError.textContent = '用户名不能为空';
                          usernameError.style.display = 'block';
                          isValid = false;
                      } else if (username.length < 3 || username.length > 50) {
                          usernameError.textContent = '用户名长度必须在3-50个字符之间';
                          usernameError.style.display = 'block';
                          isValid = false;
                      }
                      
                      // JavaScript验证密码规则
                      if (!password) {
                          passwordError.textContent = '密码不能为空';
                          passwordError.style.display = 'block';
                          isValid = false;
                      } else if (password.length < 6) {
                          passwordError.textContent = '密码长度至少6位';
                          passwordError.style.display = 'block';
                          isValid = false;
                      }
                      
                      // 如果验证通过
                      if (isValid) {
                          welcomeArea.innerHTML = `
                              <div style="text-align:center; padding:15px;">
                                  <h3 style="color:#4a6ee0; margin-bottom:10px;">登录成功</h3>
                                  <p style="font-size:18px;">欢迎,<strong>${username}</strong>!</p>
                                  <p style="color:#666; font-size:14px; margin-top:10px;">您已成功登录系统</p>
                              </div>
                          `;
                          
                      }
                  });
                  ......
                  ......
          </script>
      </body>
    
    • 在kali浏览器中访问 http://localhost/JSlogin.html ,查看规则限制与回显效果

    image

    image

    image

  • 4.2.2 尝试注入攻击:利用回显用户名注入HTML及JavaScript

    • HTML注入,在用户名中输入<span style="color:red">你的网站被黑了!</span>

    image

    • JavaScript注入,在用户名中输入游客<img src="x" onerror="alert('注入攻击成功!')">

    image

4.3 Web后端

  • 4.3.1 安装启动MySQL

    • 查看MySQL版本

    image

    从结果可以看到,Kali自带MariaDB(MySQL的一个开源分支)

    • 启动MySQL服务,输入以下命令:
    sudo systemctl start mariadb #启动服务
    sudo systemctl status mariadb #检查服务状态
    

    image

    结果显示Active: active (running),服务已经开始运行

  • 4.3.2 建库、创建用户、修改密码、建表

    • 登录MySQL,在kali终端输入sudo mysql -u root -p,使用root用户登录MySQL

    image

    • 建库、创建用户、修改密码、建表,输入以下命令:
    CREATE DATABASE IF NOT EXISTS mydb20232315; #创建数据库mydb20232315
    
    USE mydb20232315; #进入数据库
    
    CREATE USER 'user20232315' IDENTIFIED BY 'klein@0304'; #创建用户
    
    SELECT User, Host FROM mysql.user WHERE User = 'user20232315'; #验证用户创建是否成功
    
    GRANT ALL PRIVILEGES ON mydb20232315.* TO 'user20232315'; #授予用户数据库的所有权限
    
    FLUSH PRIVILEGES; #刷新权限使设置生效
    
    SHOW GRANTS FOR 'user20232315'; #查看用户的权限
    
    CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ); #创建用户表
    
    INSERT INTO users (username, password) VALUES ('admin', MD5('admin@123')),('testuser1', MD5('test@123')),('testuser2', MD5('test@456')); #在表中插入测试数据,使用MD5哈希存储密码
    
    SELECT * FROM users; #查看插入的数据
    

    image

    • 测试修改创建的用户的密码

      ALTER USER 'user20232315' IDENTIFIED BY 'user@123'; #修改密码
      

      image

    • 验证用户登录

      mysql -u user20232315 -p
      

      image

  • 4.3.3 编写PHP网页,连接数据库

    • 在kali的/var/www/html/目录下创建项目目录20232315php,编写php网页,项目结构如下:
    /var/www/html/20232315php/
    ├── login.php              # 登录页面
    ├── config.php             # 数据库配置
    ├── authenticate.php       # 认证处理(决定跳转到哪个页面)
    ├── success.php            # 正确登录页面
    ├── user_not_found.php     # 用户不存在页面
    ├── password_error.php     # 密码错误页面
    └── logout.php             # 退出登录
    
    • 主要文件

      • config.php
      <?php
      // config.php - 数据库配置文件
      
      // 数据库连接配置
      define('DB_HOST', 'localhost');
      define('DB_USER', 'user20232315');
      define('DB_PASS', 'user@123');
      define('DB_NAME', 'mydb20232315');
      
      //创建数据库连接,返回mysql连接对象
      function get_db_connection() {
          // 创建连接
          $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
          
          // 检查连接
          if ($conn->connect_error) {
              die("数据库连接失败: " . $conn->connect_error);
          }
          
          // 设置字符集为UTF-8
          $conn->set_charset("utf8");
          
          return $conn;
      }
      
      ?>
      
      • authenticate.php
      <?php
      // authenticate.php - 用户认证文件
      session_start();
      require_once 'config.php'; //引入数据库配置文件
      
      // 获取用户输入
      $username = isset($_POST['username']) ? $_POST['username'] : '';
      $password = isset($_POST['password']) ? $_POST['password'] : '';
      
      
      // 验证输入是否为空
      if (empty($username) || empty($password)) {
          header('Location: login.php');
          exit();
      }
      
      // 获取数据库连接
      $conn = get_db_connection();
      
      // 1. 先检查用户是否存在
      $check_user_sql = "SELECT id, username FROM users WHERE username = '$username'";
      $user_result = $conn->query($check_user_sql);
      
      if (!$user_result) {
          // 查询出错
          header('Location: password_error.php');
          exit();
      }
      
      if ($user_result->num_rows === 0) {
          // 情况1:用户不存在
          $conn->close();
          header('Location: user_not_found.php?username=' . urlencode($username));//跳转并提示用户不存在
          exit();
      }
      
      // 2. 用户存在,检查密码
      $check_password_sql = "SELECT id, username FROM users WHERE username = '$username' AND password = MD5('$password')";
      $password_result = $conn->query($check_password_sql);
      
      if ($password_result && $password_result->num_rows > 0) {
          // 情况2:密码正确(登录成功)
          $user = $password_result->fetch_assoc();
          
          // 设置会话变量
          $_SESSION['user_id'] = $user['id'];
          $_SESSION['username'] = $user['username'];
          $_SESSION['login_time'] = date('Y-m-d H:i:s');
          
          $conn->close();
          header('Location: success.php');
          exit();
      } else {
          // 情况3:用户存在但密码错误
          $conn->close();
          header('Location: password_error.php?username=' . urlencode($username)); //跳转并提示密码错误
          exit();
      }
      ?>
      
  • 4.3.4 用户认证,测试登录

    • 测试登录,在浏览器中访问http://localhost/20232315php/login.php

    image

    • 成功登录

    image

    image

    • 用户不存在,输入未创建的用户testuser3

    image

    • 密码错误,输入用户admin,密码123456(正确密码为admin@123)

    image

4.4 最简单的SQL注入,XSS攻击测试

  • 4.4.1 SQL注入

    • 在用户名输入admin' OR '1'='1,密码输入123456(正确密码为admin@123)

      image

      image

      可以看到最后也成功登录了。因为在编写php代码是直接将用户输入搬了SQL的查询语句中,使得原本只有在SELECT * FROM users WHERE username = 'admin' AND password = MD5('admin@123');时才成功,变成了SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = MD5('123456');,等价于SELECT * FROM users WHERE (username = 'admin') OR ('1'='1' AND password = MD5('123456'));,而1 = 1永远为真,所以返回用户admin成功登录界面。

    • 在用户名中输入admin' -- ,密码输入123456

      image

      image

      同样成功登录。“--“在SQL语言中的作用是注释之后的内容,注入SQL后的验证变成了

      SELECT * FROM users WHERE username = 'admin' -- ' AND password = MD5('123456');
      

      等价于

      SELECT * FROM users WHERE username = 'admin';
      

      所以返回用户admin成功登录界面。

  • 4.4.2 XSS攻击

    • 在用户名中输入<script>alert("XSS攻击成功!")</script>,输入任意密码

      image

      image

      image

      <script>alert("XSS攻击成功!")</script>不是用户注册的用户名,在跳转到用户不存在页面时,该语句被注入到URL参数中,被用户浏览器当成了代码执行,显示alert弹窗。

4.5 安装DVWA平台,并完成SQL注入、XSS、CSRF攻击

  • 4.5.1 DVWA安装配置以及登录

    • 在kali的/var/www/html/目录下载DVWA

      #使用wget下载
      sudo wget https://github.com/digininja/DVWA/archive/master.zip
      sudo unzip master.zip
      sudo mv DVWA-master DVWA
      
      # 设置权限
      sudo chown -R www-data:www-data DVWA
      sudo chmod -R 755 DVWA
      
      cd config #进入DVWA配置文件
      sudo cp config.inc.php.dist config.inc.php #复制配置文件,准备重新编辑
      

      image

      image

    • 登录MySQL,建立DVWA数据库,新建用户,设置密码

      CREATE DATABASE IF NOT EXISTS dvwa20232315; -- 新建DVWA数据库
      CREATE USER 'dvwa2315' IDENTIFIED BY 'dvwa@123'; -- 新建用户设置密码
      GRANT ALL PRIVILEGES ON dvwa20232315.* TO 'dvwa'; -- 将新建数据库的所有权限赋予新建用户
      FLUSH PRIVILEGES; -- 刷新,使权限生效
      EXIT;
      

      image

    • 图形界面进入/var/www/html/DVWA/config/目录,打开复制的config.inc.php文件,找到以下内容并修改

      $_DVWA[ 'db_server' ]   = '127.0.0.1';
      $_DVWA[ 'db_database' ] = 'dvwa20232315'; #登录刚刚新建的数据库
      $_DVWA[ 'db_user' ]     = 'dvwa2315'; #使用新建的用户登录
      $_DVWA[ 'db_password' ] = 'dvwa@123'; #设置密码为新建用户的密码
      

      image

    • 配置PHP设置,图形界面进入/etc/php/8.4/apache2目录,打开php.ini文件,找到并修改以下内容

      # 找到以下配置并修改:
      allow_url_fopen = On
      allow_url_include = On
      display_errors = On
      display_startup_errors = On
      
      # 保存后重启Apache
      sudo systemctl restart apache2
      

      image

      image

    • 登录DVWA,在kali的浏览器中访问http://localhost/DVWA/,输入默认用户名admin与默认密码password,找到左侧DVWA Security,将安全等级设置为low

      image

      image

  • 4.5.2 SQL注入攻击

    在DVWA界面左侧找到SQL Injection,点击进入

    • 输入1,测试注入点

      image

    • 尝试输入注释符,输入1' -- ,能够绕过密码查询,显示用户信息

      image

    • 输入万能密码1' or '1'='1,显示所有用户信息

      image

    • 联合查询获取更多信息,输入1' union select 1,version() -- ,获取MySQL版本信息

    image

    • 显示所有用户的用户名和密码(MD5哈希),输入1' union select user,password from users --

    image

  • 4.5.3 XSS攻击

    • 反射型XSS,在左侧找到XSS(Reflected),点击进入

      • 输入<script>alert('20232315 XSS攻击成功!')</script>,弹出alert弹窗

        image

        image

    • 存储型XSS,在左侧找到XSS(Stored),点击进入

      • 在Name一栏输入admin,在留言板Message中输入<script>alert('20232315 存储型XSS成功!')</script>,显示alert弹窗

        image

      • 刷新该页面,仍然会显示alert弹窗

        image

      • 新开一个窗口访问该页面http://localhost/DVWA/vulnerabilities/xss_s/,仍然会跳出弹窗

        image

  • 4.5.4 CSRF攻击

    在左侧找到CSRF,点击进入

    • 观察修改密码的URL,在NEW passwordConfirm new password中输入想要修改后的密码20232315,并点击Change,观察浏览器上方的URL关键参数

      image

      URL:http://localhost/DVWA/vulnerabilities/csrf/?password_new=20232315yx&password_conf=20232315yx&Change=Change#,关键参数:

      • password_new=20232315yx

      • password_conf=20232315yx

      • Test Credentials中用修改的密码进行登录测试,可以成功登录,密码已经修改

        image

    • 构造恶意URL,将以上获得的URL中的关键参数改为自己想要的密码,构造恶意URLhttp://localhost/DVWA/vulnerabilities/csrf/?password_new=hackedby2315&password_conf=hackedby2315&Change=Change#,在新开一个窗口登录DVWA,在地址栏中输入改URL模拟点击恶意链接

      image

      • Test Credentials中尝试用20232315yx登录,无法登录

        image

      • hackedby2315登录,登录成功

        image

五、问题及解决方案

第一次进行XSS攻击测试时无法成功

问题:在用户名中输入<script>alert("XSS攻击成功!")</script>,输入任意密码,最后正常跳转到用户不存在页面,并没有显示“XSS攻击成功!”

image

image

原因:user_not_found.php文件代码中使用了htmlspecialchars()函数

image

该函数会将HTML特殊字符转换为HTML实体,防止浏览器将它们解释为HTML代码,比如:

原始字符 转换后
< &lt;
> &gt;
" &quot;
' &#039;
& &amp;

当用户输入<script>alert("XSS攻击成功!")</script>时,浏览器HTML中会显示&lt;script&gt;alert(&quot;XSS攻击&quot;)&lt;/script&gt;,此时<script>alert("XSS攻击成功!")</script>对于浏览器来说就是纯文本,不会理解为HTML代码执行

解决:取消使用htmlspecialchars()函数

image

六、实验感想

通过本次实验,我深刻体会到了理论知识与实践操作之间的巨大差距,也对网络安全的重要性有了全新的认识。以前学习安全知识时,总觉得漏洞、攻击离自己很遥远,只是教科书上的概念,但这次理论与实践的结合让我看到了安全的立体性,实验中,我不仅需要理解SQL注入、XSS、CSRF的原理,更要实际操作验证。比如在测试XSS攻击时,我输入<script>alert('XSS')</script>发现没有弹窗,第一反应是“攻击失败了”。但通过分析代码,我发现这是因为系统正确使用了htmlspecialchars()进行防护—,这个“失败”恰恰证明了防护的有效性,让我对安全防御有了更深的理解。

本次实验也进一步加强了我的安全意识和责任感,当我用DVWA平台成功实施CSRF攻击,仅仅通过一个链接就能修改他人密码时,我深刻体会到了“不乱点不明链接”的重要性。

总之,这次实验不仅是一次技术练习,更是一次安全思维的洗礼。它让我明白,安全不是“锦上添花”的可选项,而是“生死攸关”的必选项;不是开发完成后的修补,而是贯穿始终的考量。

posted on 2025-12-08 19:21  易娴  阅读(17)  评论(0)    收藏  举报