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

1.实验内容

1.1 本周学习内容回顾

  1. SQL注入原理

  2. Web安全的相关基础知识

  3. 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

 systemctl start apache2 # 开启Apache服务

在浏览器中输入:127.0.0.1,发现Apache开启成功,如下图所示:

2.1.2 编写含有表单的HTML

在kali终端输入vi /var/www/html/2427_test.html命令( 或点击/var/www/html文件夹下的html文件),编辑创建一个登陆界面,HTML代码如下:

<!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/2427_test.html

结果如下图所示:

2.2 Web前端javascipt

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

具体代码如下所示:

<script>
	function login() {
	    const username = document.getElementById("username").value;
	    const password = document.getElementById("password").value;

	    // 检查账号和密码是否为空
	    if (username === "" || password === "") {
	    alert("Username or password cannot be null!");
	    return;
	    }

	    // 检查密码是否正确
	    if (password !== "20222427") {
	    alert("Your password is wrong!");
	    return;
	    }

	    // 显示欢迎信息
	    document.body.innerHTML = "Welcome, " + username + "!";
      }
</script>

如下图所示:

2.2.2 浏览器打开编辑的网页

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

当输入的账号或者密码为空,会提示 :username or password can not be null!

如果输入的密码错误,则会提示:Your password is wrong!

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

2.2.3 尝试注入攻击

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

输入的结果如下图所示:

注入JavaScript,在网页的账号的文本框中输入<script>alert("xwt")</script>,密码不变。

输出的结果如图所示:

表明我们已经注入成功。

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

2.3.1 打开kali中安装并启动MySQL

在终端输入如下指令:

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 'xwt'@'%' IDENTIFIED BY '20222427';命令创建一个名为xwt的用户,允许该用户从任何主机('%' 表示任何主机)连接到数据库,并使用密码 20222427 进行身份验证。具体如下图所示:

2.3.3 建库

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

具体如下图所示:

2.3.4 建表

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

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

2.3.5 授权

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

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

具体如下图所示:

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

2.4.1 kali终端输入vi /var/www/html/2427.php命令创建一个php文件

编写代码具体如下:

<?php  
  
// 设置数据库服务器的名称  
$servername = "localhost";  
  
// 设置连接数据库的用户名  
$username = "root";  
  
// 设置连接数据库的密码  
$password = "你的密码";  
  
// 设置要连接的数据库名  
$dbname = "20222427xwt";  
 
// 使用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 新建一个2427.html文件,使用创建的PHP脚本来处理登录验证

具体如下所示:

只需将表单的“action”属性指向“2427.php”即可实现。

2.4.3 浏览器打开编辑的网页

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

输入用户名:xwt,密码:20222427。效果如下:

输入用户名和错误的密码,观察输出结果:

可以得知我们成功实现了用户认证。

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

2.5.1 实现SQL注入

在账号的文本框中输入'or 1=1 #,密码随便输入,具体如下:

这个账号数据库中并没有,但是因为1=1始终为真,并且# 后面的内容被注释掉了,所以将返回所有记录,如图所示,SQL注入成功。

2.5.2 实现XSS攻击

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

发现我们攻击成功。

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

先去下载webgoat.jar文件,再将文件传入kali。

使用指令java -jar webgoat-2023.8.jar(你的文件名)启动webgoat。

当所有的输出结束之后,在kali的浏览器中输入http://localhost:8080/WebGoat/login

登陆界面如下所示:

接下来,我们就可以完成SQL注入、XSS、CSRF攻击了。

2.6.1 SQL注入

选择过程:

A3->SQL injection(Intro)->9

观察提示,选择“ Smith'”“ or ”和“ '1'='1 ”填入

"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + “'”;这句话,要求能够显示所有的用户信息,可获得信息的条件为first_name且last_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攻击

选择A3Cross Site Sorpting→选择7

输入 ,提示框告警弹出,提示20222427XSS

攻击成功。

2.6.3 CSRF攻击

选择A10-> Cross-Site Request Forgeries3

点击Submit Query按钮:

发现此时我们需要的flag值是NULL。

我们需要自己进行一次CSRF攻击,现在提取Submit Query按钮的html代码,创建一个新的html文件CSRF_2427.html

具体代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>你的标题</title>
</head>
<body>
	<form accept-charset="UNKNOWN" id="basic-csrf-get" method="POST"
		name="form1" target="_blank" successcallback=' '
		action="http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag">
		<input name="csrf" type="hidden" value="false"> 
		<input type="submit" name="submit">

	</form>

</body>
</html>

如图所示:

然后,在kali的浏览器中访问html文件:127.0.0.1/文件名

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

此时,可以发现flag已不是null,且值为35605

重新打开WebGoat的CSRF攻击页面,输入获得的flag值35605

攻击成功。

3.问题及解决方案

  • 问题1:发现进行注入JavaScript,无法正常输出用户名

  • 问题1解决方案:最后在html代码中发现采用的输出代码为document.body.innerHTML =...这段代码会将读取的数据动态插入html的<body>元素中,但是我们输入<script>alert("...")</script>,貌似无法正常读取,后来尝试改用代码:document.write(),此时就达到了我们的预期,会弹出一个警告框。

  • 问题2:编写PHP网页的过程中,验证用户时,发现无法正常跳转PHP页面

会出现无法显示页面的情况:

  • 问题2解决方案:由于重启过kali,且只启动了Apache,未启用数据库,重新启动数据库,即可解决该问题。

  • 问题3:安装数据库安全脚本:mysql_secure,系统提示找不到该命令。

  • 问题3解决方案:按照系统提示,下载mariadb-client-compat,再次输入mysql_secure,即可下载。

4.学习感悟、思考等

  • 在本次实验中,亲自编写前端和后端代码,并且使用了一系列攻击,如:SQL注入、XSS攻击和CSRF攻击等,使我知道了日常我们所能见到的Web,都是经过安全处理的网页,Web安全对于每一个Web开发者至关重要。

  • 通过使用WebGoat工具进行攻击模拟,使我对安全漏洞有了更深的理解。例如,在进行SQL注入时,系统会提示攻击代码,攻击者只需要填入合适的对象(选项),就可以让WebGoat自动攻击,获得数据库内的所有用户信息。

  • 最后,本次实验也是网络攻防课程的最后一次实验,通过本次及以前的实验,使我掌握了一些网络攻击的方法,以及如何去防范这些攻击的思路,虽然在每次实验中,都会遇到大大小小的问题,但每次解决这些问题的过程就是学习的过程。还是要说一句:感谢学长学姐们的实验报告,我无法想象如果没有借鉴资料。我该如何完成这些实验。

参考资料

posted @ 2024-12-03 14:50  20222427夏文韬  阅读(45)  评论(0编辑  收藏  举报