20222427 2024-2025-1 《网络与系统攻防技术》实验八实验报告
1.实验内容
1.1 本周学习内容回顾
-
SQL注入原理
-
Web安全的相关基础知识
-
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攻击
选择A3
→Cross Site Sorpting
→选择7
输入 ,提示框告警弹出,提示20222427XSS
攻击成功。
2.6.3 CSRF攻击
选择A10
-> Cross-Site Request Forgeries
→3
点击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自动攻击,获得数据库内的所有用户信息。
-
最后,本次实验也是网络攻防课程的最后一次实验,通过本次及以前的实验,使我掌握了一些网络攻击的方法,以及如何去防范这些攻击的思路,虽然在每次实验中,都会遇到大大小小的问题,但每次解决这些问题的过程就是学习的过程。还是要说一句:感谢学长学姐们的实验报告,我无法想象如果没有借鉴资料。我该如何完成这些实验。