20222428 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,建库、创建用户、修改密码、建表
编写PHP网页,连接数据库,进行用户认证
最简单的SQL注入,XSS攻击测试
(4)安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击。
2.实验过程
2.1Web前端HTML
2.1.1能正常安装、启停Apache。
Kali虚拟机默认安装apache2,输入命令service apache2 start
开启服务
查看状态为active(活跃),说明服务开启成功。
浏览器访问127.0.0.1
成功打开Apache的默认网页,开启成功。
2.1.2理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
HTML概念:用于创建网页和在线文档的标准标记语言。
原理:它使用“标签”来描述网页的结构和内容。例如,h1标签用于定义标题,p标签用于定义段落,而a标签用于创建链接。
表单概念:表单用于收集用户输入的数据。
原理:表单可以包含输入字段(如文本框、密码框、单选按钮、复选框、下拉列表等)、文本区域和按钮(如提交按钮和重置按钮),并允许用户输入数据,然后将这些数据发送到服务器进行处理。
GET 方法概念:是 HTTP 协议中的一种请求方法,通常用于请求服务器发送某个资源。
原理:当使用 GET 方法提交表单时,表单数据会附加在 URL 的末尾,形成查询字符串。GET 请求的数据在 URL 中可见,且长度有限制。
POST 方法概念:是 HTTP 协议中的一种请求方法,通常用于向服务器提交数据以进行处理(例如,提交表单数据以进行存储或更新)。
原理:POST 请求的数据不会附加在 URL 的末尾,而是包含在请求的 body 部分。这使得 POST 方法更适合发送大量数据,且数据不会显示在 URL 中,增加了安全性。
在var/www/html目录下创建html文件 20222428login.html,通过vi写入以下内容
HTML含有表单的基本代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>20222428-spongedog</title>
</head>
<style type="text/css">
.divForm{
position: absolute;/*绝对定位*/
width: 300px;
height: 200px;
text-align: center;/*(让div中的内容居中)*/
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -150px;
}
</style>
<body>
<div class="divForm">
<h1 align="center">Login</h1>
<form name="form1" onsubmit="return checkForm();" method="post" action="index.php">
<table >
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="" /></td>
<td><br><br></td>
</tr>
<tr>
<td> 密 码:</td>
<td><input type="password" name="userpwd" value="" /></td>
<td><br><br></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
输入并点击提交按钮,跳转到404(因为未写接收用户登陆数据的php文件)
2.2Web前端javascipt
2.2.1理解JavaScript的基本功能,理解DOM。
JavaScript: 是一种用于创建动态和交互式网页的脚本语言。
功能:可以直接嵌入到 HTML 页面中,用于控制网页的行为和内容并响应用户的操作。
DOM:是一种编程接口,它将 HTML 或 XML 文档表示为一个结构化的文档树。
功能:通过使用 DOM,开发者可以动态地更新网页内容、添加或删除元素、修改元素的属性等。
2.2.2在2.1的基础上,编写JavaScript验证用户名、密码的规则。
使用JavaScript实现用户名、密码验证以及回显功能
编辑20222428login.html文件
加入以下javaScript部分:
<script type="text/javascript">
function checkForm(){
if (form1.username.value == null || form1.username.value==""){
alert("请输入用户名");
return false;
}
if (form1.userpwd.value == null || form1.userpwd.value==""){
alert("请输入密码");
return false;
}
return true;
}
</script>
没有输入密码:
没有输入用户名:
PHP概念:是一种广泛使用的开源服务器端脚本语言,特别适合用于 Web 开发。
PHP 原理:代码可以嵌入到 HTML 中,并在服务器上执行PHP 脚本在服务器上运行,然后将生成的 HTML 内容发送到客户端浏览器。
通过vi创建用于接收用户登陆数据的index.php文件并写入以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome!</title>
</head>
<body>
<h1 align="center">欢迎!<?php echo $_POST['username'];?></h1>
</body>
</html>
使得用户点击登陆按钮后回显“欢迎+输入的用户名”
2.2.3尝试注入攻击
利用回显用户名注入HTML及JavaScript
登录时将用户名改为
可见跳转页面显示give me the money
2.3Web后端
2.3.1MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
kali自带MySQL,通过命令systemctl start mysql
启动MySQL
输入mysql -u root -p使用root权限进入(密码是root的密码)
CREATE DATABASE lsqz;//建立数据库
//创建用户,设定密码:
CREATE USER 'ls'@'localhost' IDENTIFIED BY '20222428';
//‘ls’(user):用户名
//‘localhost’(host):本地用户用localhost;
//‘20222428’(password):登陆密码。
grant all privileges on lsqz.user_info to ls@localhost identified by "20222428";//将数据库lsqz的所有权限授予当前创建用户
use lsqz;
create table user (username VARCHAR(50),password VARCHAR(50));//创建表
insert into user values('lsqz','20222428');
select * from user;//查看
2.3.2编写PHP网页,连接数据库,进行用户认证
在var/www/html目录下编写login.php
<?php
$con=mysqli_connect("127.0.0.1","ls","20222428","lsqz"); //连接数据库
if(!$con){die("error:".mysqli_connect_error());}
$user=$_POST["username"];
$pwd=$_POST["userpwd"];
if($user==null||$pwd==null){
echo "<script>alert('账号和密码不能为空!')</script>";
die("账号和密码不能为空!");
}
$sql="select * from user where username='$user'and password='$pwd'";
$res=mysqli_query($con,$sql);
$row=$res->num_rows;
if($row!=0)
{
echo "<h1>登录成功,欢迎您 {$user}!</h1>";
}
else
{
echo "用户名或密码错误";
}
?>
将之前的20222428login.html进行修改
在浏览器里访问localhost/20222428login.html
不输入账号密码
输入错误的用户名或密码
用正确的用户名和密码登录
2.3.3最简单的SQL注入,XSS攻击测试
SQL 注入是一种常见的 Web 攻击方式。
原理:攻击者通过在输入字段中插入恶意的SQL代码,欺骗数据库服务器执行非授权的任意查询,从而获取、修改、删除或添加数据库中的数据。
在用户名输入框输入' or 1=1#,并输入错误的密码。
可以看到就算密码错误,登录却是成功的。
原因分析:
原始SQL查询语句如下:
$sql = "select * from user where username='$user' and password='$pwd'";
此查询旨在根据用户提供的用户名($user)和密码($pwd)从user表中检索数据。如果用户名和密码匹配数据库中的记录,则查询将返回用户名,表明用户身份验证成功。
然而,当攻击者输入特定的字符串作为用户名(' or 1=1#),原始查询将被篡改为:
$sql = "select * from user where username='' or 1=1#' and password='$pwd'";
输入的字符串' or 1=1#首先通过单引号(')闭合了原有的username条件中的单引号,使得SQL语句的语法仍然有效。
逻辑条件:or 1=1是一个逻辑表达式,它总是为真(true)。这意味着,无论username的实际值是什么,只要这个逻辑表达式存在,整个where子句就会评估为真。
注释符号:#是SQL中的注释符号,它会忽略其后的所有字符,直到行尾。因此,#' and password='$pwd'部分实际上被注释掉了,这意味着密码验证被完全绕过。
方法1:修改login.php以显示用户名
如果login.php在账号密码验证失败时不显示用户名($user),那么攻击者无法通过XSS注入恶意代码,因为他们的输入没有被输出到页面上。
现修改login.php,使其在验证失败时也输出用户名,那么攻击者就有机会注入恶意脚本。
回到登录的网页,用户名输入
注入成功,但显示是登录不成功。
方法2:通过SQL注入绕过登录验证
' or 1=1#<script>alert("Big Brother is watching you")</script>
用户名: ' or 1=1#
密码: 任意值(因为密码验证已被绕过)
回显成功且显示登录成功。
2.4安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击
2.4.1下载并WebGoat
WebGoat是一个专为进行WEB漏洞实验设计的应用平台
下载地址:https://github.com/WebGoat/WebGoat/releases
下载jar包,通过共享文件夹将其拖入kali中,并在kali输入以下命令:
java -jar webgoat-2023.8.jar
访问此过程中给出的网站地址并注册
登录后就可进Webgoat页面
2.4.2SQL注入
查看题目发现A3前三个与SQL有关
SQL injection(intro)的题目9是SQL注入题:
当这个Smith OR 1 = 1输入被插入到SQL查询中时,它会改变查询的语义。
原来的查询可能是:SELECT * FROM users WHERE first_name = 'John' AND last_name = 'Smith'
被注入后的查询变成了:SELECT * FROM users WHERE first_name = 'John' AND last_name = 'Smith ' OR '1' = '1'
由于'1' = '1'总是为真,这个条件实际上被忽略了,查询变成了:SELECT * FROM users WHERE first_name = 'John'(但last_name的条件被绕过了)。
题目10:
2.4.3XSS攻击
A3的Cross Site Scripting部分是XSS攻击的内容
第七题:
查找页面上所有允许用户输入的地方,输入一些数据并按下Purchase,看看哪个输入会回显
可见card number输入框输入参数会回显,在这个输入框中输入:
回显成功。
2.4.4CSRF攻击
CSRF 是一种对网站的恶意利用。它与XSS不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。
A10处第三题跨站请求伪造:
查找提交查询(submit query)按钮的前端代码的表单部分
编写html文件
<html>
<body>
<form accept-charset="UNKNOWN" id="basic-csrf-get" method="POST"name="form1" target=" blank" successcallback="" action="http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag">
<input name="csrf" type="hidden" value="false"><input type="submit" name="submit">
</form>
</body>
</html>
action="http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag"
意味着当表单中的数据被提交(用户点击了提交按钮),浏览器将会把这些数据发送到http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag这个地址。
打开这个网页,点击按钮
可以看到flag=58971,成功获取flag值
在题目中输入flag值
成功过关
3.问题及解决方案
- 问题1: kali里没有mysql
- 问题1解决方案:使用以下命令安装mariadb:sudo apt install mariadb-server
- 问题2:手动安装的mariadb缺乏mysqli的扩展,无法支持php中的数据库连接
- 问题2解决方案:输入以下命令解决:
sudo apt install php php-cli php-fpm
apt-get install php-mysalisudo systemctl restart apache2php -m lgrep mysqli
4.学习感悟、思考等
通过本次实验,我全面掌握了Web开发的基础知识,并深入了解了Web安全的重要性。
在前端方面,我学习了HTML与JavaScript,掌握了如何构建网页和添加动态交互功能。我成功编写了一个包含用户名和密码输入框的HTML表单,并使用JavaScript进行输入验证,确保用户输入符合规定的格式。同时,我也尝试了HTML和JavaScript注入攻击,这让我深刻认识到对用户输入进行适当过滤和转义的重要性,以防止XSS等安全漏洞。
在后端方面,我学习了MySQL数据库和PHP编程语言,掌握了如何安装和启动MySQL服务器,以及进行基本的数据库管理操作。我编写了PHP代码来连接MySQL数据库,实现了用户认证功能。通过POST方法接收表单数据,并使用SQL语句查询数据库中的用户信息,从而实现了用户登录的功能。同时,我也进行了SQL注入攻击测试,这让我意识到在使用PHP和MySQL进行Web开发时,需要特别注意SQL语句的安全性,防止SQL注入攻击。
此外,我还选择了安装WebGoat平台来进行Web安全实验。通过该平台,我实践了SQL注入、XSS和CSRF等攻击方式,深刻理解了这些安全漏洞的危害性和防御方法。我成功利用SQL注入攻击绕过了用户认证机制,获取了数据库中其他用户的信息;通过XSS攻击在受害者的浏览器中执行了恶意代码;还通过CSRF攻击伪造了用户请求,执行了未经授权的操作。这些实验让我意识到,Web安全需要综合考虑前端和后端的安全性,实施适当的防御措施,如对用户输入进行过滤和转义、使用参数化查询防止SQL注入、实施CSRF防御措施等。