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

1.实验内容

1.1 本周学习内容回顾

  • Web安全基础/前后端
  • SQL注入原理
  • XSS脚本攻击

1.2 实验要求

(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

2.1.1 安装并启动Apache

在kali终端输入如下命令:

netstat -tupln | grep 80    //查找正在监听TCP或UDP端口80的进程
systemctl start apache2     //启动Apache HTTP服务器
netstat -aptn               //显示系统上所有的TCP连接和监听套接字

结果如下图:

在浏览器中访问网址 http://127.0.0.1 ,发现Apache开启成功,如下图所示:

2.1.2 编写一个含有表单的HTML

在kali终端输入vi /var/www/html/20222410.html命令( /var/www/html/ 通常是Apache HTTP

服务器在Linux系统中用于存放Web内容的默认目录),编辑创建一个登陆界面,代码具体如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
 
<body>
    <h1>Login</h1>
    <form  method="post">
        <font>账号:</font>
        <input type="text" name="username" id="username"><br>
        <font>密码:</font>
        <input type="password" name="password" id="password"><br>
        <button onclick="login()">login</button>
    </form>
</body>
</html>

如下图所示:

2.1.3 浏览器打开编辑的网页

打开浏览器,访问网址 http://127.0.0.1/20222410.html

结果如下图所示:

2.2 Web前端javascipt

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

所用代码如下:

<script>
function login(){
const usrname=document.getElementById("username").value;
const password=document.getElementById("password").value;
if (username === "" || password === "") {  
    alert(" username or password can not be null!");  
    return;  
}  
 
 
else if (password !== "20222410") {   
    alert(" Your password is wrong!");  
    return;   
}
 
else { 
document.write("Welcome! "+ usrname) 
}
}
</script>

具体如下图所示:

2.2.2 浏览器打开编辑的网页

打开浏览器,访问网址 http://127.0.0.1/20222410.html
若输入的账号或者密码为空,会提示 username or password can not be null!

若输入的密码错误,会提示Your password is wrong!

输入密码正确,则登陆成功,打印Welcome!yinhao!

2.2.3 尝试注入攻击

注入HTML,在网页的账号的文本框中输入<h1>yinhao</h1>,进行HTML注入,密码不变

最后会在登陆界面输出一级标题yinhao,如下图所示:

  • 注入JavaScript
    在网页的账号的文本框中输入“”进行JavaScript注入<script>alert("yinhao")</script>,密码不变,最后会出现yinhao的提示框,如下图所示:

注入成功。

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

2.3.1 打开kali中安装并启动MySQL

kali有自带的数据库,在终端输入如下代码:

systemctl start mysql       //打开MySQL服务
systemctl status mysql      //显示MySQL服务的当前目前状态

service mysql start          //启动MySQL服务
mysql_secure_installation    //MySQL安全安装脚本
mysql -u root -p             //登录到MySQL数据库
use mysql                    //切换大MySQL数据库
show databases;               //列出MySQL服务器上的所有数据库

2.3.2 创建用户

输入create user 'yinhao'@'%' IDENTIFIED BY '20222410';命令创建一个名为yinhao的用户,允许该用户从任何主机('%' 表示任何主机)连接到数据库,并使用密码 20222410 进行身份验证。具体如下图所示:

2.3.3 建库

输入create database 20222410yh;命令创建数据库,再输入use 20222410yh命令使用该数据库,

具体如下图所示:

2.3.4 建表

输入create table user (username VARCHAR(30),password VARCHAR(20));命令创建一个名为user的表,该表包含两个字段:username和password。具体如下图所示:

使用mysql语言insert into user values('yinhao','20222410');插入数据,插入操作成功后可以输入select * from user命令查看数据表中的内容,具体如下图所示:

2.3.5 授权

输入如下命令,允许用户yinhao从任何主机连接到数据库,并对名为20222410yh的数据库拥有所有权限:

GRANT ALL PRIVILEGES ON 20222410yh.* TO 'yinhao'@'%';   //授予用户所有权限 
FLUSH PRIVILEGES;                                             //刷新权限

具体如下图所示:

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

2.4.1 kali终端输入vi /var/www/html/20222410.php命令创建一个php文件,编写代码具体如下:

<?php  
  
// 设置数据库服务器的名称  
$servername = "localhost";  
  
// 设置连接数据库的用户名  
$username = "root";  
  
// 设置连接数据库的密码  
$password = "123456";  
  
// 设置要连接的数据库名  
$dbname = "20222410yh";  
 
// 使用mysqli创建一个新的数据库连接  
$conn = new mysqli($servername, $username, $password, $dbname);  
  
// 检查连接是否成功  
if ($conn->connect_error) {  
    // 如果连接失败,输出错误信息并停止脚本执行  
    die("连接数据库失败: " . $conn->connect_error);  
}  
  
// 使用null合并运算符从POST请求中获取用户名,如果POST请求中没有该值,则将其设置为空字符串  
$username = $_POST['username'] ?? '';  
  
// 使用null合并运算符从POST请求中获取密码,如果POST请求中没有该值,则将其设置为空字符串  
$password = $_POST['password'] ?? '';  
  
// 创建一个SQL查询语句,用于从user表中查找与给定用户名和密码匹配的用户  
$sql = "SELECT * FROM user WHERE username = '$username' AND password = '$password'";  
  
// 执行SQL查询并获取结果  
$result = $conn->query($sql);  
  
// 检查查询结果中的行数是否大于0,即是否找到了匹配的用户  
if ($result->num_rows > 0) {  
    // 如果找到了匹配的用户,输出登录成功的消息  
    echo " 欢迎 ! 登陆成功!";  
} else {  
    // 如果没有找到匹配的用户,输出用户名或密码错误的消息  
    echo "用户名或密码错误!";  
}  
  
// 关闭数据库连接  
$conn->close();  
?>

2.4.2 修改之前的20222410.html文件,使用创建的PHP脚本来处理登录验证,具体如下所示:

记住要把head中的if等判定语句删掉

2.4.3 浏览器打开编辑的网页

打开浏览器,访问网址http://127.0.0.1/20222410.html

使用的登录账号和密码(yinhao、20222410)正确,效果如下:

使用的账号密码错误,效果如下:

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

2.5.1 实现SQL注入

在账号的文本框中输入20222410' or 1=1 #,密码随便输入(我输入的是“11111”),具体如下:

这个账号数据库中并没有,但是因为1=1始终为真,并且# 后面的内容被注释掉了,所以这个查询将返回

users表中的所有记录,而不是仅返回username为20222410的记录,由上图可知,SQL注入成功。

2.5.2 实现XSS攻击

在账号的文本框中输入<script>alert("yinhao")</script>,密码随便输入 ,结果如下:

出现提示框,XSS攻击成功。

2.6 安装Pikachu或类似平台,并完成SQL注入、XSS、CSRF攻击

参考下载教程:手把手教你在kali-Linux 2020.3安装webgoat_kali安装webgoat-CSDN博客
下载链接:https://github.com/WebGoat/WebGoat/releases
下载得到jar文件
文件复制到虚拟机上
启动webgoat:java -jar webgoat-2023.8.jar

当输出结束时,打开浏览器,在搜索栏中输入:
http://localhost:8080/WebGoat/login

打开webgoat网站,注册用户名、密码,密码须6-10位,进入Webgoat网页:这里用的用户名和密码均

为学号20222410

登录后如下:

接着,我们跟着学习一下SQL注入、xss攻击和xsrf的知识,下面展示部分成果。

2.6.1 SQL注入

依次选择左侧栏A3→SQL Injection(Intro)→9号
观察提示中所给SQL查询语句,选择“ Smith’ ”“ or ”和“ ‘1’=‘1 ”填入

给你"SELECT * FROM user_data WHERE first_name = ‘John’ AND last_name = ‘" + lastName + “’”;这个一句话,要求能够显示所有的用户信息,可获得信息的条件为first_name且last_name为真,first_name已给出,只需选择填入last_name。Smith’与last_name=后的第一个’(单引号)配对,‘1’='1与+lastName+"后的(单引号)配对,形成SELECT * FROM user_data WHERE first_name = ‘John’ AND last_name = ‘Smith’ or 1=1;的永真式,成功获取信息。

2.6.2 xss攻击

选择左侧栏A3→Cross Site Sorpting→选择7号

输入 <script>alert("20222410XSS")</script>,提示框告警弹出,提示20222410XSS

2.6.3 CSRF攻击

CSRF(Cross-Site Request

Forgery,跨站请求伪造)是一种常见的Web安全漏洞,攻击者利用用户已登录的身份,在用户不知情的情况下发送恶意请求到目标网站,以执行未经授权的操作。

攻击者通常会诱使用户访问包含恶意代码的页面,或者通过电子邮件等方式发送包含恶意链接的信息。当用户点击这些链接或访问恶意页面时,浏览器会自动发送之前预设好的请求,从而执行攻击者设定的操作,如更改账户信息、发起资金转移等。

选择左侧A10 Cross-Site Request Forgeries→3号→点击Submit Query按钮

点击Submit Query按钮后,跳转到flag页面,可发现flag值为null(如下图)

然后查看Submit Query按钮部分的html代码,这里使用快捷键Ctrl+F12可以查看网站源码,

将有关CSRF攻击的代码提取出来,保存到一个html文件

然后再浏览器中访问这个20222410yh.html文件

发现这里只有一个相关的提交的按钮,点击Submit Query按钮后,再次跳转到flag页面

在这里可获取flag值6381

回到WebGoat CSRF攻击页面,输入上面获取到的flag值6381

攻击成功。

3.问题及解决方案

  • 问题1:在在用户点击登陆按钮后回显“欢迎+输入的用户名”时,无法正常输出用户名
    打印结果为Welcome! [object HTMLInputElement]
  • 问题1解决方案:最后发现html的script代码中打印语句里我将usrname误写成了username,所以无法正常打印用户名。
  • 问题2:在安装mysql_secure时,提示找不到命令

  • 问题2解决方案:依照提示一步步安装即可。

  • 问题3:客户端无法通过 Unix 套接字文件(mysqld.sock)与数据库服务器建立连接

Enter current password for root (enter for none): 
ERROR 2002 (HY000): Can't connect to local server through socket '/run/mysqld/mysqld.sock' (2)
  • 问题3解决方案:推测可能是MariaDB 服务出了问题,在检查 MariaDB 服务状态并重新启动检查 MariaDB 服务后成功建立连接。

4.学习感悟、思考等

  • 在本次Web安全实验中,我深入探索了SQL注入、XSS攻击和CSRF攻击等常见的Web安全漏洞,并通过编写前端和后端代码,以及使用WebGoat工具进行攻击模拟,加深了对这些漏洞的理解和认识。实践过程中,我意识到Web安全对于任何一个Web开发者来说都是至关重要的。深入了解攻击原理和常见漏洞,不仅有助于提高编写安全代码的能力,还能更好地保护用户的隐私和数据安全。特别是通过WebGoat工具,我能够更直观地了解攻击的过程和原理,以及如何防范这些攻击,这对我今后的Web开发工作将有很大帮助。

  • 在实验过程中,我遇到了一些困难和挑战,但通过不断尝试和学习,我逐渐掌握了一些防范攻击的方法。这是这学期网络攻防的最后一个实验,一学期实验做下来确实收获颇多,虽然有很多时候都在为各种各样的问题烦恼,但是收获颇丰。特别需要感谢学长学姐的详细的博客,帮助我们解决难题,也感谢老师的悉心教导。通过本次网络攻防实验,我不仅掌握了Web前端和后端的基本技术,还熟悉了多种Web攻击手段及其防御措施,为我未来的学习和工作奠定了坚实的基础。未来,我将继续提升自己的技术水平,以更好地应对日益复杂的网络安全挑战。

posted @ 2024-11-30 17:50  Lelouch-vi  阅读(97)  评论(0编辑  收藏  举报