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

20192425 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.实验过程

基础知识

SQL注入

SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

  • 命令注入(Command Injection)

      概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
      
      原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
      
      目标:可以在目标主机上执行任何系统命令
    
  • 字符串型注入(String SQL Injection)

      概念:通过注入字符串绕过认证
    
      原理:基于以下查询语句构造自己的 SQL 注入字符串
    
      目的:尝试通过 SQL 注入将所有信用卡信息显示出来
    

XSS攻击

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的phishing攻击而变得广为人知。

XSS 钓鱼(Phishing with XSS)

原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁

目标:创建一个 form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam

绕过 CSRF 确认( CSRF Prompt By‐Pass)

  • 原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。

  • 目标:与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。

实践过程

(1)Web前端HTML

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

kali默认已安装Apache,直接使用sudo service apache2 start命令打开Apache服务即可。如图所示,如果没有任何错误提示,即表明成功开启。

此时在浏览器输入127.0.0.1,如果可以打开Apache的默认网页,则开启成功:

使用sudo su进入root权限模式,用cd /var/www/html进入Apache目录下,新建一个简单的含有表单的html文件20192425_form.html,内容如下:

html> 
<head> 
    <title>Login</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <style>
    body{
	    background-color:#d0e4fe;
        }  
    h1 {
	    color:orange;
	    text-align:center;
        }
    </style>
</head> 
<body> 
    <h1 align="center">Login</h1> 
        <center> 
            <form action="login.php" method="get"> 
                用户名:<input type="text" name="username" placeholder="请输入用户名"><br><br>

                密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password" placeholder="请输入密码"><br><br>

                <input type="submit" value="提交"> 
             </form> 
        </center> 
</body> 
</html>

使用浏览器打开制作的网页,在浏览器输入/var/www/html/20192425.html,结果如下图所示:


什么是表单?

表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分:       
    表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
    表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
    表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。


GET和POST请求的区别

  • get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
  • get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用”?”连接,而各个变量之间使用”&”连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
  • get传输的数据要受到URL长度限制(最大长度是 2048 个字符);而post可以传输大量的数据,上传文件通常要使用post方式;
  • 使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
  • get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是”%20”。ps:GET方式提交表单的典型应用是搜索引擎。GET方式就是被设计为查询用的。

(2)Web前端javascipt

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

在原有20192425.html基础上,添加一段JavaScript代码,以完成对用户名和密码是否为空的判断。修改后的代码如下:

<html> 
<head> 
    <title>Login</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <style>
    body {
	    background-color:#d0e4fe;
         }  
    h1 {
	    color:orange;
	    text-align:center;
        }
    </style>
</head>
<script language="javascript">
    function validateForm() { 
      var x = Form.username.value;
      var y = Form.password.value;
      
      if ((x == "")) {
        alert("用户名不能为空");
        return false;
      }else if((y == "")){
        alert("密码不能为空");
        return false;
      }else
        alert("欢迎"+x);
    }
    </script>
<body> 
    <h1 align="center">Login</h1> 
        <center> 
            <form action="login.php" onsubmit="return validateForm()" method="post" name="Form"> 
                用户名:<input type="text" name="username" placeholder="请输入用户名"><br><br>

                密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password" placeholder="请输入密码"><br><br>

                <input type="submit" value="提交"> 
             </form> 
        </center> 
</body> 
</html>

onsubmit="return validateForm()"表示点击提交按钮将会触发validateForm函数。

alert():将括号内的文本信息显示在弹框中,该弹框上有一个“OK”按钮,用户阅读完所显示的信息后,单击该按钮就可以关闭对话框。

首先尝试不输入用户名,发现弹框提示“用户名不能为空”

输入用户名,不输入密码,发现弹框提示“密码不能为空”

输入用户名和密码,发现弹框提示“欢迎+用户名”


DOM

DOM 是 W3C(万维网联盟)的标准。它允许程序和脚本动态地访问和更新文档的内容、结构和样式。HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。


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

首先,编写一个能够接收我们提交的用户名和口令的php页面,命名为login.php。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome!</title>
</head>
<body>
<h1 align="center">欢迎!<?php echo $_POST['username'];?></h1>
<h1 align="center">你的密码是:<?php echo $_POST['password'];?></h1>
</body>
</html>

在地址栏输入localhost/20192425.html,输入用户名、密码后,点击“提交”,页面便跳转至localhost/login.php界面,结果如下图:

尝试攻击,输入用户名时,可以输入script脚本语言 ,使其弹出窗口,并显示"hello sq!",结果如下图:

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

  • kali已经安装好了mysql,输入systemctl start mysql即可启动

  • 输入sudo mysql -u root -p进入mysql数据库,默认密码为空

  • 输入show databases; 查看数据库基本信息(一定要注意有分号)

  • 输入 use mysql 进入mysql数据库

  • 输入 show tables 查看mysql数据库中表的信息

  • 输入 select user, password, host from user; 查看user表的相关信息

  • 创建用户 CREATE USER 'sq'@'localhost' IDENTIFIED BY '20192425';

    上述代码的意思是:创建一个在本地登录的,名为sq,密码是20192425的用户。

    host:指定该用户在哪个主机上可以登陆,localhost表示在本地登录,通配符%表示该用户可以从任意远程主机登陆。


从图中可以看出,我们的密码是以密文的形式存储在数据库中的。

  • 建库建表

    创建一个名为sqtest的数据库 create database sqtest;

    在此数据库中创建一个名为usermessage的表

    REATE TABLE usermessage(	username VARCHAR(20), 	password VARCHAR(20));
    

    向该表中插入一条用户信息 INSERT INTO usermessage VALUES('sq', '20192425');

    输入select * from usermessage;查询表中的数据

  • 修改密码

    方法1:用SET PASSWORD命令格式:mysql> set password for 用户名@localhost = password('新密码');

    方法2:进入mysql数据库,使用ALTER命令修改MariaDB [mysql]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';MariaDB [mysql]> flush privileges; MariaDB [mysql]> exit;

    方法3:在命令行,直接使用mysqladmin修改格式:mysqladmin -uroot -poldpassword password newpassword

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

  1. PHP安装

输入命令 sudo apt-get install php (kali默认安装)

  1. PHP简单编程

编写测试代码test.php,测试PHP能否正常工作

<?php
echo ($_GET["a"]);
include($_GET["a"]);
echo "Hello word! This is 20192425sq php test page!<br>";
?>

在浏览器网址栏中输入localhost:80/test.php,可看到文件的内容,如下图所示:

还可以在浏览器网址栏中输入localhost:80/test.php?a=/etc/passwd,可看到/etc/passwd文件的内容:

  1. 编写login.php文件,连接MySQL
<?php
$uname=$_POST["username"];
$pwd=$_POST["password"];
echo $uname;
$query_str="SELECT * FROM usermessage where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1","root","20192425","sqtest");

/* 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();
?>

注意修改20192425.html中的action为login.php,在浏览器中输入127.0.0.1/login.html进入登录界面。

在表中存了sq和hkl两个用户的信息,接下来在登录页面输入用户名和密码,看是否连接数据库成功。

输入用户名:sq,密码:20192425,发现认证成功。

输入用户名和错误的密码,发现登录失败!

(5)最简单的SQL注入,XSS攻击测试

SQL注入
' or 1=1#

在登录界面用户名处输入' or 1=1#,密码任意输入,将用户名和密码填充到sql查询语句中,如下:

select * from usermessage where username='' or 1=1#' and pwd='XXX';


‘#’是注释符,其后面的内容将被注释掉,所以只剩下前面的1=1,这是一个恒成立的式子,因此无论密码是什么均可以成功的登录。

admin';#

在用户名中输入admin';# ,密码任意输入,放在sql语句中则为:

select * from usermessage where username='admin';#'and pwd='XXX';


‘#’后的部分被识别为注释,相当于执行一个仅查询用户名的操作,不需要匹配密码,admin换成任何一个你知道数据库中存在的用户名即可。

XSS攻击

将一张图片放在/var/www/html目录下,在用户名输入框输入< img src = "1.jpg">,密码任意,成功登录并读取图片!

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

安装Webgoat

下载webgoat,下载地址为https://github.com/WebGoat/WebGoat/releases,选择合适版本下载,直接拖入kali并创建一个webgoat的文件夹。

kali预装Java环境,在终端打开webgoat-server-8.0.0.M26.jar的文件夹,输入命令运行,java -jar webgoat-server-8.0.0.M26.jar,启动成功。

浏览器直接访问地址:127.0.0.1:8080/WebGoat/login.html,注册登入即可访问。

SQL注入攻击

代码中的查询构建了一个动态查询,使用相关输入字段,尝试从users表中检索所有数据,结果如下图所示:

XSS攻击

在HTTP响应中使用未验证的用户输入时,可能会发生XSS。在反射的XSS攻击中,攻击者可以使用攻击脚本创建URL,并将其发布到另一个网站、通过电子邮件发送,或者让受害者单击它。确定字段是否易受XSS攻击的一种简单方法是使用alert()或控制台,结果如下图:

CSRF攻击

登录时从外部源触发表单,响应将包括一个“标志”(数值),应该在下一页上获得的标志。

<html>
    <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="true">
        <input type="submit" name="submit">
		</form>
	</body>
</html>


3.问题及解决方案

  • 问题1:在进行XSS攻击时,用户名输入< img src="1.jpg" />输入密码点击提交后,页面会为我们显示出此张图片,无法显示此图片。

  • 问题1解决方案:尝试修改图片权限 chmod 777 1.jpg

  • 问题2:在安装webgoat时候出现如下报错。

  • 问题2解决方案:版本不匹配的原因,选择较低版本的webgoat解决此问题。

4.学习感悟、思考等

本次实验是Web的综合应用,感觉任务量还是比较大的,本次实验主要是基于Web安全方面的,我们进行了常见的网络攻击方式,包括SQL注入攻击、XSS攻击等等。这几种攻击方式于我而言,SQL注入是了解的相对较多的一种,理解起来没有那么难。

本次实验也是本学期最后一次实验了,以这样一个综合性的实验结尾,让我对网络攻防有了更深刻的认识。现在网络上的攻击无处不在,攻击者远比我们聪明。所以我们一定要提高自己的网络安全意识,不在网络上明文传输重要的信息,不随意点击不明来源的超链接,规范自己的信息输入等,降低自己被攻击的可能性。

参考资料

posted @ 2022-06-06 17:14  20192425  阅读(146)  评论(0编辑  收藏  举报