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

1.实验内容

--- 关于Web前端后端的安全,简单了解并实践。
基本实验内容如下:

  • 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML;
  • 理解JavaScript的基本功能,理解DOM;
  • 编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”;
  • 尝试注入攻击;
  • 了解MySQL基础;
  • 编写PHP网页,连接数据库,进行用户认证;
  • 进行最简单的SQL注入,XSS攻击测试;
  • 安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击。

2.实验过程

总共6个任务,如下:
(1)Web前端HTML相关实践
(2)Web前端javascipt相关实践
(3)Web后端MySQL相关实践
(4)Web后端PHP相关实践
(5)简单的SQL注入,XSS攻击测试
(6)DVWA平台综合实践
我们一个一个来看。

(1)Web前端HTML相关实践

Kali已经自带了Apache2服务器了。很好。
输入systemctl start apache2启用它。
/var/www/html是Kali Linux中Apache网页服务器的默认根目录,用于存放网站文件。输入cd /var/www/html进入。
使用vi 20232313.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;
            max-width: 600px;
            margin: 50px auto;
            padding: 20px;
            line-height: 1.6;
        }
        .form-section {
            margin-bottom: 40px;
            padding: 20px;
            border: 1px solid #ddd;
            border-radius: 5px;
        }
        input[type="text"], input[type="password"] {
            width: 100%;
            padding: 10px;
            margin: 8px 0;
            border: 1px solid #ddd;
            border-radius: 4px;
            box-sizing: border-box;
        }
        input[type="submit"] {
            background-color: #4CAF50;
            color: white;
            padding: 10px 15px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-top: 10px;
        }
        input[type="submit"]:hover {
            background-color: #45a049;
        }
        label {
            display: block;
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <h1>简单网页示例</h1>

    <!-- 登录表单 - 使用POST方法 -->
    <div class="form-section">
        <h2>用户登录</h2>
        <form action="/login" method="post">
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username" required>
            
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" required>
            
            <input type="submit" value="登录">
        </form>
    </div>

    <!-- 搜索表单 - 使用GET方法 -->
    <div class="form-section">
        <h2>搜索功能</h2>
        <form action="/search" method="get">
            <label for="search">搜索关键词:</label>
            <input type="text" id="search" name="q" required>
            
            <input type="submit" value="搜索">
        </form>
    </div>
</body>
</html>

这个网页就是一个干净清爽的登录和搜索页面,上面是登录框,下面是搜索框。
在这里简单说一下html里表单的概念:表单(<form>)是网页上用来收集用户输入数据并提交给服务器的交互元素。
在这里我们已经使用了一个form。它分别使用GET和POST提供了查询和用户登录功能。
切换到图形化界面到该目录下双击这个HTML文件即可运行,结果如下:
01a6ef8c6440a64a0ac58fb932abdba0
搜索框输入“20232313”搜索,看到搜索内容直接显示在URL里,容易被他人看到或浏览器历史记录保存:
966994e05c4a72ec04b79341ecc8743a
使用POST的方法则数据隐藏,适合敏感信息。
388249fa5d0ce92a6db28cfd26adc96f

(2)Web前端javascipt相关实践

JavaScript 是让网页动起来的代码,比如点击按钮弹出提示、动态加载内容。
DOM是网页的结构树,JavaScript通过操作DOM可以改文字、加样式、删元素,让页面能交互。
我们新添加JS代码,新增对用户输入进行验证的功能:

function submit_login() {
            const username = document.getElementById('username').value;
            const password = document.getElementById('password').value;
            const welcomeMessage = document.getElementById('welcomeMessage');
            
            // 验证用户名规则:至少3个字符,只能包含字母和数字
            if (username.length < 3) {
                alert('用户名至少需要3个字符');
                return;
            }
            
            // 验证密码规则:至少6个字符
            if (password.length < 6) {
                alert('密码至少需要6个字符');
                return;
            }
            
            // 显示欢迎信息
            welcomeMessage.innerHTML = '欢迎 ' + username;
            welcomeMessage.style.display = 'block';
            
            // 清空表单
            document.getElementById('loginForm').reset();
        }

这里添加了对用户名长度和密码长度的验证。执行效果如下:
92195f51b505fa2223b56d30ec064952
7e5ce66e0dba589e5070723dc18e29ae
接着我们尝试注入攻击,即利用回显用户名注入HTML及JavaScript:
首先在用户名一栏输入<img src=x onerror=alert(1)>,密码任意,效果如下:
c288f553a6f4693842518713f4d0dfbb
其次使用HTML代码注入,输入<h1>HTML injection succeed.</h1>,效果如下:
674b4e02dd04ab8487f0146d21bddebf

(3)Web后端MySQL相关实践

Kali已经安装了MySQL,在这里直接启动即可。
使用systemctl start mysql启动MySQL。接着进行如下配置用于测试:

mysql
-- 创建数据库
CREATE DATABASE 20232313db;
-- 使用数据库
USE 20232313db;
-- 创建用户20232313,密码为wzy1234
CREATE USER 'user20232313' IDENTIFIED BY 'wzy1234';
-- 授予用户权限
GRANT ALL PRIVILEGES ON 20232313db.* TO 'user20232313';
FLUSH PRIVILEGES;
-- 修改用户密码
ALTER USER 'user20232313' IDENTIFIED BY 'wzy12345';
-- 创建表
CREATE TABLE testtable (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    pwd VARCHAR(255) NOT NULL
);
-- 插入数据
INSERT INTO testtable (name, pwd) VALUES ('wzy', 'wzy1234');
-- 查看表中所有内容
SELECT * FROM testtable;

这段 SQL 代码创建了一个名为20232313db的数据库,并设置了用户权限,然后在该数据库中创建了一个表testtable,插入了一条数据,并查询了表中的所有内容。
这里用到的数据是(wzy, wzy1234),后面测试会用到,先记住。
a0783c8f217e522a0da57bc553ce0709
a4070ac09f429379f38b4804d23a1760

(4)Web后端PHP相关实践

PHP是kali自带的。kali很方便。
我们打开20232313.html,回到登录界面修改一下。
回到之前的html文件修改一下登录按钮的action设置,改为执行php文件:
4feb67a089a82185c6d7b9ada212e60f
还是在/var/www/html目录下,我们新建文件20232313.php,内容如下:

<?php
$host = 'localhost';
$dbname = '20232313db';
$user = 'user20232313';
$password = 'wzy12345';
 
//创建数据库连接
$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 testtable 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();
?>

ab13b96a04f477a8d362f8359e72c497

接着我们进行测试,发现能够连接上数据库,正常运行:
10530b8582ddb361e761c9a9fa26d471
6dcf43348f3639417e426cca24367f39
输入正确用户名密码可以成功登录,如果输入错误用户名密码会给出提示

(5)简单的SQL注入,XSS攻击测试

在这里使用经典的' OR '1'='1,用户名随便即可。这里的原理是利用了点号把前面的字符串注释掉,然后使用OR逻辑添加一个1=1使得判定正确。效果如下:
c25dba18c0a5f06a88351c5d06339543
接着尝试XSS注入。在用户名输入<img src=x onerror=alert("XSSInjectedSucceed")>,密码还是输入' OR '1'='1,效果如下:
5beaa3431f6bb2f34f46739d037c1513
输入<img src=x onerror=alert("XSSInjectedSucceed")>时,如果网页未对用户输入进行过滤,浏览器会解析该代码并执行alert("XSSInjectedSucceed"),触发弹窗。

(6)DVWA平台综合实践

在这里我使用的平台是DVWA。至于怎么配置,我们询问一下AI或者查询一下CSDN就可以了,按下不表。
配置好的DVWA应该如下:
141ca3d0833ac18cdb2c3b81627f03ee
我们设置一下难度,调低点:
8bb5833cada895c5b09428fd5d620bc4

(6.1) SQL Injection

先简单尝试提交一个数据,发现显示First Name和Surname两个表段数据,并且在URL中显示了id,那么可能就是使用id值在数据库中进行查询。
尝试用1 AND 1=2测试是否存在SQL注入漏洞:
10241f748149621a1b4cd522ff74a3b9
可以看出来这里的数据库查询是直接把用户输入插入查询语句中。
接下来我们来判断表中有几个字段,使用1' order by 1 #,1' order by 2 #数字逐渐递加,直到n的时候报错说明有n-1个字段,如图所示:
98555d7395b8e530e6b66749f5a719e2
尝试后发现会在在1' order by 3 #的时候白屏,说明这次查询只返回两个字段。
有了上面分析的结果,接下来我们就可以使用union联合查询来获取一些信息。
使用' union select database(),version() #来获取当前数据库名称,版本:
7587cbb9e1ed9c470e1a6e29b0a244a7
使用' union select database(),user() #来获取当前当前用户信息:
fd7df7c4b7fe8a0cfc78db7126699b02
接下来我们查询数据库中的所有表的名称,使用-1' union select database(),group_concat(table_name) from information_schema.tables where table_schema='dvwa' #
这段代码通过闭合字符串、注释截断和UNION查询,从系统表获取数据库表名信息,效果如下:
942cbc3086ff736617b0f78068bcc6ca
可以直接可以看到有users和guestbook两张表。
我们再尝试在users表中获取所有的字段名,使用-1' union select database(),group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' #,效果如下:
0a020ede1304e6d0108b4665e33c8ba0
这段代码通过查询系统元数据表(information_schema.columns)来批量获取目标表的所有字段名称。
之后我们就可以针对性的查询出各用户的用户名和密码,效果如下:
b34ce862b0726d5dd13ed19a21205199
可以看到用户名很清楚,但是密码被加密了。根据128bit长度,尝试用MD5进行破解,发现确实是MD5:
851add76af6ba1d74d446642c2faef5b
由此我们知道admin用户的密码是password。

(6.2) XSS(DOM)

这里让我们选择不同的标签,可以注意到当我们选择不同的标签时url会产生变化,会出现一个叫做default的参数,如图所示:
4616c6fad0ae9a1c8a90b01f973a918c
尝试对default的值直接修改为我们的代码,修改值为<script>alert(1)</script>,成功注入,效果如下:
5c065639f2cb76f9c07db238f5440ed8

(6.3) XSS(Reflected)

发现了一个Name字段,也是直接在URL里显现了:
cb2e79a2821ce3d6be99c75b439d91c1
进行类似上一问的操作,成功:
882cffbf5789b4f9ad4a7d351f57069e

(6.4) XSS(Stored)

这里提供两个字段。我们还是使用老套路<script>alert(1)</script>,发现第二个可以成功,但是第一个会提示“字符串长度限制”而失败。
我们可以直接使用F12对前端代码进行查看,发现这个限制是放在前端的,我们直接修改即可:
fbd7f88a2631eef654723e1ad9863f32
a7d445d5e0ae069938ccb150fa4be3fb
修改后我们注入的alert就可以执行两遍了。这也说明name和message字段都存在存储型XSS注入点。

(6.5) CSRF

这里是提供了一个需要我们对密码进行修改的网页。在URL也可以发现上面有password_new和password_conf这两个参数:
29297749ce36a16c7070e159ae817684
说明这里应该是使用GET进行服务器交互的。我们可以人为对URL进行编辑修改:
619dec28cf0dcbed4928c8e07d63dcb0
一旦运行这个URL,对应账户密码就被修改了。

3.问题及解决方案

  • 问题1:DVWA的配置比较麻烦
  • 解决方法1:在Kali上配置,同时结合AI的帮助,配置成功了。

4.学习感悟

前人栽树后人乘凉。我们需要及时借鉴前人的智慧。

参考资料

posted @ 2025-11-30 14:43  20232313-吴至远  阅读(3)  评论(0)    收藏  举报