20212408 2023-2024-2《网络与系统攻防技术》实验八实验报告

20212408 2023-2024-2《网络与系统攻防技术》实验八实验报告

一、实验内容

  • Web前端HTML

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

  • Web前端javascipt

理解JavaScript的基本功能,理解DOM;
在(1)的基础上,编写JavaScript验证用户名、密码的规则;在用户点击登陆按钮后回显“欢迎+输入的用户名”。
尝试注入攻击:利用回显用户名注入HTML及JavaScript。

  • Web后端

MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表。
编写PHP网页,连接数据库,进行用户认证。

  • 最简单的SQL注入,XSS攻击测试。
  • 安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。

二、实验过程

(一) Web前端HTML

1. 开启Apache服务

因为kali默认已经安装Apache服务,所以我们只需要输入命令 /etc/init.d/apache2 start开启服务

请添加图片描述
然后还可以输入命令 /etc/init.d/apache2 status 查看当前Apache的服务状态
请添加图片描述
然后open http://127.0.0.1/就能够在浏览器中打开Apache的默认页面,如果出现就说明Apache没问题。
请添加图片描述
请添加图片描述

2. 理解HTML,理解表单,理解GET与POST方法

HTML中的表单是一个用来收集用户输入数据并将其发送到服务器的元素。表单由一对和标签包围,可以包含各种输入元素,如文本框、复选框、单选按钮、下拉框等。
GET和POST是HTTP协议中用于向服务器提交表单数据的两种方法。它们的主要区别在于数据传输方式和用途:
GET方法:
使用GET方法提交表单时,表单数据会附加在URL的末尾,以查询字符串的形式发送到服务器。
GET方法适用于向服务器请求数据,常用于搜索表单等不涉及敏感信息的场景。
使用GET方法提交的表单数据可以在浏览器的地址栏中看到,因此不适合传输敏感信息,如密码等。
POST方法:
使用POST方法提交表单时,表单数据会作为请求的一部分发送到服务器,而不会显示在URL中。
POST方法适用于向服务器提交敏感信息,如用户注册、登录等操作。
使用POST方法提交的表单数据不会显示在浏览器的地址栏中,相对更安全。

进入 /var/www/html路径,新建一个表单的html文件。
但是这个路径只有root权限下才能够进行修改,这里有两种操作方式,一种是在 /var/www/html下,选择使用root权限打开文件夹即可新建文档,另一种是先新建,然后再移动。
所以开始我是在桌面进行文档的创建,然后使用sudo指令将文档复制到 /var/www/html下。
编写zsj.html文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>exp8</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<div id="login-box">
    <form name="loginForm" action="login.php" method="POST" onsubmit="return check()">
        <h1>20212408zsj</h1>
        <div class="form">
            <div class="item">
                <i class="fa fa-user-circle-o" aria-hidden="true"></i>
                <input type="text" placeholder="Username" id="username" name="username"/>
            </div>
            <div class="item">
                <i class="fa fa-key" aria-hidden="true"></i>
                <input type="password" placeholder="Password" id="password" name="password"/>
            </div>
        </div>
        <button type="submit">Login</button>
    </form>
</div>
</body>
</html>

然后使用CP指令将文档复制到 /var/www/html的目录下。
请添加图片描述
请添加图片描述
然后在浏览器中输入代码,启动打开网页,就是编写的html

127.0.0.1/zsj.html

请添加图片描述

(二)Web前端javascipt

1. 理解JavaScript的基本功能,理解DOM

JavaScript是一种用于网页开发的脚本语言,它赋予网页动态和交互功能。通过JavaScript,您可以控制网页上的元素,响应用户的操作,并改变网页的外观和行为。
DOM(文档对象模型)是JavaScript操作网页的接口。它将网页中的每个元素都表示为对象,使您能够使用JavaScript来访问、修改和控制这些对象。DOM以树形结构组织网页内容,每个元素都是一个节点,您可以通过DOM操作节点来改变网页的结构和外观。

在原有的html的基础上,添加一段JavaScript代码,判断用户是否输入账号、密码。

  • 编写身份鉴别规则的javascript
    制定简单的规则:用户名须为6-12位字母/数字/中文,密码为1-20位纯数字。将编写好的javascript脚本嵌入到前端html页面中,放于head中。
<script>
	function check(){
		var username = document.forms["loginForm"]["username"].value;
			var password = document.forms["loginForm"]["password"].value;
			var pattern1=/[\w\u4e00-\u9fa5]{6,12}/;
			var pattern2=/^[0-9]{1,20}$/;
			if (username == "" || password == "") {
				alert("Please enter both username and password.");
				return false;
			}
			else if(!pattern1.exec(username)){
			alert("invalid username!(6-12位字母/数字/中文)");
			return false;
			}
			else if(!pattern2.exec(password)){
			alert("invalid password!");
			return false;
			}
	}
	</script>

当我们输入无效的用户名或密码时,会弹出警告框:

  • 当只输入用户名,而不输入密码时:

请添加图片描述
提示我们需要输入用户名和密码,均需要有内容。

  • 当输入的用户名包含特殊字符

请添加图片描述
提示我们需要用户名须为6-12位字母/数字/中文

  • 当我们输入错误密码时

请添加图片描述
提示我们密码错误。

2. 编写登陆成功的php文件

PHP(HypertextPreprocessor)是一种流行的服务器端编程语言,广泛应用于Web开发领域。它被设计用于快速开发动态网站,并能够与HTML紧密集成。PHP可以生成动态页面内容、连接数据库、处理表单数据等。此外,PHP还可以在命令行下运行脚本。
PHP的代码通常嵌入在HTML中,在服务器端执行,然后将生成的页面发送给客户端浏览器。PHP语言易学易用,具有较高的灵活性,使其成为了许多Web开发者的首选工具之一。由于其广泛应用和强大的功能,PHP在Web开发中扮演着重要的角色,并持续受到开发者们的青睐。

编写登录使用的PHP文件,代码如下:

/*login.php*/
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>exp8</title>
    <link rel="stylesheet" href="style1.css">
</head>
<body>
<div id="login-box">
        <h1>20212408zsj</h1>
		<h1>
        <?php
		$username = $_POST["username"];
		echo "Welcome, $username!";
		?>
		</h1>
</div>
</body>
</html>

将上述php文件拷贝到/var/www/html目录下,接着,我们输入用户名、密码,将会跳转到如下界面:

登录跳转

3. 尝试注入攻击

准备注入脚本
合法的用户名会经由php代码块回显,若用户名是恶意脚本将会被执行,准备如下恶意脚本:

<script>alert("20212408zsj you are injected!")</script>

实施注入攻击:

JavaScript注入攻击

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

Kali也是默认安装MySQL的,所以我们只需要使用命令 systemctl start mysql或者service mysql start开启mysql

service mysql start
systemctl start mysql

请添加图片描述
用如下命令进入mysql数据库并查看database,初次进入mysql可用root用户,无需密码:

mysql -u root

请添加图片描述

show databases;  查看database

但是!!!这里需要注意,在MySQL数据库里每句话最后一句话都需要加上分号,否则这段代码就不会执行。
请添加图片描述
然后给这次实验新建一个数据库,将其命名为20212408zsj

create database 20212408zsj;

请添加图片描述
根据实验需要修改root用户的密码,可以新建用户、密码,否则下面的步骤中php无法成功连接数据库。

use mysql;
select host, user, password from user;
set password for 'root'@'localhost' = password('20212408zsj');
flush privileges;
# 退出mysql,用新密码进入,检验是否修改成功
exit
mysql -u root -p
<新密码>

请添加图片描述
然后为登录比对的数据建立一个新表,将其命名为identify,然后包含有用户名和密码。

use 20212408zsj;
create table identify (uname VARCHAR(20),passwd VARCHAR(20));
show tables;

请添加图片描述
然后在数据库中插入实验需要登入的用户名和密码,都设为我的学号姓名,20212408zsj。

insert into identify values('lyy20202409','123456');
select * from identify;

请添加图片描述

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

1.接下编写一个php文件用于连接数据库

具体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>exp8</title>
    <link rel="stylesheet" href="style1.css">
</head>
<body>
<div id="login-box">
        <h1>20212408zsj-php</h1>
	<h1>
        <?php	
		$usrname=$_POST["username"];
		$pwd=$_POST["password"];
 		$query_struser="SELECT * FROM identify where uname='$usrname' and passwd='$pwd';";
 		$mysqli = new mysqli("localhost", "root", "20212408zsj", "20212408zsj");
 		$query_strdatabase="use 20212408zsj";

 		/* check connection */
 		if ($mysqli->connect_errno) {
 			printf("Connect failed: %s\n", $mysqli->connect_error);
 		exit();
 		}
 		echo "Connected Successfully!";
 
 		/* Select queries return a resultset */
 		if ($result = $mysqli->query($query_strdatabase)) {
 			echo"<br>Success into database!";
 		}

 		if ($result = $mysqli->query($query_struser)) {
 			if ($result->num_rows > 0 ){
 				echo "<br> Welcome, {$usrname}! <br> login successfully";
 			} 
 			else {
 				echo "sorry <br>{$usrname} Login Fail! <br> " ; 
 			}
 		/* free result set */
 		$result->close();
 		}
 		$mysqli->close();
	?>
	</h1>
</div>
</body>
</html>

进行用户认证

  • 当输入正确的用户名、密码时结果如下:

数据库login成功

  • 当输入错误的用户名、密码时结果如下:

数据库login失败

(五)简单的SQL注入、XSS攻击测试

SQL注入攻击

要进行SQL注入攻击,因为我们的SQL查询语句是

SELECT * FROM login where username='$username' and password='$pwd';

如果我们在用户名里面输入’ or 1=1#,那么生成的SQL查询语句就是

SELECT * FROM login where username='' or 1=1# and password='$pwd';

后面密码那部分被注释掉了,1=1恒成立,所以直接登录成功。

但是由于之前用JavaScript脚本规定了用户名格式,所以要保证注入语句的长度符合要求

SQL注入

XSS攻击测试

XSS(Cross-Site
Scripting,跨站脚本攻击)是一种常见的Web安全漏洞,攻击者利用这种漏洞向网页中插入恶意脚本,当用户访问包含这些恶意脚本的页面时,攻击者就可以获取用户的敏感信息或者控制用户的行为。

XSS攻击通常分为三种类型:

存储型XSS:攻击者将恶意脚本存储在服务器端,当用户访问包含这些恶意脚本的页面时,恶意脚本被执行。

反射型XSS:攻击者将恶意脚本作为参数附加在URL中,当用户点击包含这些恶意脚本的URL时,恶意脚本被执行。

DOM-based XSS:攻击者利用客户端的漏洞,在浏览器中执行恶意脚本,从而达到攻击的目的。

对于xss攻击,我首先是选择和上面尝试的方法一样,使用:

<script>alert("20212408zsj you are injected!")</script>

代码进行攻击,将其填入用户名的框中尝试登录,但是发现登录失败,并且没有弹窗出现,具体情况如下:

xss攻击无弹窗


对于这种情况就很疑惑,于是我上网查询如何解决这个问题,从网上得到一种解决方法,首先将用于攻击的脚本语言放入JS文件中,我将攻击代码放入了zsjbad.js文件中:

alert("20212408zsj xss injected javascript!");

请添加图片描述
然后当我实施攻击时在用户名的框中输入如下代码:

<script src="zsjbad.js"></script>

发现这样可以攻击成功出现弹窗。

xss攻击有弹窗

在网上查询得到,在现代的Web浏览器中,包括Firefox在内,都有针对XSS(跨站脚本攻击)的防护机制。这些浏览器会尝试检测和阻止恶意的JavaScript代码执行,以保护用户的安全。
尝试直接在输入框中输入,如果浏览器成功地检测到这是一个恶意的脚本并阻止其执行,那么就不会弹出警告框。这种情况下,浏览器可能会在开发者工具的控制台中显示一条类似于"Blocked
loading mixed active content"的警告信息,指示脚本的加载被阻止了。

然而将攻击代码写入到一个外部JavaScript文件中,并通过引入的脚本)有不同的安全策略。
当浏览器加载外部脚本时,它通常会认为这些脚本是来自可信任的源(例如同一域名下的服务器),因此不会对其执行做过多的限制。这就使得攻击者可以利用这一点,将恶意代码写入到外部文件中,并通过引入这个外部文件来绕过浏览器的安全检查。

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

安装webgoat平台
下载webgoat-server-8.1.0.jar,是需要使用到的靶场文件,下载链接
进入Webgoat目录,输入如下命令启动服务:

java -jar webgoat-server-8.1.0.jar

随后在浏览器中输入http://127.0.0.1/Webgoat就可以了,随后注册登录就可以看到一下界面。
但是这里需要注意的是,版本不能下载过新,如果下载最新版会提示我们jar和Java版本不匹配。
请添加图片描述
我开始就是下载了最新的23年的版本无法运行,于是我又删除后选择下载8.1.0版本,才可以正常的使用,可以打开webgoat网站。
请添加图片描述
当输出结束时,打开浏览器,在搜索栏中输入:

http://localhost:8080/WebGoat/login

打开webgoat网站,注册用户名、密码,密码须6-10位,进入Webgoat网页:这里用的用户名和密码均为学号。
请添加图片描述
登录后如下
请添加图片描述

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

(1)SQL注入

1. String SQL injection

依次选择左侧栏A1→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. Compromising confidentiity with String SQL injection
请添加图片描述
已知要冒充的是John Smith,TAN为3SL99A
观察查询SQL语句,仍然是要构造永真式,输入Name为“ Smith ”(其实随意都行),TAN为“ 3SL99A’or’1’=‘1 ”成功获取,仍然是利用单引号配对,构造’1’='1’的永真式。

(2)xss攻击
  1. Reflected XSS

选择左侧栏A7→Cross Site Sorpting→选择7号
请添加图片描述

请添加图片描述

(3)CSRF攻击

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

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

选择左侧A8 Cross-Site Request Forgeries→3号→点击Submit Query按钮
请添加图片描述
点击Submit Query按钮后,跳转到flag页面,可发现flag值为null(如下图)
请添加图片描述
然后查看Submit Query按钮部分的html代码,这里使用快捷键Ctrl+F12可以查看网站源码,
请添加图片描述
这里的查找相当的麻烦,字很小而且很多内容是被折叠起来的1,当时为了找到submit这个单词感觉我瞅了好多分钟。
找到这段代码后将其复制下来,并放到新的HTML文件中,将其命名为zsjcsrf.html,并将其补充成完整代码。
请添加图片描述
要开启Apache功能,并修改action部分如上图红框,否则不会访问8080端口,无法跳转到正确的页面。
然后再浏览器中访问这个zsjCSRF.html文件:
请添加图片描述
发现这里只有一个相关的提交的按钮,点击Submit Query按钮后,再次跳转到flag页面
请添加图片描述
在这里可获取flag值
回到WebGoat CSRF攻击页面,输入上面获取到的flag值
但是这里出现问题,我虽然获取到明文的flag值,但是当我将它提交给webgoat时,它还是提示报错,这里就很抓马,不知道问题在哪。
请添加图片描述
很离谱,明明前面的实验过程和步骤都没有偏差,最终输出的值也是明文可见,但是提交结果却是错误,就很奇怪,不知道问题何在。

三、问题及解决方案

问题一、在进行xss攻击时,攻击没有弹窗显示。

出现问题的原因是现在的浏览器会对一些恶意脚本注入的语句进行检验,如果浏览器成功地检测到这是一个恶意的脚本并阻止其执行,那么就不会弹出警告框。所以就选择使用外部脚本对其进行攻击,当浏览器加载外部脚本时,它通常会认为这些脚本是来自可信任的源(例如同一域名下的服务器),因此不会对其执行做过多的限制。

问题二、在安装webgoat时提示jar包和Java版本不匹配

这个问题出现的原因是我的Kali是之前2022.2的版本,而最新的webgoat是2023年的,因此Kali自带的Java和jar包不匹配,无法进行解压运行。
这里有两种解决方法,一是可以对Kali中的Java进行更新,需要下载jdk等一大串的东西,比较麻烦,所以为了省事选择更换老版本的webgoat,同样也可以完成实验。

问题三、在靶场进行CSRF攻击时,虽然代码等都配置成功,也可以显示flag,但是提交过去却提示错误。

这个问题感觉很莫名其妙,因为我是根据学长的博客进行实验操作,过程中所需要的一些代码和运行结果也都是一致,但是结果却是错误。

解决方法(补):
这个问题我最后又解决了,但是结局的形式也很奇怪,就是我后来又重新启动了一遍电脑,然后重新打开webgoat,然后依次打开CSRF攻击的题目,但是这时候我没有选择点击submit query,而是选择直接打开我之前编写的CSRF攻击的HTML,这时候它会跳转出一个webgoat的登录页面,没有返回像之前那样的flag,这时候也不要慌,选择先登录再说,然后登进去再打开CSRF攻击的题目,然后再回到自己编写的CSRF攻击的页面submit query,这时候就会返回一个有flag的页面,将这个flag提交到刚刚登录的跳转页面中,这时就会提示结果正确!
在这里插入图片描述
个人认为可能是一个特殊的匹配机制,只有特定登录时才能出现正确的flag,保证实验的准确性,之前我没有弹出新的登录界面,提交在老的页面结果就不正确。

四、思想感悟

在本次Web安全实验中,我深入学习了SQL注入、XSS攻击和CSRF攻击等常见的Web安全漏洞,并通过编写前端和后端代码,以及使用WebGoat工具进行攻击模拟,加深了对这些漏洞的理解和认识。
通过实践,我意识到Web安全对于任何一个Web开发者来说都是至关重要的。深入了解攻击原理和常见漏洞,不仅有助于提高编写安全代码的能力,还能更好地保护用户的隐私和数据安全。特别是通过WebGoat工具,我能够更直观地了解攻击的过程和原理,以及如何防范这些攻击,这对我今后的Web开发工作将有很大帮助。
在实验过程中,遇到了一些困难和挑战,但通过不断尝试和学习,我逐渐掌握了一些防范攻击的方法。这是这学期网络攻防的最后一个实验,一学期实验做下来确实收获颇多,虽然有很多时候都在为各种各样的问题烦恼,但是收获颇丰,特别需要感谢学长学姐的详细的博客,帮助我们解决难题,也感谢强哥一学期的悉心教导!!

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值