目录
一、实验内容概述
-
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.phpvi 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(提示),并且在你并未注入成功时,有红字去提示原因,成功也会有提示,比如画上了绿色的勾,就会比较有成就感。
-
学到很多种类的注入,比起当初只知道那种普通的永真式的注入语句,现在掌握的方法更加多样。
-
这是本学期最后一个实验了。感觉这八次实验每次都是不断挑战自我、打怪升级的过程,跟着学长学姐的博客也可能会有很多问题,这需要我们不断开拓思维,解决问题,这一过程我也学到了很多网络攻防知识,深感自己的动手实践能力有了很大的提高。






























浙公网安备 33010602011771号