Exp8 Web安全

发布时间 2023-05-24 20:10:30作者: 不加糖的酒
  • 一、实践内容

    • 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攻击各一例
  • 二、实践原理

    • WebGoat
      • WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。
    • SQL注入攻击原理
      • SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
      • Web应用对后台数据库查询语句处理存在的安全漏洞。即为:在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查,例如: ',--,#  这些特殊字符
      • 后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。
    • XSS攻击
      • XSS跨站脚本。攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
      • 攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
    • CSRF攻击
      • CSRF :跨站请求伪造。即冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器;
      • 主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码防御。
  • 三、实践过程记录

  • 3.1 Web前端HTML

    • Step1: kali默认已安装Apache,直接使用 service apache2 start 命令就能打开Apache服务。如下图所示,如果没有任何错误提示,即表明成功开启。
    • Step2:打开Apache服务后,在浏览器输入 127.0.0.1 ,如果可以打开Apache的默认网页,则开启成功,如下图所示:
    • Step3:输入命令 cd /var/www/html 进入Apache目录下。
      • 新建一个简单的含有表单的html文件 form.html
      • 这里需要用root新建文件,否则会无法修改。文件内容为:
      • 			  <html>
        			  <head>
        			  <title>Login</title>
        			  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        			  </head>
        			  - <body>
        			  - <h2 align="center">Login</h2>
        			        <center>
        			        <form action="login" method="post">
        			            <input placeholder="E-mail" name="Name" class="user" type="email">
        			            <br>
        			            </br>
        			            <input  placeholder="Password" name="Password" class="pass" type="password">
        			            <br>
        			            </br>
        			            <input type="submit" value="Login">
        			        </form>
        			        </center>
        			  </body>
        			  </html>
        
    • Step4:在浏览器中输入/var/www/html/form.html 打开网页如下所示:
  • 3.2 Web前端:javascipt

    • step1:编写JavaScript验证用户名、密码的规则。在原有 form.html 基础上,可以添加一段JavaScript代码,以完成对用户是否填写邮箱和密码的判断。
      • 修改后的 login.html 如下所示:
      • 			  <html>
        			  <head>
        			  <title>CryptoTeam</title>
        			  <!-- Meta tag Keywords -->
        			  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        			  <!-- Meta tag Keywords -->
        			  </head>
        			  <body>
        			  <!-- main -->
        			  <!--//header-->
        			    <h2>Login Quick</h2>
        			        <form action="login" method="post" name="form_login">
        			            <input placeholder="E-mail" name="Email" class="user" type="email" onfocus="if (this.value=='Your email') this.value='';" />
        			            <br>
        			            </br>
        			            <input  placeholder="Password" name="Password" class="pass" type="password" onfocus="if (this.value=='Your password') this.value='';"/>
        			            <br>
        			            </br>
        			            <input type="submit" value="Login" onClick="return validateLogin()"/>
        			        </form>
        			  <!--//main-->
        			  <script language="javascript">  
        			    function validateLogin(){  
        			        var sUserName = document.form_login.Email.value ;  
        			        var sPassword = document.form_login.Password.value ;    
        			        if ((sUserName =="") || (sUserName=="Your email")){  
        			        alert("user email!");  
        			        return false ;  
        			        }  
        			        if ((sPassword =="") || (sPassword=="Your password")){  
        			        alert("password!");  
        			        return false ;  
        			        }  
        			    }   
        			  </script>  
        			  </body>
        			  </html>
        
    • Step2:在浏览器访问 /var/www/html/login.html
      • 如果用户邮箱填写不正确,网页会出现以下提示:
      • 输入正确的邮箱格式的话就正常:
  • 3.3 Web后端:MySQL基础

    • Step1:创建数据库

    • 输入 service mysql start 开启MySQL服务,如下图所示:
    • 输入 mysql -u root -p使用root权限进入,默认的密码是 password
    • show databases; 命令查看数据库基本信息
    • use mysql; 选择使用mysql这个数据库
    • select user, password, host from user; 查看当前用户信息
    • ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword'; 修改密码
    • flush privileges; 更新权限
    • exit 退出数据库,使用新的密码登录
    • step2:创建数据库

      • create database zjz; 建立数据库
      • show databases; 查看存在的数据库
      • use zjz; 使用我们创建的数据库
      • create table login (username VARCHAR(20),password VARCHAR(20));
        • 创建一个名为 login 的表,并设置字段基本信息。
        • 表中有两个字段 useremail 和 password ,类型都是VARCHAR(20)
        • char类型与varchar类型区别为:
          • char类型:指定大小后会预分配固定大小,不管是否使用空间都被占用,mysql中会用空格自动填充未填满的字段
          • varchar类型:用多少占多少,但不能超过括号中指定的上限
      • show tables; 查看表信息
      • insert into login values('20201223@qq.com','20201223'); 插入数据
      • select * from login; 查询表中的数据
      • GRANT select,insert,update,delete ON zjz.* TO zjz@localhost identified by "20201223";
        • 将对数据库的所有表的select,insert,update,delete权限授予当前主机localhost登录的用户 zjz ,登录密码是 20201223
      • 登录成功,说明成功增加新用户
  • 3.4 Web后端:编写PHP网页,连接数据库,进行用户认证

    • Step1:首先我们编写一个简单的PHP脚本 phptest.php ,放在目录 /var/www/html 下,测试一下,简单了解语法知识

      ```
      			  <?php 
      			  echo ($_GET["a"]); 
      			  include($_GET["a"]); 
      			  echo "Hello word! This is my php test page!<br>";
      			  ?>
      ```
      
    • Step2:写好后,我们在浏览器网址栏中输入 localhost:80/phptest.php ,可看到文件的内容:
      • 在浏览器网址栏中输入 localhost:80/phptest.php?a=/etc/passwd ,也可以看到 /etc/passwd 文件的内容
    • Step3:将表单 login.html 中的 action 设为 login.php ,表单中数据将被送入 login.php 进行处理
      • 利用PHP和MySQL,结合之前编写的登录网页进行登录身份认证, login.php代码如下:

      • 			  <?php
        			  $uname=$_POST["Email"];
        			  $pwd=$_POST["Password"];
        			  echo $uname;
        			  $query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
        			  $mysqli = new mysqli("127.0.0.1", "root", "20201223", "zjz");
        			  $query_str1="use zyx;";
        			  
        			  /* 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();
        			  
        			  ?>
        
    • Step4:在浏览器中输入 127.0.0.1/login.php直接跳转到 login.php界面,连接成功如下图
    • Step5:在浏览器中输入 127.0.0.1/login.html进入登录界面,输入正确的用户名和密码登陆,登陆成功界面如下:
  • 3.5 最简单的SQL注入,XSS攻击测试

    • 3.5.1 SQL注入

      • SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
      • 在用户名输入框输入' or 1=1#,密码任意输入:
      • 这是因为,输入的用户名和我们的代码中select语句组合起来变成了 select * from user_login where username='' or 1=1#' and password='' , # 相当于注释符,会把后面的内容都注释掉,而 1=1 是永真式,所以这个条件永远成立,所以不管密码是否输入正确,都能够成功登陆
    • 3.5.2 XSS攻击

      • XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
      • 在用户名输入 <script>alert(1)</script> ,密码随便输
  • 四、基础问题回答

  • 4.1 什么是表单

    • 表单通常用来收集网页访问者信息,常见的表单比如搜索引擎的搜索框、各网页应用的注册或者登陆界面等。一个表单通常包括多个表单控件,一些常用的表单控件如下:
      • 添加文本控件:单行文本框、密码框、多行文本框(文本域)
      • 选择控件:单选按钮、复选框、下拉列表
      • 上传文件控件
      • 提交表单控件:提交按钮、图像按钮
      • html5还加入了日期控件、电子邮件和URL输入控件、搜索输入控件。
    • 表单的工作原理:
      • 用户填写表单,然后单击一个按钮将所填信息提交到服务器,为了区分各类输入数据,表单的内容采用“名称/值”这样成对的格式。在Flask web服务端,可以使用request.form访问到用户提交的表单。服务器接收到表单内容,通常会再返回给浏览器一个页面。
    • 表单的三个组成部分:
      • 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法
      • 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等
      • 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作
  • 4.2 浏览器可以解析运行什么语言

    • 浏览器支持最基本的语言是html,也就是说浏览器只看得懂html、css、javascript(js)、xml等。
    • 其他的服务器端动态脚本,比如php、jsp等,解析工作是在服务器完成的。
    • 比如,在电脑显示屏上看到的一切东西,是在显示屏上,但他们的运行是在电脑主机里运行的,显示器只是显示的作用!
    • 浏览器不能解析PHP,那为什么浏览器中能查看php等文件的内容呢?
    • 那是因为服务器上有php的解析器,比如apache+php, 当浏览器请求一个php文件的时候,这个解析器会将这个php文件进行逻辑处理和编译,再将编译后的结果转化成html源发送至浏览器进行展示。
  • 4.3 WebServer支持哪些动态语言

    • WebServer支持的动态语言主要是ASP,PHP,JAVASCRIPT,JAVA,CGI等计算机脚本语言编写出来的执行灵活的互联网网页程序,最常用的就是ASP,PHP,JAVASCRIPT。
    • ASP
      • ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的web应用程序。当服务器收到对ASP文件的请求时,它会处理包含在用于构建发送给浏览器的HTML(Hyper Text Markup Language,超文本置标语言)网页文件中的服务器端脚本代码。除服务器端脚本代码外,ASP文件也可以包含文本、HTML(包括相关的客户端脚本)和com组件调用。
    • JSP
      • JSP是Sun公司推出的新一代网站开发语言,Sun公司借助自己在Java上的不凡造诣,将Java从Java应用程序和JavaApplet之外,又有新的硕果,就是JSP,JavaServerPage。JSP可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。
    • PHP
      • PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面。
  • 4.4 防范注入攻击的方法有哪些

    • SQL注入攻击
      • 使用正则表达式过滤传入的参数。
      • 关闭或删除不必要的交互式提交表单页面。
      • jsp中调用函数检查是否包函非法字符,做好规范的校验工作,比如搜索框不能输入非法字符、限制输入的长度等。
      • 使用prepared statements语句绑定变量来执行SQL字符串。没有使用prepared statements语句绑定变量可能很容易受到攻击。
    • XSS攻击
      • 特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击;
      • 对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤;
      • 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie;
      • 使用验证码:防止脚本冒充用户提交危险操作。
    • CSRF攻击
      • 验证请求中的Token,每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。
      • 验证 Referer,因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断 referer 头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击(虽然同站的csrf更难)。
      • 添加加随机验证,每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
  • 五、实验心得

    • 本次实验综合性很强,从建立表单编写JavaScript验证用户名、密码的规则,连接数据库到web的攻击手段,有点类似于CTF比赛web题目的感觉,这一块正好是自己的弱点,对一些工具的使用还不熟悉,我也发现想做好一个网站真挺难的,要把各种安全问题考虑进去,还要定期维护,学到了不少知识。