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

一、实验内容

(一)总结本周学习内容

本周主要学习了web安全,首先是从前端技术(包括HTML、JavaScript、CSS以及Web前端框架)和后端技术(主要使用C、Java、PHP、Python、C#等语言)引入,随后学习了:

  • SQL注入攻击(通过构造特殊的SQL语句,注入到Web应用的输入字段中,从而绕过正常的身份验证和数据访问控制)
  • XSS跨站脚本攻击(利用网站对用户提交数据没有进行充分的转义处理或过滤的缺点,添加恶意代码到Web页面中)
  • CSRF跨站请求伪造攻击(挟持用户在当前已登录的Web应用程序上执行非本意的操作)
  • Burpsuite工具(提供拦截、修改、重放HTTP请求的功能,以及自动化扫描和漏洞利用等功能)
  • 其他Web安全相关内容(介绍了pikachu漏洞平台,涵盖了暴力破解、Cross-Site Scripting、CSRF、SQL-Inject等多种漏洞类型)

(二)实验内容

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

二、实验过程

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

1、安装phpstudy,启动Apache服务

image

2、创建网站(127.0.0.2)

image

3、编写简单的html界面(包含GET和POST两种提交方式)

利用工具sublime_tex编写:

点击查看代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>用户注册表单</title>
    <script>
        // 通过JS设置表单提交方式为 GET
        function setGETMethod() {
            document.getElementById("registration-form").method = "GET";
        }

        // 通过JS设置表单提交方式为 POST
        function setPOSTMethod() {
            document.getElementById("registration-form").method = "POST";
        }
    </script>
</head>
<body>

    <h1>用户注册表单</h1>
    
    <!-- 表单开始 -->
    <form id="registration-form" action="/submit_registration">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required><br><br>

        <label for="email">电子邮件:</label>
        <input type="email" id="email" name="email" required><br><br>

        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required><br><br>

        <label for="confirm-password">确认密码:</label>
        <input type="password" id="confirm-password" name="confirm-password" required><br><br>

        <label>性别:</label>
        <input type="radio" id="male" name="gender" value="male">
        <label for="male">男</label>
        <input type="radio" id="female" name="gender" value="female">
        <label for="female">女</label><br><br>

        <label for="birthdate">出生日期:</label>
        <input type="date" id="birthdate" name="birthdate"><br><br>

        <label for="bio">个人简介:</label><br>
        <textarea id="bio" name="bio" rows="4" cols="50"></textarea><br><br>

        <!-- 提交按钮:GET提交 -->
        <input type="submit" value="以GET方式提交" onclick="setGETMethod()">
        <!-- 提交按钮:POST提交 -->
        <input type="submit" value="以POST方式提交" onclick="setPOSTMethod()">
    </form>

</body>
</html>

4、将编写的html文件放到网站文件下:(E:\phpstudy\phpstudy_pro\WWW\127.0.0.2)

image

5、浏览器访问:127.0.0.2/tky.html

image

得到如上图的简单表单

6、填写表单信息:

image

(1)以GET方式提交:

image

发现数据都通过url传递,在url上有所显示

(2)以POST方式提交:

image

发现url上没有提交信息

7、GET和POST的区别

  • GET 提交:数据会附加在URL后,适用于查询或获取数据,数据量有限,且不适合提交敏感信息。
  • POST 提交:数据通过HTTP请求体发送,适用于提交敏感信息(如密码)或大量数据。

(二)Web前端javascipt

1、编写带有JavaScript验证用户名、密码的规则,在用户点击登陆按钮后回显“欢迎+输入的用户名”功能的代码:

点击查看代码
<!DOCTYPE html>
<html>
<head>
    <title>20222422tky</title>
    <script>
        function validateForm() {
            var username = document.forms["loginForm"]["username"].value;
            var password = document.forms["loginForm"]["password"].value;
            
            if (username.length < 3 || password.length < 6) {
                alert("Username must be at least 3 characters long and password at least 6 characters long.");
                return false;
            }
            
            // 这里存在XSS漏洞,因为直接将用户输入显示在了页面上
            document.write('欢迎' + username);
            return false; // 阻止表单实际提交,仅用于演示
        }
    </script>
</head>
<body>
    <h1>20222422TKY</h1>
    <form name="loginForm" onsubmit="return validateForm();" method="post">
        <label for="username">username:</label>
        <input type="text" id="username" name="username" minlength="3" required>
        <br>
        <label for="password">password:</label>
        <input type="password" id="password" name="password" minlength="6" required>
        <br>
        <input type="submit" value="Login">
    </form>
    <div id="welcomeMessage"></div> <!-- 用于显示欢迎消息 -->
</body>
</html>

2、测试页面功能

(1)不输入用户名:

image

提示不能为空

(2)输入不符合要求用户名:(长度至少为3个字符)

image

提示用户名需要符合要求

(3)不输入密码

image

提示密码不能为空

(4)输入不符合要求密码:(长度至少为6个字符)

image

提示密码需要符合要求

(5)输入正确格式

image

提示欢迎+用户名,登陆成功

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

用户名输入;
<script>alert('20222422正在攻击!')</script> <h1>20222422nb</h1>

image

image

发现注入成功

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

1、安装phpstudy,启动mysql服务

image

启动数据库工具:SQL_Front

image

2、建库,创建用户

image

数据库:tky
用户名:tkykk
密码:123456

3、修改密码

image

密码改为:654321

image

4、建表

建一张有用户名和密码信息的表,sql语句如下:

点击查看代码
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,  -- 主键,自增长
    username VARCHAR(50) NOT NULL,      -- 用户名字段,最大长度 50,不能为空
    password VARCHAR(255) NOT NULL,      -- 密码字段,最大长度 255,不能为空
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 创建时间,默认为当前时间
);

image

image

5、插入数据

(1)sql语句插入:
INSERT INTO users (username, password) VALUES ('tky', '20222422');

image

image

用户名:tky
密码:20222422

(2)SQL_Front可视化界面直接插入

image

用户名:kk
密码:123456

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

1、编写PHP网页,连接数据库,代码如下:

点击查看代码
<?php
session_start();
 
// 数据库连接参数
$servername = "localhost";
$dbusername = "tkykk";
$dbpassword = "654321";
$dbname = "tky";
 
// 创建数据库连接
$conn = new mysqli($servername, $dbusername, $dbpassword, $dbname);
 
// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
 
// 如果表单已提交
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $inputUsername = $_POST['username'];
    $inputPassword = $_POST['password'];
 
    // 查询数据库中的用户
    $result = $conn->query("SELECT * FROM users WHERE username = '$inputUsername' AND password = '$inputPassword'");
 
    if ($result->num_rows > 0) {
    
    
        // 如果用户存在,获取其信息
        $row = $result->fetch_assoc();

        $_SESSION['loggedin'] = true;
        $_SESSION['username'] = $inputUsername;
       echo "欢迎 " .$inputUsername. "!登录成功!";
            // 这里可以重定向到其他页面
            // header("Location: protected_page.php");
            // exit();
        
    } else {
        echo "用户 " . $inputUsername. "登录失败";
    } 
 
    // 关闭结果集
    $result->close();
}
 
// 关闭数据库连接
$conn->close();
?>

<!DOCTYPE html>
<html>
<head>
    <title>20222422用户登录</title>
</head>
<body>
    <h2>20222422 登录界面</h2>
    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
        用户名: <input type="text" name="username" required><br>
        密码: <input type="password" name="password" required><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

数据库服务器:localhost
用户名:tkykk
密码:654321
数据库名称:tky
数据库数据:
用户名:tky 密码:20222422
用户名:kk 密码:123456

2、进行用户认证

(1)输入正确用户名、密码:

image

回显欢迎+用户名

(2)输入错误用户名、密码:

image

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

因为回显的时候没有对提交数据进行转义处理或者过滤,所以当用户名输入<script>alert("20222422正在攻击")</script>时:

image

执行插入语句,实现xss攻击

(六)安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击

1、DVWA平台

(1)SQL注入

image

输入1查看正常查询数据

注入语句1’ or 1=1#

image

发现查看到了所有用户信息,注入成功

(2)XSS攻击:(反射型)

随便输入一个:

image

正常回显Hello+用户名

输入<script>alert(/20222422/)</script>

image

攻击成功

(3)CSRF攻击

image

正常输入:
更改密码:654321
确认更改密码:654321

使用Burp suite拦截

image

生成CSRF Poc:

image

可以看到提交信息

更改修改密码:

image

更改为666666

生成链接:

image

在生成的链接里点击:

image

image

发现提交信息被修改,攻击成功

用修改密码登录:

image

登陆成功

2、webgoat平台

(1)SQL注入

image

如图所示注入后为:SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or '1' = '1',获取到所有人信息

(2)XSS攻击

直接输入<script>alert("20222422")</script>进行XSS注入

image

攻击成功

(3)CSRF攻击

image

题目要求:要求外部触发表单然后会返回一个数值flag

点击提交,抓取表单数据包

image

修改refer字段:

image

意思就是不能从webgoat触发这个url,最简单的方法就是修改请求的refer,refer表示这个请求从哪个网站来的,合理改为baidu.com

获取flag:

image

输入获取的flag值(54001)

image

攻击成功

三、问题及解决方案

  • 问题1:在用XSS攻击自己的html表单的时候,输入<scipt>alert("20222422")</script>的时候,可以看出用户名确实不回显了,但是不会跳出警告弹窗
  • 问题1解决方案:

image

回显数据改为 document.write('welcome ' + username);后成功

  • 问题2:在搭建DVWA后,发现使用时数据库有异常,不能正常查询数据
  • 问题2解决方案:如下图

image

重置完数据后后解决。

  • 问题3:在编写php连接mysql数据库的时候,发现连不上
  • 问题3解决方案:在代码中发现数据库用户的密码少了一个字符,更改后得以解决。

四、学习感悟、思考等

在本次实验中,我对 Web 安全的各个方面有了更为深入的理解,涵盖了从前端到后端的多个环节,包括 HTML 表单、JavaScript、MySQL 数据库以及 PHP 编程。同时,我还实践了常见的 Web 安全漏洞,如 SQL 注入、XSS 攻击和 CSRF 攻击。这些知识和技能的学习,不仅让我意识到 Web 安全的重要性,也让我深刻认识到开发人员在设计和实现 Web 应用时需要时刻保持对潜在风险的警惕。
本次实验让我全面了解了 Web 开发中可能面临的各种安全问题,从前端到后端,从数据库到用户认证,都涉及到大量的安全隐患。通过实践,我掌握了如何通过合适的安全措施来防止常见的 Web 攻击,例如 SQL 注入、XSS 攻击和 CSRF 攻击等。在未来的学习过程中,我将更加注重安全性,采取必要的防护措施,以确保 Web 应用的安全性和稳定性。

参考资料

posted @ 2024-12-09 16:55  某热心市民  阅读(9)  评论(0编辑  收藏  举报