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.1 Web前端HTML
开启Apache服务
接下来在var/www/html路径下写一个包含表单的html,并将其命名为fanbingtian.html
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>library</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<img style="margin-top: -9px" src="20202422.jpg">
<div class="tpt-login">
<h1>FanBingtian Library</h1>
<form name="form1" method="post" action="" >
请输入用户名:<input type="text" name="usrname" placeholder="请输入用户名"/> <br>
密码:<br> <input type="password" name="pwd" placeholder="密码"/> <br>
<input type="submit" name="sub1" value="确定" />
<input type="reset" name="sub1" value="重置" />
<tr>
</tr>
</form>
</div>
</body>
</html>
接下来在kali的浏览器中输入
http://127.0.0.1/fanbingtian.html
打开html网页
2.2 Web前端javascipt
为了实现web前端的功能,需要对原有的html文件进行修改,并在原有文件基础上添加一段JavaScript代码,用以完成对用户是否填写用户名和密码的判断。没有输入密码或用户名,前段会弹出提示框。
<script type = "text/javascript">
function validateForm() {
var username = form1.usrname.value;
var password = form1.pwd.value;
if (username == "" ) {
alert("请输入用户名");
return false;
}
if (password == "" ) {
alert("请输入密码");
return false;
}
alert("欢迎你,"+username);
}
</script>
加入这段代码后,还需要在表单中加入οnsubmit="return validateForm()"的部分,才能使表单提交后执行javascript代码。
如图,没有输入密码会弹出提示框
如图没有输入用户名也会弹出提示框
2.3 Web后端:MySQL基础
因为kali自带mysql,所以不需要另外安装,直接开启mysql即可,
systemctl start mysql #开启mysql
systemctl status mysql #查看mysql运行状态
如果是第一次使用mysql,可以直接进入mysql数据库,进入之后再修改root用户密码,用于之后php文件通过数据库用户名和密码成功连接到数据库。
sudo mysql -u root #以root用户进入数据库
set password for root@'localhost'= password('20202422');#修改root用户密码
然后,需要在数据库中建表,并尝试插入数据
create database 2422web; //创建数据库
use 2422web; //使用数据库
create table user (username VARCHAR(20),password VARCHAR(20)); //创建表
insert into user values('fanbingtian','20202422'); //插入登录用户数据
2.4 Web后端:编写PHP网页,连接数据库,进行用户认证
接下来编写一个php文件用于连接刚才建立的数据库,并对用户输入和数据库中数据进行比对,也就是查询语句,如果数据存在该记录,则向前端返回登录成功,否则登录失败。
<?php
header("Content-type:text/html;charset=utf-8");
echo"<br> it's using php! <br>";
$uname=$_POST["usrname"];
$pwd=$_POST["pwd"];
echo"<br> Successfully accept POST!<br>";
$query_struser="SELECT * FROM user where username='$uname' and password='$pwd';";
$mysqli = new mysqli("localhost", "root", "20202422", "2422web");
$query_strdatabase="use 2422web;";
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if ($result = $mysqli->query($query_strdatabase)) {
echo"<br> Connected to 2422web Successfully! <br>";
}
echo "<br> xss {$uname} welcome ! <br> "; //用于XSS攻击
if ($result = $mysqli->query($query_struser)) {
if ($result->num_rows > 0 ){
echo "<br> Welcome {$uname}! <br> ";
}
else {
echo "<br> Login Fail! <br> " ;
}
/* free result set */
$result->close();
}
$mysqli->close();
?>
当然html文件的表单中的action必须指定为刚才编写的php文件,否则无法成功交给后端。
接下来,再次打开刚才的网址http://127.0.0.1/fanbingtian.html,进行验证
首先,随便输入一个错误的用户名和密码
显示登录失败
然后再正确输入,刚才创建的数据库中的用户名和密码
显示登录成功
2.5最简单的SQL注入,XSS攻击测试
2.5.1 SQL注入攻击
首先尝试在用户名框输入
'or 1=1#
这样以来,无论密码怎样输入,都可以登录成功
2.5.2 XSS攻击
首先需要在用户框输入
<script> alert ('20202422XSS attack'); </script>
然后随便输入一个密码,浏览器页面在弹出欢迎你的对话框后会紧接着弹出xss攻击 alert (‘20202422XSS attack’)所弹出的内容,原因是调用了一个 alert ()方法。
xss漏洞可以成功实现的原因是因为php文件中存在下面一行代码
echo "<br> xss {$uname} welcome ! <br> ";
这行代码会将 xss {$uname} welcome
输出到界面,而$uname
正好是输入的用户名,如果用户输入一个可以执行的脚本,那么就可以成功利用这个漏洞,得以执行
2.6安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。
2.6.1 SQL注入攻击
首先在网上下载jar包,下载完成后,在jar包所在的目录下,打开终端
输入命令,运行webgoat
java -jar webgoat-2023.4.jar
接下来在浏览器中输入http://127.0.0.1:8080/WebGoat/
随后注册一个新用户
登录进来以后在左侧的页框中选择injection->SQL injection(info),随后在下拉框中选择合适的选项用以构成一个能够成功进行sql注入攻击的sql查询语句。
选择好下拉框中的选项后,点击右侧的“Get Account info”,可以显示在下面显示出成功查询出的各条纪录。
为什么可以成功查询出数据库的所有信息呢,是因为构造后的sql语句为:SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or '1' = '1
’,在sql语句中用or连接符相连的是’1’=‘1’,是永真的,所以该查询语句会查询出表中的所有数据。
2.6.2 XSS注入攻击
这个xss攻击其实非常简单,只要在用户输入框输入<script>alert("20202422fbt")</script>
即可完成。
因为xss攻击是基于网站后端存在的漏洞,如果后端会将用户输入输出到网页上,就可以尝试构造含有恶意脚本的输入比如,我用的就是alert("20202422fbt")
,是一个alert方法。
如图,页面成功弹出了提示框,xss攻击成功。
2.6.3 CRSF攻击
首先按“F12”进入开发者模式,随后可以看到在浏览器下方出现了一大堆网页源代码
接下来先点击最左侧的小方框图标,随后我们把鼠标移动到页面上方的“Submit Query”时,页面下方的代码框就会显示出与之对应的form表单的代码。
我把这段代码copy下来,复制到新创建的html文件中,并在开头结尾加上html标签和body标签。
然后再用浏览器打开fbt.html,可以看到页面中只有一个提交框"Submit Query"
点击"Submit Query",就可以成功获取flag值
然后回到WebGoat提交flag,即可验证该部分实践成功完成。
但是做完以后我对csrf攻击的原理还不是很清楚,所以我特意上网学习了一下有关知识
CSRF是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。可以简单的理解为:攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。攻击者只要借助少许的社会工程学的诡计,例如通过 QQ 等聊天软件发送的链接(有些还伪装成短域名,用户无法分辨),攻击者就能迫使 Web 应用的用户去执行攻击者预设的操作。
3.学习感悟、思考等
至此,本学期《网络与系统攻防技术》课程的实验部分就结束了。还记得第一次做实验是最折磨的,因为经验不足、知识储备太少,硬是研究不明白怎么做。后来经过王老师一学期的辛勤栽培,加之自己的努力,已经具备了一定的网络与系统攻防的意识和能力,能够完成系统和web攻击,能够对恶意代码进行分析和溯源,能够独立完成大作业和课设的项目。
网络与系统的攻击防御技能永远都是魔高一尺道高一丈,随着科技的更新和发展永远有学不完的知识和技能,需要不断保持学习的劲头,才能成为主导者。这门课的知识广度和深度都比较大,学着一点都不轻松,但是学完我受益匪浅。
感谢王老师一学期以来的辛勤付出!师父领进门、修行在个人,今后我仍旧会继续学习这个领域相关前沿内容。