20145320《WEB基础实践》
20145320WEB基础实践
实验问题回答
-
1.什么是表单
-
表单可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁。
-
一个表单有三个基本组成部分: 表单标签
-
表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等
-
表单按钮:包括提交按钮、复位按钮和一般按钮.
-
-
2.浏览器可以解析运行什么语言
- 超文本标记语言:HTML
- 可扩展标记语言:XML
- 脚本语言:ASP、PHP、Script、JavaScript、VBScript、Perl、Python、ColdFusion、Java、JSP等
-
3.WebServer支持哪些动态语言
- 比较常用的有PHP语言和JSP语言。
实验总结与体会
初步认识一个简单的登录界面是如何操作的,但是由于数据库语言为了方便用户使用,便有了较大漏洞,出现类似SQL注入、XSS注入等。这些注入非常巧妙,简直防不胜防,我们今天接触到还是最简单的,只要使用关键词过滤或者正则表达式就可完成避免这些被方法注入。但是还是会有更高级的做法,然后又会出现相应的对策!这个就是一个相互斗争发展的过程!
实践过程记录
(一)环境配置
-
通过apachectl start开启Apach,使用netstat -aptn查看端口占用:在这里apach2占用端口80
-
测试apache是否正常工作:在kali的火狐浏览器上输入localhost:80(其实这里的端口号就是/etc/apache2/ports.conf下设置的Apache监听端口号,这里的localhost是你的kali的IP地址(我这里是192.168.47.133),由于上个实验的影响打开的是伪装的网页)
(二)简单的网页编写
去年上网络编程课程时学过类似的内容,直接把内容拷进来了,其实就是几张图片和一些css
(三)MySQL基础
-
开启sql服务/etc/init.d/mysql start
-
输入mysql -u root –p,并根据提示输入密码,默认密码为p@ssw0rd,进入MySQL
-
输入show databases;,可以查看基本信息
-
可以通过如下方式更改密码:
·输入use mysql;,选择mysql数据库 ·输入select user, password, host from user;,mysql库中的user表中存储着用户名、密码与权限 ·输入UPDATE user SET password=PASSWORD("新密码") WHERE user='root'; ·输入flush privileges;,更新权限 ·输入quit退出
-
重新输入mysql -u root –p,检测新密码能否成功使用,能成功登录即可。
-
在Mysql中建库建表,输入如下
CREATE SCHEMA `20145320`; CREATE TABLE `20145320`.`users` ( `userid` INT NOT NULL COMMENT '', `username` VARCHAR(45) NULL COMMENT '', `password` VARCHAR(256) NULL COMMENT '', `enabled` VARCHAR(5) NULL COMMENT '', PRIMARY KEY (`userid`) COMMENT '');
-
向表中添加用户
use 2014530; insert into users(userid,username,password,enabled) values(1,'20145320',password("88330016"),"TRUE");
(四)php+mysql实现登录网页编写
-
在/var/www/html文件夹下输入vim 20145320.html,将我去年的所写的代码修改一下
-
在同样的目录下输入vim login.php,通过php实现对数据库的连接
-
在火狐浏览器中输入localhost:80/20145320.html,就可以访问自己的登陆页面啦
-
在登录页面中输入数据库中存有的用户名和密码并点击提交进行用户认证登录成功,输入数据库中没有的就会认证失败
-
最终登陆成功的样子如下
这里有个重大的漏洞!口令以明文形式展现在了用户面前,虽然在数据库中是以MD5压缩的,但是在前端就被看得清清楚楚,更不要说我用burpsuite去截获数据包了!知道这个我甚至都不需要
(五)SQL注入
-
这个漏洞是由语法造成的漏洞,对刚刚自己建立的登录网站进行注入!!
-
构造SQL注入语句:在用户名输入框中输入' or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为select * from users where username='' or 1=1#' and password=md5('')
以下的两句sql语句等价:
select * from users where username='' or 1=1#' and password=md5('')
select * from users where username='' or 1=1 -
“#”号的作用注释掉后面的语句,所以后面就不用验证口令的md5值,而且1=1永远是都是成立的,即where子句总是为真,所以能够成功登录
分析一下出现在地址栏的这些参数'+or+1%3D1%23
,所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字),例如空格为%20,等号为%3D,井号为%23,但是还有不会被此方法编码的字符: *、~、-、.
- 通过SQL注入将用户名和密码保存在数据库中
';insert into users(userid,username,password,enabled) values(3,'aaa',password("aaa"),"TRUE");#
翻译过来就是
SELECT * FROM users WHERE username='';
insert into users(userid,username,password,enabled) values(3,'aaa',password("aaa"),"TRUE");
但是页面跳转是空白页,以我的代码来看也就意味着if ($result = $mysqli->query($query_str))不成立,即result为fault。
这是php防范SQL攻击的措施
可以修改为$result = $mysqli->multi_query($query_str)实现多条SQL语句
-
但是我输入用户名aaa密码aaa登录是不成功的,为了检验语句是否执行成功,我直接进了数据库中查找,看起来显然注入是没有问题的。
-
据说应该是$result->num_rows>0在我把query改为multi_query的时候出现了问题,于是参照别的同学修改代码为:
我感觉这个是在躲避问题,当多条语句SQL输入时上面的if被执行,当只输入一条SQL语句则两个if被执行
- 输入
';insert into users(userid,username,password,enabled) values(666,'aaa',password("aaa"),"TRUE");#
新插入一个用户
8.此时在登录页面输入用户名aaa密码aaa,成功
(六)XSS攻击
输入20145320可以看见图片