20202411 2022-2023-2 《网络与系统攻防技术》实验八实验报告
这是一个目录
1.实验内容
本次的实验内容非常的丰富,涉及到的方面也非常的多。首先通过Debian自带的Apache开启Web前端的实验,能够制作简单的网站页面,通过表单进行信息的提交。结合JavaScript,进行提交信息的判别并进行跳转。在后端使用MySQL数据库,进行一些基本的数据库操作,将前后端相结合,进行登录演示。通过这些步骤,我们相当于搭建了一个目标靶机,然后我们通过这歌靶机进行SQL注入和XSS攻击测试。除此之外,使用WebGoat平台进行SQL注入,XSS攻击和CSRF攻击模拟。
2.实验内容
2.1-Web前端HTML
因为Kali是基于Debian进行添加了一些特殊的东西的,所以Kali还是继承了一些Debian的东西,就比如Apache,而且这是默认开启的,可以在Shell中输入
service apache2 start
进行Apache的开启,然后输入
open http://127.0.0.1/
就能够在浏览器中打开Apache的默认页面,如果出现就说明Apache没问题。
接着理解一下HTML,表单和GET,POST方法。这次就让Bing AI来回答一下好了。反正可以用ChatGPT。
HTML是一种标记语言,用于创建网页。表单是HTML中的一种元素,用于收集用户输入的数据。POST和GET方法是HTTP协议中的两种请求方法,用于向服务器发送数据。POST方法将表单数据包含在请求体中发送到服务器,而GET方法将表单数据附加在URL中发送到服务器。POST方法通常用于提交敏感数据,如用户名和密码等,而GET方法通常用于不敏感的信息,如分页等。
再用ChatGPT写一个简单的登录页面,其中包括判定用户名和密码是否为空的JS代码,还有返回的登录成功和登录失败的PHP页面。
2.2-Web前端javascipt
先给上完整的代码。
login.html
<!DOCTYPE html>
<html>
<head>
<title>20202411</title>
<style>
body {
background: linear-gradient(to bottom right, #00aaff, #ff00aa);
font-size: 2em;
color: white;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
h1 {
animation: jump 1s infinite;
}
@keyframes jump {
0% {
transform: translateY(0);
}
50% {
transform: translateY(-10px);
}
100% {
transform: translateY(0);
}
}
p {
margin-top: 2em;
}
</style>
<script>
function validateForm() {
var username = document.forms["loginForm"]["username"].value;
var password = document.forms["loginForm"]["password"].value;
if (username == "" || password == "") {
alert("Please enter both username and password.");
return false;
}
}
</script>
</head>
<body>
<h1>20202411</h1>
<h2>Login Form</h2>
<form name="loginForm" action="login.php" method="POST" onsubmit="return validateForm()">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="Submit">
</form>
<p>powered by ChatGPT</p>
</body>
</html>
login.php
<!DOCTYPE html>
<html>
<head>
<title>20202411</title>
<style>
body {
background: linear-gradient(to bottom right, #00aaff, #ff00aa);
font-size: 2em;
color: white;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
h1 {
animation: jump 1s infinite;
}
@keyframes jump {
0% {
transform: translateY(0);
}
50% {
transform: translateY(-10px);
}
100% {
transform: translateY(0);
}
}
p {
margin-top: 2em;
}
</style>
</head>
<body>
<h1>20202411</h1>
<?php
$username = $_POST["username"];
echo "<p>Welcome, $username!</p>";
?>
<p>powered by ChatGPT</p>
</body>
</html>
理解一下JavaScript和DOM,看看BIng AI的回答。
Javascript是一种脚本语言,用于在网页中添加交互性。DOM(文档对象模型)是一种API,用于访问和操作HTML文档的元素。它允许JavaScript通过添加、删除和修改HTML元素来动态地更新网页。DOM将HTML文档表示为一个树形结构,其中每个元素都是一个节点。节点可以具有属性、方法和事件处理程序,这些属性、方法和事件处理程序可以通过JavaScript进行访问和操作。希望这能帮到你!
2.3-Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
Kali应该也是默认安装MySQL的,在Shell中输入
service mysql start
开启MySQL服务,然后因为不知道密码是什么,所以用root权限进行登录,就不需要密码。输入
sudo mysql -u root
show databases;
查看已有数据库信息。
use mysql;
select user, password, host from user;
set password for root@'localhost'= password('20202411');
select user, password, host from user;
flush privileges;
更新密码为20202411,然后就可以通过这个密码登录root用户。
在MySQL中输入
create database csh;
show databases;
use csh;
create table login (username VARCHAR(20),password VARCHAR(20));
show table;
insert into login values('20202411@csh.com','20202411');
select * from login;
grant select,insert,update,delete on csh.* to chenshuhuan@localhost identified by "20202411";
新建名为csh的数据库,并在这个数据库中创建名为login的表格,表头有username和password。再在这个表中插入用户名为20202411@csh.com和密码为20202411的条目。最后再添加名为chenshuhuan的用户可以通过本机使用20202411作为密码进行登录。这个是给前端去连接数据库提供条件。
mysql -u chenshuhuan -p
输入密码后可以连接上数据库说明创建用户成功。
2.4-Web后端:编写PHP网页,连接数据库,进行用户认证
将之前的php文件更改一下,一边连接上数据库。
<!DOCTYPE html>
<html>
<head>
<title>20202411</title>
<style>
body {
background: linear-gradient(to bottom right, #00aaff, #ff00aa);
font-size: 2em;
color: white;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
h1 {
animation: jump 1s infinite;
}
@keyframes jump {
0% {
transform: translateY(0);
}
50% {
transform: translateY(-10px);
}
100% {
transform: translateY(0);
}
}
p {
margin-top: 2em;
}
</style>
</head>
<body>
<h1>20202411</h1>
<?php
$uname=$_POST["username"];
$pwd=$_POST["password"];
$query_str="SELECT * FROM login where username='$username' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "chenshuhuan", "20202411", "csh");
$query_str1="use csh;";
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
echo " Successfully connected!";
if ($result = $mysqli->query($query_str1))
echo"<br>Success into database!";
if ($result = $mysqli->query($query_str)) {
if ($result->num_rows > 0 ){
echo "<br> {$uname}:Welcome! <br> ";
} else {
echo "<br> Login Fail! <br> " ;
}
$result->close();
}
$mysqli->close();
?>
<p>powered by ChatGPT</p>
</body>
</html>
然后在页面中输入正确的用户名和密码就会跳转到成功的php网页,输入错误的用户名或密码就会跳转的失败的php网页。
2.5-最简单的SQL注入,XSS攻击测试
要进行SQL注入攻击,这个栗子还比较简单,因为我们的SQL查询语句是
SELECT * FROM login where username='$username' and password='$pwd';
如果我们在用户名里面输入’ or 1=1#,密码随便填,比如123,那么生成的SQL查询语句就是
SELECT * FROM login where username='' or 1=1# and password='$pwd';
后面密码那部分被注释掉了,1=1恒成立,所以直接登录成功。
再来一个简单的XSS攻击,首先让Bing AI生成一件XSS攻击的模板
<script>
alert ('XSS attack');
</script>
理论上应该会出现XSS attack的告警弹窗,但是这里直接登录成功了,有点懵,不太清楚是什么原因。可能是FireFox屏蔽了弹窗。
2.6-安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击
首先安装java环境,并下载WebGoat的jar包。在Shell中输入
java -jar webgoat-2023.4.jar
open http://localhost:8080/WebGoat/
开启WebGoat,并在浏览器打开网页,看到这个网页就是成功的。注册用户并登录。鬼知道开个Web羊结果出来个web狼。
首先进行SQL注入攻击的模拟。这里选择一个字符型的SQl注入。给你"SELECT * FROM user_data WHERE first_name = ‘John’ AND last_name = ‘" + lastName + "’";这个一句话,要求能够显示所有的用户信息,在对应位置分别填入Smith’,or,‘1’=‘1’,生成的SQL语句就是SELECT * FROM user_data WHERE first_name = ‘John’ AND last_name = ‘Smith’ or 1=1;这样的情况1=1恒成立,所以就能够查到所有人的信息。
然后是XSS攻击,跟上一部分的实验中一样,也输入那串代码,就可以显示告警窗口,其中显示XSS attack。
最后一个部分是CSRF攻击,也就是跨站请求伪造攻击,将原始网页克隆一份,并新开一个FireFox实例打开,在开发者模式中,编辑目标网站,然后就可以进行CSRF攻击了。获取到的goal是8051。
3.问题及解决方案
- 问题1:不知道MySQL的密码。
- 问题1解决方案:默认情况下以普通用户的身份登录应该会产生一个随机密码,但是更方便的是直接通过root权限进行登录,可以免去密码的问题。
- 问题2:BurpSuite和WebGoat都使用8080端口导致冲突。
- 问题2解决方案:因为BurpSuite使用的端口为8080,而WebGoat使用的也是8080,所以会产生冲突,更改BurpSuite的端口为其他端口并更改FireFox的代理之后,bs并不能抓到Firefox发送的数据包,所以就不通过抓包重发的方式解决了。采用新建Firefox实例的方式进行攻击。
4.学习感悟、思考等
总算总算,这八次实验结束了。这次的实验确实非常多,但是涉及到的问题也非常多,这次实验学习使用了Apache进行建站,通过html和php进行表单的提交并进行一些基本的攻击实现。然后回想之前学习Django搭建网站时,经常会把CSRF防护给关闭,因为图一个方便,现在看来还是不太好的,容易受到一些攻击。
最后,感谢王老师这一个学期来的指导,这门网络攻防的课程确实不能仅仅停留在理论上,必须要在实践中才能够体会,而且能够发现许多有意思的东西和事情。