20192419 2021-2022-2 《网络与系统攻防技术》实验八实验报告

1.实验内容

(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)安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。

2.实验过程

2.1 Web前端:HTML

先使用netstat -tupln | grep 80查看80端口是否被占用,若没有信息就未被调用,若有进程则用kill processID(进程ID)杀死进程,然后使用service apache2 start命令打开Apache服务器,我们可以看到apache服务器成功开启。

使用回环IP:127.0.0.1检测Apache服务器是否开启,打开浏览器输入回环IP。

输入命令vi /var/www/html/test2419.txt来使用文本测试HTML是否正常运行

打开火狐浏览器输入URL:127.0.0.1/test2419.txt,进入网址应看到之前输入的文本

创建实验用文件夹exp8在目录vi /var/www/html/下,进入文件夹,创建包含表单的wty.html网站,命令为

mkdir /var/www/html/exp8
cd /var/www/html/exp8
gedit wty.html
cat wty.html

实现功能为:用户登陆界面,输入用户名及密码并提交:

<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body style="position: absolute; top: 40%; left: 50%; transform: translate(-50%,-50%); background-repeat: no-repeat; background-size: 100% 100%; background-attachment: fixed;">

	<font color="white"><h2 align="center">登录</h2></font>
	<center>
	<form action="login" method="post">
		<input placeholder="用户名" name="Name" class="user" type="username">
		<br></br>
		<input  placeholder="密码" name="Password" class="pass" type="password">
		<br></br>
		<input type="submit" value="登录">
	</form>
	</center>

</body>
</html>

如下图所示:

打开浏览器,输入正确URL查看编写的HTML页面,输入URL:127.0.0.1/exp8/wty.html

2.2 Web前端javascipt

在之前的基础上,先输入gedit /var/www/html/exp8/wty_java.html,我们为HTML登录页面添加用户命和密码的验证规则

wty_java.html代码如下:

<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="javascript"> 
function check(){
	if(document.getElementById("1").value == ""){
		alert("请输入用户名!");
		return false ;  
	}
	if(document.getElementById("2").value == ""){
		alert("请输入密码!");
		return false ;  
	}
}
</script>
</head>
<body style="position: absolute; top: 40%; left: 50%; transform: translate(-50%,-50%); background-repeat: no-repeat; background-size: 100% 100%; background-attachment: fixed;">

	<font color="white"><h2 align="center">登录</h2></font>
	<center>
	<form action="login.php" method="post" onsubmit="return check()">
		<input placeholder="用户名" name="Name" class="user" type="username" id="1"/>
		<br></br>
		<input  placeholder="密码" name="Password" class="pass" type="password" id="2"/>
		<br></br>
		<input type="submit" value="登录">
	</form>
	</center>
</body>
</html>

javascript部分的内容主要调用了check函数,检测输入合法性,其中,check函数使用了DOM元素获取用户输入的内容。

进入网页127.0.0.1/exp8/wty_java.html,我们看到输入用户名未输入密码时会提示我们“请输入密码”

而未输入用户名时提示请输入用户名

在用户点击登陆按钮后回显“欢迎+输入的用户名”以及尝试注入攻击:利用回显用户名注入HTML及JavaScript。由于需要使用php,因此会在后续的php章节中展示。

在用户点击登陆按钮后回显“欢迎+输入的用户名”

尝试注入攻击:利用回显用户名注入HTML及JavaScript

2.3 Web后端:MySQL基础

在Kali中启动MySQL服务:service mysql start

输入命令进入MySQL:mysql -u root -p

接着输入密码:

输入show databases;查看已有数据库基本信息

选择数据库,这里我们使用mysql这个数据库:use mysql;,查看数据库的用户信息:select user, password, host from user;

为数据库重新设置用户密码:set password for root@'localhost'=password('20192419');

更新权限:flush privileges;,退出:exit

重新登录MySQL,输入命令mysql -u root -p,输入新修改的密码20192419,输入use mysql使用数据库mysql

随后查看数据库用户信息select user, password, host from user;

使用create database exp8;创建新的数据库

使用新数据库:use exp8;

创建表:create table users (username VARCHAR(50),password VARCHAR(50));

插入数据:insert into users values('wty','20192419');

查看数据:select * from users;

输入命令grant select,insert,update,delete on exp8.* to wty@localhost identified by "20192419";来增加新用户,将数据库exp8的root权限(包括select,insert,update,delete)授权给当前用户

退出后使用新的用户名和密码重新登录mysql -u wty -p,登陆成功即说明增加新用户成功

查看数据库信息,发现转授权限成功

2.4 Web后端:PHP编写

创建测试文件2419.php测试浏览器能否正常查看php文件内容

cd /var/www/html/exp8
gedit 2419.php
cat 2419.php

下面实现javascript章节中的在用户点击登陆按钮后回显“欢迎+输入的用户名”的内容:

test.php代码内容:

<?php
echo "欢迎登录";
echo $_POST["Name"];
?>

然后打开127.0.0.1/exp8/wty_java.html文件修改表单的action属性为2419.php

打开127.0.0.1/exp8/wty_java.html网页后输入账户和密码(随意)后即可跳转到欢迎界面

下面实现javascript章节中的尝试注入攻击:利用回显用户名注入HTML及JavaScript的内容:

方法:登陆127.0.0.1/exp8/wty_java.html时将用户名改为<script>alert("hack!")</script>

注入html成功。

编写php网页,我们进入目录gedit /var/www/html/exp8/2419login.php,编写2419login.php

<?php
$uname=$_POST["Name"];
$pwd=$_POST["Password"];
echo $uname;
$query_str="SELECT * FROM users where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1","wty","20192419","exp8");
$query_str1="use exp8;";

/* check connection */
if ($mysqli->connect_errno) {
  printf("Connect failed: %s\n", $mysqli->connect_error);
  exit();
}
echo ":数据库连接成功!";
/* Select queries return a resultset */
if ($result = $mysqli->query($query_str)) {
  if ($result->num_rows > 0 ){
          echo "<br> {$uname}:欢迎登录!! <br> ";
  } 
  else {
      echo "<br> 账户名或密码错误!!!! <br> " ; }
  /* free result set */
  $result->close();
}
$mysqli->close();
?>

同时记得然后打开127.0.0.1/exp8/wty_java.html文件修改表单的action属性为2419login.php

浏览器打开wty_java.html,输入数据库中存放的数据信息登录,跳转内容为:

输入数据库中未存放的数据信息登录,跳转内容为:

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

(1)SQL注入

在 wty_java.html网站输入用户命为'or 1=1#,密码输入任意值都可以跳转入成功界面。

成功原因:此时查询语句为select * from users where name='' or 1=1 #' and password=' ';,又#在MySQL代表注释,查询语句实际为select * from users where name='' or 1=1为永真式,则这个条件恒成立,因此数据库不会报错。

跳转成功截图:

(2)XSS攻击

之前在/var/www/html/exp8/目录下建立过2419.php,用户登陆时用户名输入<a href="2419.php">点击进入文件</a>

点击上图的链接,就会进入文件查看到文件内容

2.6 安装Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例

实验要求:

  • JDK版本jdk14.0.1(若使用JDK1.8无法解压webgoat.jar包)
  • webgoat8.0.0.M14和webgoat8.1.0

1.SQL注入
字符串注入(String SQL Injection)

如图所示,根据提示可得本次调用数据库的SQL语句为:"SELECT * FROM users WHERE name = '"+ userName + "'";

我们输入用户名字就会返回该用户的信息,若我们输入'OR'1'='1,就会返回所有用户的信息

2.XSS攻击

使用webgoat8.0.0.M14时无法弹出窗口,这里我们改为使用webgoat8.1.0

反射 XSS(Reflected XSS)

确定哪个字段易受XSS的影响,验证服务器端的所有输入总是一种很好的做法。 当HTTP响应中使用未经验证的用户输入时,可能会发生XSS;

在反射的XSS攻击中,攻击者可以用攻击脚本制作一个URL,并将其发布到另一个网站,发送电子邮件,或者以其他方式让受害者点击它;

一个简单的方法来确定一个字段是否容易受到XSS攻击,就是使用alert.()或console.log()方法,用其中一个找出哪个领域是脆弱的。

题目描述:
点击Update Cart时,可以看到页面上输出,初步确认卡号字段可以实现xss。

然后在cart number处直接注入发现成功。

3.CSRF攻击

Basic Get CSRF Exercise

  • 题目的意思是在登录Webgoat的情况下通过一个外部的源触发请求,在响应中便能拿到flag。

先点击Submit Query:

得到响应:

这里提示我们当前这个请求是从同一个源发出的,查看headers:

这里有三个属性:

  • Host表示请求的目的地,包括域名和端口号
  • Origin表示请求是从哪发起的,包括协议、域名、端口号
  • Referer表示当前页面的来源完整地址,包括协议、域名、查询参数

我们下载安装好burpsuite后,在火狐浏览器下安装插件proxy开启代理,设置代理IP地址为127.0.0.1,端口为80(选择8080被webgoat占用),同时在burpsuit的代理->选项处也添加同样的代理,如图所示:

查看截获的包的referer处

将其发送到重发器并修改referer,发送可得到flag

提交成功

3.问题及解决方案

  • 问题:一开始burpsuite设置端口8080为监听端口时,反复出错error,显示端口被占用,当我改为8090时,burpsuite截获的包都是外网的包,而非内网webgoat的包。
  • 解决:修改代理端口为80后解决了问题

4.学习感悟、思考等

经过本次实验我回顾了上学期网络安全编程基础的相关内容,回顾网站的搭建和form表单的创建,以及JavaScript和PHP语言的相关作用。同时,也进行了简单的sql语句注入、XSS攻击和CSRF攻击的简单实现,本次实践让我收益匪浅。

posted on 2022-06-02 16:19  20192419万腾阳  阅读(70)  评论(0编辑  收藏  举报