1.本实践的具体要求有:javascript
(1) Web前端HTML(0.5分)php
能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。css
(2) Web前端javascipt(0.5分)html
理解JavaScript的基本功能,理解DOM。编写JavaScript验证用户名、密码的规则。前端
(3) Web后端:MySQL基础:正常安装、启动MySQL,建库、建立用户、修改密码、建表(0.5分)java
(4) Web后端:编写PHP网页,链接数据库,进行用户认证(1分)mysql
(5) 最简单的SQL注入,XSS攻击测试(1分)web
功能描述:用户能登录,登录用户名密码保存在数据库中,登录成功显示欢迎页面。sql
课题负责人须要完成:登录后能够发贴;会话管理。数据库
(1)什么是表单
(2)浏览器能够解析运行什么语言。
浏览器属于Web前端,一般能够识别HTML、CSS和JS语言等。
(3)WebServer支持哪些动态语言
查了一下资料得知,常见的有3种语言ASP、JSP和PHP。
模块分类:
apachectl -v
来查看版本,出现版本号,则证实Linux已安装Apache。service apache2 start
打开Apache服务器,若是没有任何错误提示,代表已成功开启。127.0.0.1
,若是能够成功打开Apache的默认网址则证实Apache已经开启。/var/www/html
也就是Apache目录下,新建一个简单的含有表单的html文件simple_form.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> <style type="text/css"> body{ background-image:url("manwei.jpg"); background-position:center; background-repeat:no-repeat; } </style> <div style="text-align:center;margin-top:120px"> <!--main--> <!--//header--> <h2 align="center"><font size=6>Login</font></h2> <center> <form action="login" method="post"> <input placeholder="E-mail or your name" name="Name" class="user" type="email"> <br> </br> <input placeholder="Password" name="Password" class="pass" type="password"> <br> </br> <input type="submit" value="Enter"> </form> </center> <!--//main--> </div> </body> </html>
在浏览器尝试打开
simple_form.html
的基础上,能够添加一段javascript
代码,以完成对用户是否填写邮箱和密码的判断。修改后的login_test.html
以下图所示:<!-- Meta tag Keywords --> </head> <body> <style type="text/css"> body{ background-image:url("manwei.jpg"); background-position:center; background-repeat:no-repeat; } </style> <div style="text-align:center;margin-top:120px"> <!--main--> <!--//header--> <h2 align="center"><font size=6>Login</font></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--> </div> <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>
file:///var/www/html/login_test.html
,也能够直接打开login_test.html
,,若是用户邮箱或密码未填写就提交,网页会报提示:/etc/init.d/mysql start
。mysql -u root -p
使用root权限进入,默认密码是password
:update user set password=PASSWORD("新密码") where user = 'root';
来修改密码;输入flush privileges;
更新权限
exit
退出数据库,能够尝试使用新的密码登陆。create database 数据库名称;
创建数据库。我输入的是create database xyx;
创建了一个名为xyx
的数据库。show database;
能够查看存在的数据库:use 数据库名称;
,使用咱们建立的数据库,即对数据库作一些编辑操做。create table 表名称 (列名称1 数据类型,列名称2 数据类型,···)
建立数据库中的表,并设置相应字段,如图所示,我输入的是create table login_table(username VARCHAR(20),password VARCHAR(20));
建立了一个名为login_table
的列表,且表中设置了两列,分别为username
和password
,均存储VARCHAR数据类型,最大长度为20show tables;
查看表的基本信息;如图所示,能够看到咱们的数据库xyx
中有一个表为login_table
:insert into 代表 values('值1','值2','值3',···);
,注意值的顺序是按照咱们设置的表中列的顺序来的。select * from 表名;
查询表中的数据,能够看到咱们 表已经出现。grant select,insert,update,delete on 数据库.* to 用户名@登陆主机(能够是localhost,也能够是远程登陆方式的IP) identified by "密码";
,意为对某数据库中全部表的select,insert,update,delete权限授予某ip登陆的某用户。登陆成功,说明新用户增长成功
/var/www/html
目录下新建立一个PHP测试文件phptest.php
<?php echo ($_GET["a"]); include($_GET["a"]); echo "This is my php test page!<br>"; ?>
localhost:80/phptest.php?a=/etc/passwd
,可看到etc/passwd
文件的内容:login_test.html
的文件中的action
部分要与PHP
文件的文件名对应,而且在mysqli
对象创建的时候,要对应参数(主机号,用户名,密码,数据库名)
,修改后的login.php
代码以下:<?php $uname=$_POST["Email"]; $pwd=$_POST["Password"]; echo $uname; $query_str="SELECT * FROM login_table where username='$uname' and password='$pwd';"; $mysqli = new mysqli("127.0.0.1", "xiayunxiao", "123456", "xyx"); $query_str1="use xyx;"; /* 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 login!! <br> "; } else { echo "<br> login failed!!!! <br> " ; } /* free result set */ $result->close(); } $mysqli->close(); ?>
127.0.0.1/login_test.html
访问本身的登陆界面。SQL注入,就是经过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器质性恶意的SQL命令。具体来讲,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎质性的能力,它能够经过在Web表单中输入(恶意)SQL语句获得一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
' or 1=1#
,密码任意输入,就能够登陆成功了。这是由于,咱们输入的用户名在数据库中都会转换成SQL语句中的select语句,而输入' or 1=1#
时,语句变成了
select * from users where username='' or 1=1#' and password=''
这就有意思了,#
至关于注释符,会把后面的内容注释表,而1=1
是永真式,因此这个条件永远成立,无论密码是否输入正确,都可以登录成功。
跨站脚本攻击(Cross Site Scripting),为不和层叠式样式表(Cascading Style Sheets,CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。XSS是一种常常出如今web应用中的计算机安全漏洞,它容许恶意web用户将代码植入到提供给其它用户使用的页面中。好比这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路的访问控制--例如同源策略(same origin policy)。这种类型的漏洞因为被黑客用来编写危害性更大的phishing攻击而变得广为人知。
/var/www/html
目录下,在用户名输入框输入<img src="spiderman.jpg" />
,密码任意,就能够读取图片了。本次实验由于本身对于数据库方面的知识只是java课上接触点儿皮毛,因此仍是遇到一些问题,但愿对你们有所帮助。
Q1:在我输入127.0.0.1/login.html
时,没法显示页面。
A1:遇到这种问题,首先要在网址栏中输入127.0.0.1
看看本身的Apache服务器是否已经打开。第二,看看咱们的网页名字是否正确,也就是本身的var/www/html
目录下是否存在着这样一个网页。我属于第二种,本身的网页名字为login_test.html
,哈哈哈哈。
Q2:本身的用户名和密码均输入正确,但老是显示没法链接数据库。
A2:这就须要查看本身的login_test.html
和login.php
的对应关系。如图所示,个人login_test.html
的Name中的name
和login.php
中的变量uname
和pwd
要对应起来。
Q3:在作SQL注入攻击时,输入攻击语句时,提示只能输入email
。
A3:查看本身的login_test.html
,在用户名输入栏中的type
栏中输入为email
,因此只能识别email
,咱们能够将其改成text
,这样就能识别文本类型了。
本次实验的过程容易理解,本身编写一个网页,而后进行攻击,并且综合性比较强,既有刘念老师的网络安全编程课的知识,也有数据库的知识,因此,打好基础很重要,在数据库方面本身还须要多加练习,另外,感谢同窗们在实验过程当中对我提供了帮助。但愿本身能在从此的实验中能更加努力。