2017-2018-2 《网络对抗技术》20155322 Exp8 web基础


[-= 博客目录 =-]


1-实践目标

1.1-网络欺诈防范

本实践的目标理解经常使用网络欺诈背后的原理,以提升防范意识,并提出具体防范方法。javascript

返回目录php

1.2-实践内容

  • Web前端HTML(0.5分)
    能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。html

  • Web前端javascipt(0.5分)
    理解JavaScript的基本功能,理解DOM。编写JavaScript验证用户名、密码的规则。前端

  • Web后端:MySQL基础:正常安装、启动MySQL,建库、建立用户、修改密码、建表(0.5分)java

  • Web后端:编写PHP网页,链接数据库,进行用户认证(1分)mysql

  • 最简单的SQL注入,XSS攻击测试(1分)web

功能描述:用户能登录,登录用户名密码保存在数据库中,登录成功显示欢迎页面。sql

课题负责人须要完成:登录后能够发贴;会话管理。
返回目录数据库

1.3-实践要求

  • 基础问题回答
    • 什么是表单
    • 浏览器能够解析运行什么语言。
    • WebServer支持哪些动态语言
  • 实验总结与体会
  • 实践过程记录
  • 报告评分 1.5分
    • 报告总体观感 0.5分
    • 报告格式范围,版面整洁 加0.5。
    • 报告排版混乱,加0分。
  • 文字表述 1分
    • 报告文字内容很是全面,表述清晰准确 加1分。
    • 报告逻辑清楚,比较简要地介绍了本身的操做目标与过程 加0.5分。
    • 报告逻辑混乱表述不清或文字有明显抄袭可能 加0分

返回目录apache

2-实践过程

2.1 Web前端HTML

本实验使用的环境是Kali2,默认已安装Apache,直接使用service apache2 start命令打开Apache服务便可,输入在浏览器输入127.0.0.1能够查看Apache是否已经启动:

下面咱们开始编写前端HTML文件,下面是我找别人的一个demo:

<html>
<head>
<title>CryptoTeam</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body>

    <h2>This is a Login Form</h2>
        <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>

</body>
</html>

咱们把这个文件放到/var/www/html下,由于这个是Apache目录默认目录。
简单分析一下段代码:

  1. head部分使用meta标签设置属性,通常都是自动生成的(在某些IDE中),须要注意的是charset属性若是须要中文的话就得改为utf-8
  2. body部分很简单,一个form里面三个input标签,分别是email框、pwd框和submit按钮,主要靠type属性区分。
    保存后直接双击或者再浏览器输入127.0.0.1/文件名.html就能够了。如图:

返回目录

2.2 Web前端javascipt

下面咱们添加javascipt,主要功能是检测email框或者pwd框是否输入为空:

<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>

我直接把这一段加到html文件的form标签的下面,分析一下代码:

  1. script标签以内的为javascipt代码部分
  2. 功能名叫validateLogin,使用的话须要在标签中设置事件,下面会提到。
  3. var sUserName定义变量,document.form_login.Email.value是一个方法,表示把这个document中名叫form_login表单的名叫Email的input的value赋值给sUserName下面一句话同理。
  4. if ((sUserName =="") || (sUserName=="Your email")) 若是某一项(这里为sUserName)为空,使用alert方法弹窗报错,返回false,下面一个同理

比较直观的逻辑,由于这里涉及到对表单的输入进行操做,因此咱们须要对以前表单的一些属性进行修改:

<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>

如上,你们比较一下就能够发现:

  1. input-Email和input-Password标签中多了 onfocus属性(事件),onfocus ="if (this.value=='Your email') this.value='';",意思是在对象得到焦点时发生this.value=='Your email'事件
  2. input-submit标签多了onClick属性(事件) onClick="return validateLogin()",意思是点击事件发生后传值。
  3. method="post":form的提交方法为post,后面写后端的时候要注意这个!
    也比较直观,咱们试一下:

    bingo~

返回目录

2.3 Web后端

下面咱们来进行后端编程,输入/etc/init.d/mysql start 开启MySQL服务

输入mysql -u root -p使用root权限进入,默认的密码是你用户的pwd,咱们登陆进取后能够改密码:

嗯,出现了一点小问题,看错误提示,说没有选择数据库,那咱们就选一个再改:

输入flush privileges;,更新权限,而后退出exit从新登陆一下:


看起来貌似没问题了,咱们新建一个数据库create database 数据库名称;,以后能够用show databases;查看:

使用use 数据库名称;使用咱们建立的数据库,而后在里面建立一个数据表create table 表名 (字段设定列表);

插入数据insert into 表名 values('值1','值2','值3'...);

OK,进行到这里没问题了

下面是额外的操做,若是你想使用其余用户登陆的话,能够将这个数据库受权给另一个用户:
grant select,insert,update,delete on 数据库名.* to 用户名@登陆主机 identified by "密码";
解释一下命令,
grant,受权;
select,insert,update,delete,是权限的类别;
数据库名.*,是数据库xxx下的全部表;
to 用户名@登陆主机,用户名你本身的,能够是远程用户,登陆主机能够写本机localhost,也能够是远程IP地址;
identified by "密码",至关于设置登陆密码;
这样写的大概意思就是告诉MySQL,那个登陆名是xxx,密码是xxx,地址是xxx的能够操做个人xxx数据库,容许的操做是select,insert,update,delete。
登陆一下MySQL试一试:

没问题。

下面是写PHP文件,对于咱们的前端HTML文件来讲,通常只进行前端上的操做,进行数据的处理虽然也能够,可是会使得文件十分臃肿,而且因为其余人访问HTML文件时是会下载你的这个文件的,处理数据的操做会被人家看到,而且数据处理通常是要放在服务器这边跑的……
那么咱们再copy一下别人的代码(懒):

<?php
$uname=$_POST["Email"];
$pwd=$_POST["Password"];
echo $uname;
$query_str="SELECT * FROM users_table where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "testuser", "123456", "test5322");


if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
echo "connection ok!";

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

虽然是copy,可是咱们仍是要看懂这个操做的原理的,继续进行分析:

  1. 为PHP文件开头和结尾;
  2. $uname=$_POST["Email"]; 将使用post方法的名叫Email的input的值赋给uname,下面同理;
  3. echo $uname; 在界面输出 uname的值;
  4. $query_str="SELECT * FROM users_table where username='$uname' and password='$pwd';";定义一个SQL语句的string,在users_table表中查找username='$uname' and password='$pwd ;
  5. $mysqli = new mysqli("127.0.0.1", "testuser", "123456", "test5322"); 地址,用户,密码,数据库名;
  6. if ($mysqli->connect_errno) 报错用,没链接上就报错;
  7. if ($result = $mysqli->query($query_str)) 判断query($query_str)的结果是否为真,为真则 echo "
    {$uname}:Welcome!!!
    "; 不然就 echo "
    login failed!!!!
    " ;

很直观的代码,咱们试试吧,在浏览器地址输入127.0.0.1/login.php

嗯?不对吗?检查一下用户和密码:

好像没错啊,试试用root用户:


好像仍是错了?
回头检查一下,找到缘由:在受权的时候我受权成数据表而不是数据库了……,赶忙改过来,其实能够用grant all将全部权限都给出去的。

而后咱们试试登陆127.0.0.1/test5322_index.html看看,由于以前的页面只有前端没后端,没法处理数据:

嗯哼,找不到file,多是我某个地方的文件名输入错了,check一下代码:

<form action="login" method="post" name="form_login">

在HTML文件中找到表单的action属性,发现这个是以前我随便输入action,由于那时没有后端文件,在有login.php文件后,也要将相应的action属性改成action="login.php"再试试:

bingo

返回目录

2.4 SQL注入&XSS攻击测试

  • SQL注入,咱们直接用' or 1=1#吧,直接在用户名中输入:

    这……这一波碰巧防止了咱们的注入啊23333,一看就知道是前端的问题,check一下HTML文件,发现:
<input placeholder="E-mail" name="Email" class="user" type="email" onfocus="if (this.value=='Your email') this.value='';" />

这里的input标签的类别属性是type="email",怪不得只能输入email呢,这里咱们为了实现SQL注入就伪装它不安全的使用了type="text"这个类别吧!
这样的话咱们再输入' or 1=1#就不会报错了,这样的话传值后咱们后端生成的SQL语句为:select * from users where username=' ' or 1=1 #' and password=' '
其中username=' '为假,1=1为真,用or链接,username=' ' or 1=1就为真了,而后再注释掉' and password=' ',MySQL理解为:

select * from users where username=' ' or 1=1

这固然是永真的,因此MySQL就:

  • XSS攻击
    咱们直接XSS一张图片,在用户名中输入<img src="test.jpg" />

    bingo,不细说,至关因而将代码植入到页面中,其余用户在登陆的时候会加载这段代码,形成各类影响吧,主要的问题仍是构造这段代码。
    相关的知识网上不少,毕竟是热门攻击手法,之后有机会开单篇学习。

返回目录

2.5 基础问题回答

  • 什么是表单?
    表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分:
    表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
    表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
    表单按钮:包括提交按钮、复位按钮和通常按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还能够用表单按钮来控制其余定义了处理脚本的处理工做。
  • 浏览器能够解析运行什么语言?
    支持HTML(超文本标记语言)、XML(可扩展标记语言)以及Python、PHP、JavaScript、ASP等众多脚本语言。
  • WebServer支持哪些动态语言?
    最经常使用的三种动态网页语言有ASP(ActiveServerPages),JSP(JavaServerPages),PHP(HypertextPreprocessor)。
    ASP全名ActiveServerPages,是一个WEB服务器端的开发环境,利用它能够产生和执行动态的、互动的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(Javascript)做为本身的开发语言。
    JSP是Sun公司推出的新一代网站开发语言,Sun公司借助本身在Java上的不凡造诣,将Java从Java应用程序和JavaApplet以外,又有新的硕果,就是JSP,JavaServerPage。JSP能够在Serverlet和JavaBean的支持下,完成功能强大的站点程序。
    PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法,并耦合PHP本身的特性,使WEB开发者可以快速地写出动态产生页面。

返回目录

3-参考资料&实践体会

实践体会

此次试验比较简单,我是照着同窗的博客作的,由于这个时间段碰上大创答辩、共建结题和国赛半决赛,因此决定这样写。
作实验加上问题的解决一共花了一个半小时,由于比较熟悉HTML和JS,之前也搭建过网站和博客,遇到问题解决的也快。

参考资料

返回目录

相关文章
相关标签/搜索