2020-2021-2 20181304石昊林《网络对抗技术》 Exp8 Web综合

Web综合

实践内容

  • (1)Web前端HTML:能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
  • (2)Web前端javascript:理解JavaScript的基本功能,理解DOM。
  • (3)Web后端,MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表。
  • (4)Web后端:编写PHP网页,连接数据库,进行用户认证。
  • (5)最简单的SQL注入,XSS攻击测试。
  • (6)选做:Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例。

实验过程

1.Web前端HTML

(1)kali虚拟机中自带Apache服务器,需要手动搭建和启停。

  • 使用命令:sudo netstat -tupln |grep 80,查看80端口是否被占用。如果有,使用kill+进程杀死该进程。
  • 使用命令:sudo vi /etc/apache2/ports.conf,修改Apache的端口配置文件,将端口改为http对应的80号端口。
  • 使用命令:systemctl start apache2开启Apache服务。
  • 使用命令:systemctl stop apache2关闭Apache服务。

(2)HTML概念

  • HTML的全称为超文本标记语言,是一种标记语言。
  • 超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。
  • 这些相互关联的信息媒体可能在同一文本中,也可能是其他文件,或是地理位置相距遥远的某台计算机上的文件。

(3)GET与POST方法

  • GET 和 POST 其实都是 HTTP 的请求方法。
  • GET请求:请求指定的页面信息,并返回实体主体。
  • POST请求:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)。而对于POST请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

(4)一个含有表单的HTML

  • 代码如下:

      <!DOCTYPE html>
      <head>
      	<meta charset="UTF-8">
      	<title>登录</title>
      </head>
      
      <body>
      	<h1 align="center">您好!欢迎登录</h1>
      	<center>
      	<form name="form1" method="post" action="login">
      		<table border = "0">
          		<tr>
              		<td>用户名:</td>
              		<td><input type="text" name="username" placeholder="用户名" value="" /></td>
          		</tr>
          		<tr>
              		<td>密&nbsp&nbsp&nbsp&nbsp码:</td>
              		<td><input type="password" name="userpwd" placeholder="密码" value="" /></td>
          		</tr>
          		<tr>
              		<td></td>
              		<td><input type="submit" value="提交" /> </td>
          		</tr>
      		</table>
      	</form>
    
      	</center>
      </body>
      </html>
    
  • 它长这个样子:
    image

2.Web前端javascript

(1)javascript基本功能

  • javascipt是动态的面向对象的编程语言。能够丰富Web界面和网页功能、实现本地或远程存储、实现分布式网络应用的前端组件,并且在后台进行数据存储管理。
    (2)DOM

  • DOM全称为文档对象类型,可以简单理解为代表网页文档的一棵树,该树的节点类型有多种。根据HTML标签在刻画网页特征时的语义功能,将DOM树结点分为6种类别:标题类(TITLE)、正文类(CONTENT)、视觉类(VISION)、分块类(BLOCK)、超链类(LINK)和其他类(OTHER),不同类的结点对Web信息提取的重要度不同。
    (3)编写javascript验证用户名、密码

  • 编写好javascript代码后,应该在点击提交后进行验证,所以源代码需要进行微小改动。编写的script代码如下:

      <script type="text/javascript">
          function checked()
          {
              var user= document.form1.username.value;
              var pd=document.form1.userpwd.value;
          if(user == "" || user==NULL)
          {
              alert("用户名不能为空!");
              return false;
          }
          if(pd == "" || pd==NULL)
          {
              alert("密码不能为空!");
              return false;
          }
              return true;
          }
    
  • 将上面javascript代码插入原来HTML代码中,修改此处:

      <form name="form1" method="post" action="login" onsubmit="return checked();">
    
  • 效果图如下:
    image

3.Web后端,MySQL基础

(1)启动mysql

  • 使用命令systemctl start mysql,启动kali虚拟机中自带的mysql。

(2)建库

  • 输入sudo mysql -u root -p指令使用mysql,默认密码时password。
    image
  • 新建数据库:CREATE DATABASE TEST;
    image

(3)在新建的数据库中建表

  • 输入show databases;,查看存在的数据库。
    image

  • 输入use TEST;,进入TEST数据库。
    image

  • 建表:

      CREATE TABLE LOGIN
      (
      username VARCHAR(20),
      password VARCHAR(20)
      );
    

    image

  • 插入数据:

      insert into LOGIN values('Shihaolin','20181304');
      insert into LOGIN value('Zhangsan','20180000');
    

    image

  • 输入show tables;,查看表信息:
    image

  • 输入select * from LOGIN,查询表中的数据。
    image

(4)创建用户

  • 使用命令CREATE USER 'SHL'@'localhost' IDENTIFIED BY 'password';

      CREATE USER 'username'@'host' IDENTIFIED BY 'password';
      username:创建的用户名
      host:指定用户在哪个主机上登录。本地用户使用localhost
      password:用户的登陆密码
    

    image

  • 给用户赋权
    使用命令grant select,insert,update,delete on TEST.* to SHL@localhost identified by "password";这里表示给用户SHL关于数据库TEST中所有表的查询、插入、更新、删除权限。
    image

(5)修改密码

  • 使用命令:set password for SHL@localhost = password('20181304'); ,将用户SHL的登录密码改为20181304。
    image
  • 退出mysql使用用户SHL登录,经过验证密码修改成功。
    image

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

  • PHP是html网页和数据库连接的桥梁。

  • 编写login.php,代码如下:

      <?php
      $uname=$_POST["username"];
      $pwd=$_POST["password"];
      echo $uname;
      $query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
      $mysqli = new mysqli("127.0.0.1", "SHL", "password", "TEST");
      $query_str1="use TEST;";
    
      /* check connection */
      if ($mysqli->connect_errno) {
      printf("Connect failed: %s\n", $mysqli->connect_error);
      	exit();
      }
      echo "connection ok!";
      /* Select queries return a resultset */
      if ($result = $mysqli->query($query_str1))
      echo"<br>Success into database!";
      echo$uname;
      if ($result = $mysqli->query($query_str)) {
      if ($result->num_rows > 0 ){
          echo "<br> {$uname}:Welcome!!! <br> ";
          }
          else {
          echo "<br> login failed!!!! <br> " ; }
      	/* free result set */
      	$result->close();
      }
      $mysqli->close();
      ?>
    
  • 登录界面。输入正确的用户名和密码,结果如下:
    image
    image

5.SQL注入,XSS攻击测试

(1)SQL注入

  • 用户名输入' or 1=1#,这样构造了一个永真条件,一定能够执行成功。
    image
    image

(2)XSS攻击

  • 在var/www/html文件夹下放一张图片test.jpg。登录端输入<img src='test.jpg'/>,密码任意输入。点击1登录后会显示这张图片(这里我不知道为上面会失败……)
    image
  • 另一种方法:在登录端输入<script>alert("this is a test.冻塔瓦瑞")</script>然后点击登录,它会弹出一个对话框。
    image

6.选做:Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例

(1)安装Webgoat

  • 参照教程安装jdk-8u251-linux-x64.tar.gz
    image

(2)下载webgoat-container-7.0.1-war-exec.jar

  • 在命令行输入java -jar webgoat-container-7.1-exec.jar运行Webgoat。
    image
  • 在浏览器中输入http://localhost:8080/WebGoat进入WebGoat登录界面。
    image
  • 使用页面下端任意一个账号密码进行登录,可以看到如下页面:
    image

(3)SQL注入攻击——字符串型注入

  • 概念:通过注入字符串绕过认证。
  • 目的:以某一身份进行登录,获得全部成员信息。
    -步骤
    • 在菜单栏中选择Injection Flaws,展开页面中选择LAB: SQL Injection-->String SQL Injection
      image
    • 右键点击页面,选择inspect Element审查网页元素对源代码进行修改,将password密码框的最大长度限制改为18。
      image
    • 以用户Neville(admit)登录,输入密码hello' or '1' = '1
      image
    • 进行欺骗,以最高权限进行登录,获取到人员列表。
      image

(4)XSS攻击——XSS钓鱼

  • 原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
  • 目标:创建一个 form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
  • 操作方法
    • 利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
      • 受害人填写一个表格
      • 服务器以读取脚本的形式,将收集到的信息发送给攻击者
    • 编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat。
    • 编写一个带用户名和密码输入框的表格。
  • 实践
    • 在菜单栏中选择Cross‐Site Scripting——>Phishing with XSS
      image
    • 利用XSS可以在已存在的页面中进一步添加元素,包括两部分:受害人填写一个表格;服务器以读取脚本的形式,将收集到的信息发送给攻击者。
    • 编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat
      image
      image
      image

(5)CSRF攻击——跨站请求构造

  • 原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。
  • 目标:通过这种方法,攻击者可以让受害者执行一些他们本来没打算执行的操作,如注销、采购项目或者这个脆弱的网站提供的任何其他功能。
  • 实践
    • 在菜单栏中选择Cross‐Site Scripting,展开页面中选择Cross Site Request Forgery (CSRF)
      image
    • 查看页面右侧Parameters中的src和menu值,分别为316和900。
      image
    • 在title中输入任何参数,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=267&menu=900&transferFunds=5000" width="1" height="1" />。这里以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交。
      image
      image

基础问题回答

(1)什么是表单

  • 表单在Web网页中负责数据采集功能,由表单标签、表单域、表单按钮组成。

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

(2)浏览器可以解析运行什么语言

  • 浏览器可以支持HTML(超文本标记语言)、XML(可扩展标记语言)、Python、php、JavaScript、ASP等众多脚本语言。

(3)WebServer支持哪些动态语言

  • JavaScript、ASP、php、Ruby等脚本语言。

(4)防范注入攻击的方法有哪些

  • 1.普通用户与系统管理员用户的权限做严格区分。在权限管理中,对于普通用户,只赋予对应的查询权限,而管理员才拥有对数据库表的修改、删除等操作。这样一来,即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。
  • 2.加强对用户输入的验证。终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。这是防止SQL注入式攻击的常见并且行之有效的措施。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。
  • 3.使用专业的漏洞扫描工具来寻找可能被攻击的点。这一点也可能被攻击者利用。
  • 4.使用正则表达式过滤传入的参数。

实践问题、总结和体会

1.在编写html和php页面前,花费了比较久的时间重新学习了前端代码以及数据库相关知识;编写出来的网页也是错误百出,真的改了好久……
2.做SQL注入攻击时,我没有通过网页得到我部署好的图片。这个问题重启几次kali后偶尔等解决,可能是虚拟机的问题。
3.做完本次实验,做一个好的网站(至少要保证足够的安全性)的难度是相当大的,需要考虑各种各样的攻击方式然后提出应对方法。通过这次实验,我也了解到几种常用的攻击方式,以后编写网页代码时我也会尽力完善安全性设计,让攻击者无处下手。
posted @ 2021-05-30 15:13  shihaolin  阅读(126)  评论(0编辑  收藏  举报