目录

一、实验内容概述

二、实验原理

三、实验过程

四、实验感想

一、实验内容概述

  • Web前端HTML

    • 能正常安装、启停Apache。
    • 理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
  • Web前端javascipt

    • 理解JavaScript的基本功能,理解DOM。
    • 编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
  • Web后端

    • MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
    • 编写PHP网页,连接数据库,进行用户认证
  • 最简单的SQL注入

  • XSS攻击测试

  • 选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例。

二、实验原理

1.Web前端

Apache
  • Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。

  • 使用Apache提供的web服务器是由守护进程httpd,通过http协议进行文本传输,默认使用80端口的明文传输方式。当然,为了保证数据的安全和可靠性,又添加了443的加密传输的方式。

  • 安装Apache2(linux已默认安装)
    sudo apt-get install apache2

  • 开启Apache服务
    systemctl start apache2

  • 关闭Apache服务
    systemctl stop apache2

  • Apache2的主配置文件:etc/apache2/apache2.conf

  • Apache2的默认工作目录:/var/www/html

  • Apache存储错误信息的日志文件:/var/log/apache2/error.log

HTML
  • 简介:HTML—超文本标记语言,是一种用于创建网页的标准标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。
  • 表单Form:是一个包含表单元素的区域,用于搜集不同类型的用户输入。
    • 表单元素允许用户在表单中输入内容,包括文本框、复选框、单选按钮、提交按钮等等。
    • 多数情况下被用到的表单标签是输入标签<input>,其输入类型是由类型属性(type)定义
GET和POST方法
  • Form 中的 get 和 post 方法,在数据传输过程中分别对应了 HTTP 协议中的 GET 和 POST 方法。

  • GET方法:从指定的资源请求数据。(Get 是 Form 的默认方法)

    • Get 将表单中数据的按照 variable=value 的形式,添加到 action 所指向的 URL 后面,并且两者使用“?”连接,而各个变量之间使用“&”连接。这种方法传输数据是不安全的。
    • Get 传输的数据量小,这主要是因为受 URL 长度限制(一般最大为2KB),对 URL 限制的大多是浏览器和服务器的原因,服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。
  • POST方法:向指定的资源提交要被处理的数据。

    • Post 是将表单中的数据放在 form 的数据体中,按照变量和值相对应的方式,传递到 action 所指向 URL。与GET方法比较为安全。
    • Post 可以传输大量的数据,所以在上传文件我们选择使用 Post
      从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。
CSS
  • 层叠样式表, 是一种描述 HTML 文档样式的语言,即描述应该如何显示 HTML 元素。
  • CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化,在浏览器中运行。
  • 开始和结束标签:<style>xxxxxxx</style>
JavaScript
  • JavaScript 是互联网上最流行的脚本语言,是一种轻量级的编程语言。
  • JavaScript 是可插入 HTML 页面的编程代码,其插入HTML页面后,可由所有的现代浏览器执行。

2.Web后端

  • 编程语言:PHP/JSP...
  • 运行环境:应用服务器/中间件
  • 编程用途:对前端提交的数据进行处理并返回相应的HTML网页内容
PHP
  • 简介:超文本预处理器,是一种通用开源脚本语言。PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器。
  • 用途:PHP 可以生成动态页面内容;可以创建、打开、读取、写入、关闭服务器上的文件; 可以收集表单数据;可以发送和接收 cookies;可以添加、删除、修改您的数据库中的数据;可以限制用户访问您的网站上的一些页面;可以加密数据
  • 预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
  • 预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。
SQL注入
  • sql注入攻击是利用是指利用设计上的漏洞,通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
  • Sql注入攻击得逞的主要原因:动态生成Sql语句时没有对用户输入的数据进行验证。
  • SQL注入式攻击的主要形式有两种。
    • 直接注入式攻击法:直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。
    • 间接的攻击方法:将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。
XSS攻击
  • XSS 即跨站脚本攻击。XSS的重点不在于跨站点,而在于脚本的执行。
  • XSS的原理:恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的。
    XSS攻击最主要有如下分类:反射型、存储型、及 DOM-based型。 反射性和DOM-baseed型可以归类为非持久性XSS攻击。存储型可以归类为持久性XSS攻击。

3.WebGoat

  • WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。
  • 安装:下载java -jar webgoat-container-7.1-exec.jar
  • 使用:在终端输入命令运行java -jar webgoat-container-7.1-exec.jar

三、实验过程

(一)Web前端:HTML

1.安装、配置、停止Apache2
  • 安装:sudo apt-get install apache2 (kali已默认安装)

  • 开启Apache:systemctl start apache2

  • 查看侦听端口:netstat -aptn

  • 如果80端口被Apache2监听,则启动成功。

    • 可以使用netstat -tupln | grep 80 查看80端口的占用情况,如果80端口被其他应用占用,则用kill + 进程号将其杀掉。也可以通过修改ports.conf的方法,把Apache的默认端口从80改为其他的未被占用的端口。
  • 在浏览器中输入127.0.0.1,如下图所示,可正常打开Apache介绍网页

2.编写一个含有表单的HTML,理解HTML,理解表单,理解GET与POST方法

/var/www/html/目录下,创建一个html页面,名为1217.html

代码如下(get方法):

<html>
<head>
<title>20201217</title>
<meta http-equiv="Content-Type" content="test/html; charset=utf-8" />
</head>
<body>
<h2>Login</h2>
<center>
<form action="myindex" method="get" name="form_login">
<input placeholder="username" name="user" class="user" type="text" onfocus="if (th is.value=='Your name') this.value='';" />
<br>
</br>
<input placeholder="Password" name="Password" class="pass" type="password" onf ocus="if (this.value=='Your password') this.value='';"/>
<br>
</br>
<input type="submit" value="Login" onClick="return validateLogin()"/>
</form>
</center>
</script>
</body>
</html>

  • 在网页中输入/var/www/html/1217.html,显示一个网页表单

(二)Web前端:javascript

1.添加一段JavaScript代码,以完成对用户是否填写账号和密码的判断,在用户点击登陆按钮后回显“欢迎+输入的用户名”
  • 在后添加如下代码
<!--//main-->
<script language="javascript">
function validateLogin(){
var sUserName = document.form_login.user.value;
var sPassword = document.form_login.Password.value;
if ((sUserName =="") || (sUserName=="Your name")){
alert("need name!");
return false ;
}
if ((sPassword =="") || (sPassword=="Your password")){
alert("need password!");
return false ;
}
}

  • 效果如下:


2.编写登录成功后跳转的界面,主要任务是获取用户名参数并显示出来
  • 编写myindex文件
<html>
<head>
<title>myindex</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<script language="JavaScript" type="text/javascript">
var searchStr = location.search;
searchStr = searchStr.substr(1);
var searchs = searchStr.split("&");
var username = searchs[0].split("=");
document.write("欢迎您:"+username[1]);
</script>
<body>
<h2 align="center">myindex</h2>
</body>
</html>

3.尝试注入攻击
<html>
<head>
<title>myindex</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2 align="center">myindex</h2>
<h3 id="n"></h3>
<script language="JavaScript" type="text/javascript">
function myname() {
var searchStr = location.search;
searchStr = searchStr.substr(1);
var searchs = searchStr.split("&");
var username = searchs[0].split("=");
return username[1];
}
document.getElementById("n").innerHTML = decodeURIComponent(myname());
</script>
</body>
<a id='n'></a>
</html>
  • 注入html
  • 在框里输入<h1>wjwjwj<h1>

  • 注入 Javascript
    <script language="JavaScript" type="text/javascript">alert("人类命运共同体");</script>

(三)Web后端 :MySQL基础

  • 正常安装、启动MySQL,建库、创建用户、修改密码、建表

  • 输入 service mysql start开启MySQL服务

  • 输入sudo mysql -u root -p使用mysql,默认密码是password

  • 创建用户
    CREATE USER wj@localhost IDENTIFIED BY '092111';

  • use mysql

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

  • 输入create database WJ1;创建一个新的数据库LZ1,创建好之后查看一下show databases

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

  • 输入create table login(username VARCHAR(20),password VARCHAR(20));建立数据库表login,并设置字段基本信息

  • 使用insert into 表名 values('值1','值2','值3'...);插入数据;

    • insert into login values ('20201217@qq.com', '20201217');
  • 输入select * from login;查询表中的数据

  • 在MySQL中增加新用户,输入grant select,insert,update,delete on WJ1.* to wj@localhost identified by "092111"; 命令在MySQL中增加新用户,这句话的意思是将对WJ1数据库的所有表的select,insert,update,delete权限授予当前主机localhost登录的用户wj,092111是登录密码。

(四)Web后端:编写PHP网页,连接数据库,进行用户认证

  • 安装php
    sudo apt-get install php

  • 我的kali以前已经安装过了

  • /var/www/html目录下新建一个PHP测试文件phptest.php

    • vi phptest.php
<?php
echo	"Hello	word!	This	is lz	test	page!";
?>
  • 输入
    127.0.0.1/phptest.php

  • 成功执行了 PHP 代码

  • 连接数据库,进行用户认证

    • test.php 代码
<?php
$uname=$_POST["user"];
$pwd=$_POST["Password"];
echo $uname;
$query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "root", "20204304", "LZ1");
$query_str1="use LZ1;";
/* 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> Welcome login Mr/Mrs:{$uname}:<br> ";
}
else {
echo "<br> login failed!!!! <br> " ; }
/* free result set */
$result->close();
}
$mysqli->close();
?>
  • 将之前的 1217.html 中的中的 action 设为 test.php ,method改为 POST

  • 以创建的数据库用户20201217@qq.com登录 127.0.0.1/1217.html 查看

    • 密码正确:
    • 密码错误

(五)最简单的攻击

(1)SQL 注入
  • 输入' or 1=1#,密码随意

(2)XSS攻击
  • 在用户名输入<script>alert(1)</script>,密码随便输

密码正确:

(六)Webgoat攻击

实验前准备:jdk与webgoat的安装

1、首先去oracle官网进行下载。(注意:这里我下载的jdk版本为1.8,可与7.0.1的webgoat匹配。版本不匹配后续就会报错!!!并且kali中的openjdk并不是所对应需要的jdk!!!)

(以上报错就是版本不匹配导致的)

2、按照先进行jdk的安装与配置。
3、下载webgoat-container-7.0.1-war-exec.jar。
网站链接

点击第一个进行下载

4、运行WebGoat
在下载目录下cmd,输入java -jar webgoat-container-7.0.1-war-exec.jar

5、当看到 Starting ProtocolHandler ["http-bio-8080"]这一条消息之后,即可开始后续的实验。

6.在浏览器中输入http://localhost:8080/WebGoat进入WebGoat登录界面,下方已经给出两组默认的用户名和密码

实验点一:SQL

(一)命令注入(Command Injection)
  • 原理:在正常的参数提交过程中,添加恶意的代码,往往能够得到以外的收获。

  • 目标:能够在目标主机上执行任何系统命令

  • 步骤:

  • 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"


  • 点击View,攻击成功:

  • 与正常的结果相对比,可知:遭到Command Injection攻击的网页在返回正常的结果之外还被输入了shell指令而执行了netstat -an命令并返回了结果。

(二)数字型注入(Numeric SQL Injection)
  • 原理:在station字段中注入特征字符,能组合成新的SQL语句。

SELECT * FROM weather_data WHERE station = [station]

  • 目标:下面的表单允许用户查看天气数据。请通过注入 SQL 字符串的方式查看所有的天气数据。

  • 步骤:

  • 右键点击复选框,选择inspect Element审查网页元素对源代码value="101"进行修改,在城市编号101后面添加or 1=1:

  • 点击Go!,攻击成功,显示所有城市的天气情况:

  • 正常情况下的显示:

(三)字符串注入(String SQL Injection)
  • 原理:基于以下查询语句构造自己的SQL注入字符串。

  • SELECT * FROM user_data WHERE last_name = '?'

  • 目标:下面的表格,允许用户查看他们的信用卡号码。尝试通过SQL注入将所有信用卡信息显示出来。尝试的用户名是“Smith”。

  • 步骤:

  • 正常查询结果应该只有员工Smith的信息:

  • 通过分析可知:将''提前闭合,插入永真式然后注释掉后面的内容就可以了,所以输入Smith' or 1=1 --即可完成本课程内容。注入成功后,便可看到所有员工的信息:

实验点二:XSS

(一)存储型XSS攻击(Stored XSS Attacks)
  • 原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。

  • 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。

  • 步骤:在title中任意输入字符,留言板中输入,即可攻击成功。

(二)反射型XSS攻击(Reflected XSS Attacks)
  • 目标:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。

  • 步骤:输入代码,点击purse的同时页面就给出了反馈:

实验点三:CSRF

  • 绕过 CSRF 确认(CSRF Prompt By‐Pass)

  • 原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。

  • 目标:与CSRF课程类似,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单上发现绿色复选框。

  • 步骤:

  • 查看页面右侧Parameters中的src和menu值分别为272和900:

  • 并在title框中输入任意内容,message框中输入代码:

<iframe src="attack?Screen=272&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=272&menu=900&transferFunds=CONFIRM"> </iframe>
  • 在Message List中生成以Title命名的链接,点击进入后,攻击成功

四、实验总结

  • 本次实验整体还比较顺利,感觉这次的这种实验形式我能学到更多。我感觉最有意思的是在webgoat网页左侧的各种课程中学习,可以根据它给的solution来具体学习原理与方法,并根据它所写的步骤来进行实验,还有hints(提示),并且在你并未注入成功时,有红字去提示原因,成功也会有提示,比如画上了绿色的勾,就会比较有成就感。

  • 学到很多种类的注入,比起当初只知道那种普通的永真式的注入语句,现在掌握的方法更加多样。

  • 这是本学期最后一个实验了。感觉这八次实验每次都是不断挑战自我、打怪升级的过程,跟着学长学姐的博客也可能会有很多问题,这需要我们不断开拓思维,解决问题,这一过程我也学到了很多网络攻防知识,深感自己的动手实践能力有了很大的提高。