20222414 2024-2025-1 《网络与系统攻防技术》实验八实验报告

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)安装DVWA或WebGoat平台,并完成SQL注入、XSS、CSRF攻击。

2.实验过程

2.1Web前端HTML

(1)打开Apache。
因为kali都只带APache所以无需安装,输入systemctl start apache2即可
在浏览器中打开127.0.0.1,出现下图表示打开APache成功

(2)编写20222414.html文件,其中内容包含了form表单,然后保存到/var/www/html目录下。

命令为vi /var/www/html/20222414.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>会员登入页面</title>
<link rel="stylesheet" href="css/style.css"> <!-- 这是外部调用css -->
<style>
input[type=text]{
   width:340px;
   font-size:16px;
   background:#f5f5f5;
   color:#666666;
}
input[type=password]{
   width:340px;
   font-size:16px;
   background:#f5f5f5;
}
 #ID2 {
   width: 100%;
   height: auto;
   display: block;
   margin: 0 auto;

 }
  #ID3{
   font-family: "Times New Roman";
   font-size: 30pt;
   margin: 0;
   padding: 20px;
   align:center;
</style>
</head>
<body align="center" >
<div align="center">
   <form name="form1" method="POST" action="Logservlet">
   	<h2>登入界面</h2>
   	<input type="text" placeholder="请输入账号" name="username">
   	<br>
   	<input type="password" placeholder="请输入密码" name="pwd">
   	<br>
   	<p><input type="radio" name="dsaf">我已同意<a href="#" target="_blank">登入协议</a> 
   		<!--#表示跳转到当前页面  --></p>
   	<input type="submit" value="登入">
   </form>
</div>
</body>
</html>

(3)在火狐浏览器中打开20222414.html文件
结果如下图所示:

2.2Web前端javascipt

(1)在原来20222414zbq.html文件中进行完善,添加JavaScript,判断提交用户名、密码是否为空。并且登入后显示欢迎+用户名。
代码如下:


<!DOCTYPE html>
<html>
<script type="text/javascript">
     function check(){
         var uname = form1.usrname.value;
         var upwd = form1.pwd.value;
         
         if(uname == ""){
             alert("用户名不能为空!")}    
         else if(upwd == ""){
             alert("密码不能为空!");}
         else {
             document.write("欢迎"+uname)
         }
     }
 </script>
<head>
<meta charset="UTF-8">
</head>

<body>
<div style="text-align:center">
<h1>这是一个登录页面</h1>
<form name="form1" method="post" action="">
用户名:<input type="text" name="usrname"/>
<br><br>
密码:<input type="password" name="pwd"/>
<br><br>
<input type="submit" name="sub1" value="确定" onclick="check()"/> //按钮添加onclick属性
<input type="reset" name="sub1" value="重置"/>
</form>
</div>
</body>

</html>

(2)浏览器打开20222414zbq.html文件,尝试多种输入情况

①没有用户名时:会显示用户名不能为空

②没有密码时:显示密码不能为空

③成功登入:

(3)尝试注入攻击:利用回显用户名注入HTML及JavaScript。
在用户名中输入以下内容:<p>HTML注入攻击20222414zbq</p> <script type="text/javascript"> alert("JavaScript注入攻击20222414zbq") </script>
html文件就会将其认为是html编码的内容。

注入攻击成功:

2.3Web后端

(1)启动MySQL
输入以下命令启动MySQL

systemctl start mysql //打开mysql
systemctl status mysql  //查看mysql状态


(2)查看

use mysql; # 进入mysql数据库
show databases; # 查看现有的数据库
select host, user, password from user; # 查看用户表数据

修改密码

set password for ‘root’@‘localhost’ = password(‘20222414zbq’); # 修改root用户密码
flush privileges; # 更新权限

(3)创建用户
输入create user 'zhaobingqian'@'%' IDENTIFIED BY '20222414';
用户为zhaobingqian 密码为20222414

(4)建库
输入create database 20222414zbq;
输入use 20222414zbq开始使用

(5)建表
输入create table lguser (username VARCHAR(30),password VARCHAR(20));创建一个名为lguser的表

输入insert into lguser values(‘20222414’,‘zbq’);在登陆用户表中添加一条个人信息

输入select * from lguser;查看登陆用户表记录
截图如下:

2.4Web后端

分别输入命令
vi /var/www/html/login.php
vi /var/www/html/20222414zbq.html

(1)编写PHP网页
代码如下:

<?php  
$servername = "localhost";  
$username = "root";   
$password = "20222414";   
$dbname = "20222414zbq";  
$conn = new mysqli($servername, $username, $password, $dbname); // 使用 mysqli 创建一个新的数据库连接  
// 检查连接是否成功  
if ($conn->connect_error) {  
    // 如果连接失败,输出错误信息并停止脚本执行  
    die("连接数据库失败: ". $conn->connect_error);  
}     

$username = $_POST['username']?? '';    
$password = $_POST['password']?? '';  
if ($username == null || $password == null) {
    echo "<script>alert('账号和密码不能为空!')</script>";
    die("账号和密码不能为空!");
}  

$sql = "SELECT * FROM user WHERE username =? AND password =?";  
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();    

if ($result->num_rows > 0) {  
    // 如果找到了匹配的用户,输出登录成功的消息  
    echo "登录成功,欢迎您zbq!";  
} else {  
    // 如果没有找到匹配的用户,输出用户名或密码错误的消息  
    echo "用户名或密码错误";  
}   
// 关闭数据库连接  
$conn->close();  
?>

(2)连接数据库
将原来的20222414.html进行修改,将表单的“action”属性指向“login.php”,其action就是将form表单中提交的内容传送到login.php进行验证
代码如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
 
<body>
    <h1>Login</h1>
    <form  name="20222414" method="post" action="20222414.php">
        <font>账号:</font>
        <input type="text" name="username" id="username"><br>
        <font>密码:</font>
        <input type="password" name="password" id="password"><br>
        <button onclick="login()">login</button>
    </form>
</body>
</html>

(3)进行用户认证

2.5最简单的SQL注入,XSS攻击测试

(1)sql注入攻击
其实sql注入攻击是非常简单的攻击,只要让输入的东西让系统认为是永真的就可以,比如说or '1'='1,然后我认为最简单的避免方式就是使用参数化查询,修改查询语句即可避免sql注入攻击。

比如用户名注入or '1'='1,密码随便输一个,就成功登陆了
截图如下:

(2)xss攻击
用户名注入<script> alert("XSS攻击20222414zbq") </script>
截图如下:

2.6安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。

(1)在windows主机下载webgoat-2023.8.jar,通过共享文件夹保存到kali虚拟机中去
webgoat下载链接:(https://github.com/WebGoat/WebGoat/releases)

(2)打开webgoat服务
输入命令java -jar webgoat-2023.8.jar

(3)输入http://localhost:8080/WebGoat/login,进入该网站,然后进行注册后登入

(4)进行SQL注入攻击
按照下图,依次选择左侧栏A3→SQL Injection(Intro)→9号

分析:"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "'";
lastName 是一个变量,它的值来自于用户输入或其他外部来源。如果不对 lastName 进行适当的处理,攻击者可以通过构造特殊的输入来修改查询语句的结构。

构造永真式就可以进行SQL注入攻击:first_name = 'John' AND last_name = 'Smith' OR '1' = '1'
这样使得整个 WHERE 子句总是为真
所以分别要选择Smith' OR '1'='1

(5)xss攻击
按照下图,选择左侧栏A3→Cross Site Sorpting→选择7号

XSS(跨站脚本攻击)是一种安全漏洞/缺陷,它允许HTML/脚本标签作为输入内容,并且在未经过编码或净化的情况下直接在浏览器中渲染。XSS是Web应用程序中最普遍且危害最大的安全问题之一。
可以输入以下命令:
alert("XSS Test");(弹出一个警告框显示“XSS Test”)
alert(document.cookie);(弹出一个警告框显示当前页面的cookie信息)
任何返回给客户端的数据字段都可能被注入恶意代码。例如:
<script>alert("XSS Test")</script>(当这段代码被浏览器解析时,会弹出一个警告框显示“XSS Test”)
结果截图:
弹出一个警告框显示“XSS Test”

弹出一个警告框显示当前页面的cookie信息

(6)CSRF攻击
按照下图,选择左侧A10 →第八题

跨站请求伪造(Cross-site request forgery),又称点击劫持(one-click attack)或会话劫持(session riding),简称CSRF或XSRF,是一种针对网站的恶意利用手段,其中未经授权的指令会从网站信任的用户那里传输出去。与跨站脚本(XSS)利用用户对特定网站的信任不同,CSRF利用的是网站对用户浏览器的信任,诱使用户的浏览器执行未经授权的操作。
这种攻击通常发生在那些依赖用户身份进行操作的网站上,攻击者会利用网站对用户身份的信任,通过用户的浏览器向目标网站发送HTTP请求,从而引发一些不希望的操作,如更改用户信息、购买商品等。这种攻击之所以有效,是因为许多Web应用程序在执行操作时,并不会要求用户再次授权,而是基于用户之前的身份验证信息。因此,保护用户免受CSRF攻击的关键在于确保用户的每次操作都是经过明确授权的。

查看 WebGoat 是否也容易受到登录 CSRF 攻击。保持此选项卡打开,然后在另一个选项卡中根据自己的用户名(前缀为 )创建一个用户csrf-,我注册了新用户csrf-zbq20222414,截图如下:


以csrf-zbq20222414身份登录,然后在原始选项卡中单击按钮,攻击者会得知。

3.问题及解决方案

问题1:开启MySQL服务时总是报错

问题1解决方案:尝试卸载MySQL再重新安装,但是没有成功,于是拷了其他同学没有问题的kail虚拟机。

4.学习感悟、思考等

通过这次实验,我对Web安全有了更深刻的理解。实验不仅涉及了前端和后端的基础技能,如HTML、JavaScript、PHP和MySQL的使用,还让我亲身体验了SQL注入、XSS和CSRF等常见的网络攻击。

在前端部分,我学习了如何使用HTML创建表单,并理解了GET与POST方法的区别。通过JavaScript,我实现了对用户名和密码的基本验证,并在用户登录后实现了个性化的欢迎信息。然而,我也意识到这种动态内容的生成如果不当,就可能导致XSS攻击,这让我对Web安全有了更深的认识。后端的PHP和MySQL学习让我掌握了数据库的基本操作和网页后端开发的核心技能。通过编写连接数据库的PHP网页,我实现了用户认证功能,这让我对Web应用的工作原理有了更深的理解。在进行SQL注入和XSS攻击测试时,我体会到了安全编码的重要性。我了解到,即使是简单的输入验证和输出编码,也能有效地防止这些攻击。通过安装和使用DVWA或WebGoat平台,我不仅学习了如何进行这些攻击,更重要的是学会了如何防御它们。

总的来说,这次实验是一次宝贵的学习经历。它不仅提升了我的技术技能,更重要的是增强了我的安全意识。随着课程的结束,我感到自己已经准备好进入更复杂的Web开发和安全领域。我期待将这些知识应用到实际项目中,并继续在这个领域深入学习和发展。感谢这次实验课程,它为我打下了坚实的基础。

posted @ 2024-12-12 19:37  赵炳芊  阅读(9)  评论(0编辑  收藏  举报