20145214 《网络对抗技术》 Web基础
1.实验后回答问题
(1)什么是表单
- 表单在网页中主要负责数据采集,提供了填写数据、选择数据,收集数据并提交给后台的功能
- 一个表单有三个基本组成部分:表单标签、表单域、表单按钮
(2)浏览器可以解析运行什么语言。
- 支持HTML(超文本标记语言)、XML(可扩展标记语言)以及Python、PHP、JavaScript、ASP等众多脚本语言
(3)WebServer支持哪些动态语言
- ASP、JSP、PHP等语言
2.实验总结与体会
- 这次实验的过程还是遇到了许多的磕磕绊绊,总是会出现一些意料之外的好像别人都没有遇到的错误。举个栗子,在后端的php基础部分,修改完代码后如果顺利的话,应该登录并跳转到
login.php
,然而我的页面在登录后十分安静...查了又查、再查了又查,进行各种测试,后来才发现原来我的登录代码中用了post方法,但login.php
中用了get方法,导致了数据无法传入。这才恍然大悟两者应该用同一种方法!借着这个错误又深刻地理解了post和get两种方法的区别,用get时登录后账户、密码等等信息都会直接显示在路径那一栏中,而改为post之后这些信息就不会直接显示出来了,以前都只是“听说”post方法更安全,借着这个实验终于切身体会到了何为安全 - HTML和JavaScript的编写让我重温了上学期的网络编程基础课,后面的SQL注入实验也让我更深刻的理解了SQL语句都在干些什么,同时再一次意识到了网页和网站有多么的脆弱...
3.实践过程记录
(1)Web前端:HTML基础
-
因为Web开发是基于Apache服务器进行的,所以
apachectl start
指令来开启Apache,此时出现了编号AH00558
的错误。
-
查询错误代码,并且根据提示对
etc/apache2/apache2.conf
路径下的文件在最后添加了一句:ServerName localhost:80
。修改过后再次执行
-
发现还存在端口被占用的问题,于是先
netstat -tupln |grep 80
查看80端口被哪些进程占用,再用kill+进程ID
杀死进程。之后apache服务成功开启
-
此时用
netstat -aptn
查看端口占用,可以看到80端口已经被apache占用了
-
在浏览器中输入
localhost:80
可以看到上周克隆的网页,而且还惊喜的发现上周被玩坏的网页居然恢复正常了哈哈
-
输入指令
cd var/www/html
进入Apache的工作目录,vi 5214.html
新建一个含有表单的html,编写简单的登录代码,如下
-
在浏览器里输入
localhost:80/5214.html
就可以看到登录界面啦
-
处于好奇随便输入用户名和密码,点击登录,居然会让我选择是否记住密码,已经很像那么回事儿的感觉了~不过现在的状况是点击登录之后还是会仿佛什么事情都没有发生...我们还需要继续往下做
(2)Web前端:javascipt基础
-
JavaScript是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。
-
这里我们用JavaScript编写验证用户名和密码的规则,在原来的
5214.html
进行如下修改
-
修改之后验证一下,输入了用户名,但没有输入密码时,会弹出提示
(3)Web后端:MySQL基础
-
我们使用MySQL作为后台数据库,
/etc/init.d/mysql start
指令开启mysql服务,之后mysql -u root -p
并输入默认密码p@ssw0rd
进入MySQL
-
use mysql;
选择mysql数据库,update user set password=PASSWORD("20145214") where user='root';
修改密码为20145214
-
flush privileges;
更新权限,quit;
退出MySQL,之后使用新修改的密码重新进行登录,保证密码修改成功
-
create database znzn;
建立一个名为znzn的数据库,show databases;
查看存在的数据库,可以看到刚刚新建的znzn数据库,use znzn;
就可以使用我们创建的数据库znzn了
-
create table zn(username VARCHAR(50),password VARCHAR(50),telephone VARCHAR(11));
建立一个名为zn的数据表,show tables;
查看存在的数据表,一个数据库中可以包含若干个数据表
-
insert into 表名 values('值1','值2','值3'...);
插入数据,如图,在zn表中插入了username为zn、password为20145214的数据
-
select * from zn
查询表中的数据,可以看到刚刚插入的一段数据
-
grant select(insert,update,delete) on znzn.* to zn@localhost identified by "20145214";
可以在MySQL中增加名为zn的新用户,增加新用户后退出
-
重新使用新用户名和密码进行登录,登录成功说明增加新用户成功
(4)Web后端:PHP基础
-
vi /var/www/html/zn_test.php
新建一个PHP测试文件
-
在浏览器中打开
localhost:80/zn_test.php
进行测试,显示如下,测试成功
-
完成简单测试后,参考卢肖明的博客中的代码,利用PHP和MySQL结合之前编的登录网页进行简单的用户身份认证,
login.php
编写如下
-
将之前的
5214.html
中form表单属性中加上action="login.php"
,使用户登录后跳转到login.php
-
用之前存入数据库中的数据登录,成功登陆,显示如下
-
在login.php中加一行代码
header("Refresh:3;url=welcome.php");
实现在3秒之后跳转到对用户更友好的welcome.php页面
(5)SQL注入
-
SQL注入是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
-
SQL注入的产生原因通常是将用户输入的字符串,当成了 “sql语句” 来执行
-
在账户输入框中输入
' or 1=1#
,密码随便输入,这时候的合成后的SQL查询语句为select * from zn where username='' or 1=1#' and password=''
,#
相当于注释符,会把后面的内容都注释掉,而1=1是永真式,所以这个条件肯定恒成立,所以能够成功登陆
-
将之前编的代码中
if ($result = $mysqli->query($query_str))
改为if ($result = $mysqli->multi_query($query_str))
实现执行多个sql语句,便可以通过SQL注入将用户名和密码保存在数据库中。在用户名输入框中输入';insert into zn values('lxm','5215','17888811781');#
,拆开来看就是SELECT * FROM zn WHERE username='';、insert into zn values('lxm','5215','17888811781');
,登录结果如下
-
在数据库中查询,可以看到数据插入成功
-
使用新插入的用户名和密码进行登录,登录成功
(6)XSS攻击测试
-
XSS表示Cross Site Scripting(跨站脚本攻击),通过插入恶意脚本,实现对用户游览器的控制
-
假如用户提交的数据含有js代码,不做任何处理就保存到了数据库,读出来的时候这段js代码就变成了可执行的代码。一般用户提交的数据永远被认为是不安全的,在保存之前要做对应的处理。
-
首先选定一张照片,原图如下。保存到
/var/www/html
目录下
-
在账户输入框中输入
<img src="5214.png" />20145214</a>
读取/var/www/html
目录下的图片
-
登录后可以看到图片