20192431 2021-2022-2 《网络与系统攻防技术》实验八实验报告
实验八 Web基础
实验内容
- Web前端HTML
能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 - Web前端javascipt
理解JavaScript的基本功能,理解DOM。
在1的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
尝试注入攻击:利用回显用户名注入HTML及JavaScript。 - Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
- Web后端:编写PHP网页,连接数据库,进行用户认证
- 最简单的SQL注入,XSS攻击测试
- 安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。
1.Web前端HTML
要求:能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
Apache:
·Apache就是一个Web服务器,通过该软件可以通过本机IP和预设的端口来访问该服务器上的网页。
·GET与POST方法的理解:
- Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据;
- Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL;
- Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前,而Post的所有操作对用户来说都是不可见的;
- Get传输的数据量小,这主要是因为受URL长度限制,而Post可以传输大量的数据,所以在上传文件只能使用Post。
- 使用Post传输的数据,可以通过设置编码的方式正确转化中文;而Get传输的数据却没有变化。
使用POST方法的话安全性会稍微好一些。
实验步骤:
- 启动apache并查看其状态,同时查看一下端口有没有被占用,然后呢都确认完以后,打开浏览器输入127.0.0.1,看一下能否正确地进入默认的页面。
- 再默认的存放html的文件夹/var/www/html之下新建一个zxw.html页面。测试一下这个前端,编写一个含有表单(form)的Html网页。在浏览器输入127.0.0.1/zxw.html来看一下。
cd /var/www/html
vim zxw.html
2 Web前端javascipt
- 理解JavaScript的基本功能,理解DOM。
- JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果,通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
DOM是文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构,换句话说,这是表示和处理一个HTML或XML文档的常用方法。举个例子,要改变页面的某个东西,JavaScript就需要获得对HTML文档中所有元素进行访问的入口。这个入口,连同对HTML元素进行添加、移动、改变或移除的方法和属性,都是通过DOM来获得的。 - 编写验证规则。
思路就是获取当前的表单值,然后检查用户名和密码是否为空。都不为空可以进行下一步操作
- 实验步骤:
在刚才的zxw.html中重新编写,添加上检查用户名和密码的规则:
function check() {
var user_name=form1.user.value;//获取表单form1的用户名的值
var user_pwd=form1.pwd.value;//获取表单form1密码值
if((user_name"")||(user_namenull)){//判断用户名是否为空,为空就弹出提示框"请输入用户名",否则正常执行下面的代码。
alert("NO USERNAME!");
form1.user.focus();//获取焦点,即:鼠标自动定位到用户名输入框,等待用户输入用户名。
return;
}
else if((user_pwd"")||(user_pwdnull)){//判断密码是否为空,为空就弹出提示框"请输入密码",否则正常执行下面的代码。
alert("NO PASSWORD!");
form1.pwd.focus();//获取焦点。
return;}
else {//如果用户名、密码都正常输入,则提交表单,浏览器经打开新的(主页)窗口。
form1.submit();
}
}
3 Web后端MySQL基础
3.1 登录MYSQL
- 在kali里输入
service mysql start
然后输入mysql -u root -p
输入密码后登录mysql
- 输入
show database;
查看有哪些数据库,使用use mysql;
选择mysql这个数据库,create database zxw;
创建新的数据库select * from users
查看用户等。还有使用insert
向表中插入数据,使用create table
创建新的表等等。
登录数据库:
查看已有的数据库:
使用其中的数据库:
查看使用数据库的用户:
为数据库改一下用户密码:set password for root@'localhost'=password('新的密码');
然后更改权限:flush,然后重新使用新密码登入数据库:
创建新的数据库,zxw,作为之后后端的数据库并且使用该数据库:
向这个新的数据库里建一个新的用户名密码表,然后网其中插入数据
输入命令grant select,insert,update,delete on xinshujukuming.* to xinyonghu@localhost identified by "password";
来增加新用户,将数据库exp8的root权限(包括select,insert,update,delete)授权给当前用户,使用这个用户连接数据库
4 编写PHP网页,连接数据库,进行用户认证
- 在/var/www/html下新建一个zxwlogin.php用来进行数据库连接。
- 可以先建一个php文件看一看能不能正常的显示。kali要安装好php,同时确保apache是开启的,php才可以打开。然后要把前端的action改成zxwlogin.php。因为action之后就是需要提交到这个后端进行操作,所以要把action改成在这里。
- 改完之后打开前端的页面,然后输入之前那个用户名和密码
如果输入的正好就是我们zxw数据库user数据表里所存在的数据,那么登录就可以成功。
如果输入的不是数据表里的数据:
- 我们利用javascript进行一个弹窗。输入
5 最简单的sql注入 XSS攻击
- SQL注入是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。简单地说,SQL注入的产生原因通常是将用户输入的字符串,当成了 “sql语句” 来执行。
构造:在用户名输入框中输入' or 1=1#
,或者zxw' or '1'='1
密码随便输入,这时候的合成后的SQL查询语句为select * from users where username='' or 1=1#' and password=md5('')
这样后面的密码啥的就被注释掉了,就可以成功的连接数据库
- XSS攻击:XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列
表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。
可以使用最简单的将一个图片放到html之下,然后在浏览器输入127.0.0.1/zxwqd.html访问自己的登入页面,输入同户名,密码任意输入,点击登入可以读取到图片并可以看到登入信息.
或者直接输入一段脚本
6 使用WEBGOAT完成练习题
- 在kali里下载webgoat,下载地址为https://github.com/WebGoat/WebGoat/releases,选择合适版本下载,直接拖入kali并创建一个webgoat的文件夹。
- 在终端打开webgoat-server-8.0.0.M26.jar的文件夹,输入命令运行,java -jar webgoat-server-8.0.0.M26.jar,启动成功。
- 登录注册进入webgoat
- SQL注入:第九题:
这是一个字符串类型的SQL注入。可选的的注入方式有:
方式1:Smith' or '1'='1。其实可以写任意字符串,而不必是Smith。
拼起来的完整SQL语句为:select * from users where LAST_NAME = 'Smith' or '1'='1'
方式2:' or 1=1 --。干脆不给LAST_NAME设置有效值,并且通过--将SQL语句中的'注释掉。
拼起来的完整SQL语句为:select * from users where LAST_NAME = '' or 1=1 --',--'是注释,所以SQL语法是没有问题的。
方式3:Smith';drop table users; truncate audit_log;--。这是堆叠的SQL语句,『堆叠』的英文叫做 『 stacked 』。如果是多条select语句,那么叫做堆叠查询(stacked queries)。
这一条执行之后,表 users 就被删掉了。并且将 audit_log 表中的数据删掉(而不会触发triggers)。
拼起来的完整SQL语句为:select * from users where LAST_NAME = 'Smith';drop table users; truncate audit_log;--'
方式4:' or true --。其实这种方式跟方式2是一样的。true本身也是有效的。但是,这里的true给人的意思是,你可以替换成任意复杂的SQL表达式,只要结果是true就可以了。这样可以增加对SQL注入的成功率。但是根据它能选择的类型,就选择第一个就行
第十题:代码中的查询构建了一个动态查询,使用相关输入字段,尝试从users表中检索所有数据,结果如下图所示:
XSS:第二题和第七题
第七题:字段是否容易受到XSS攻击的简单方法是使用alert()或console.log()方法。说明比较容易受到XSS攻击
第二题:是要看是否XSS攻击两次获得了一样的cookie
CSRF:
把这段代码提取出来
实验感想
对于SQL注入的理解其实还不是很明白,除了注释掉之后,比如说删除掉一个表那样的语句还不算太理解。还需要多学习。
实验问题
问题1:打不开PHP,跳转的时候出现这样的画面:
解决方法:重新启动了apache2,并且不是直接在/var/www/html下双击打开那个网页,而是在浏览器输入:127.0.0.1/zxw.html,这样就可以正常了。
问题2:启动Mysql遇到了ERRO2002这个报错
解决方法:service mysql restart。