本实践的目标理解经常使用网络欺诈背后的原理,以提升防范意识,并提出具体防范方法。javascript
返回目录php
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
课题负责人须要完成:登录后能够发贴;会话管理。
返回目录数据库
返回目录apache
本实验使用的环境是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目录默认目录。
简单分析一下段代码:
下面咱们添加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标签的下面,分析一下代码:
比较直观的逻辑,由于这里涉及到对表单的输入进行操做,因此咱们须要对以前表单的一些属性进行修改:
<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>
如上,你们比较一下就能够发现:
下面咱们来进行后端编程,输入/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,可是咱们仍是要看懂这个操做的原理的,继续进行分析:
很直观的代码,咱们试试吧,在浏览器地址输入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
' or 1=1#
吧,直接在用户名中输入:<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就:
<img src="test.jpg" />
:此次试验比较简单,我是照着同窗的博客作的,由于这个时间段碰上大创答辩、共建结题和国赛半决赛,因此决定这样写。
作实验加上问题的解决一共花了一个半小时,由于比较熟悉HTML和JS,之前也搭建过网站和博客,遇到问题解决的也快。