20212416 2023-2024-2 《网络与系统攻防技术》实验八实验报告

Web安全实践

  • 1.实验内容
  • 2.实验过程
    • 2.1 Web前端HTML
      • 2.1.1 正常安装、启停Apache
      • 2.1.2 编写一个含有表单的HTML
        • 2.1.2.1 基础知识
        • 2.1.2.2 实践
    • 2.2 Web前端javascipt
      • 2.2.1 基础知识
      • 2.2.2 实践
    • 2.3 Web后端:MySQL基础
      • 2.3.1 正常安装、启动MySQL
      • 2.3.2 创建用户、修改密码
      • 2.3.3 建库、建表
    • 2.4 Web后端:编写PHP网页,连接数据库,进行用户认证
    • 2.5 最简单的SQL注入,XSS攻击测试
    • 2.6 安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击
      • 2.6.1 下载安装Webgoat
      • 2.6.2 SQL注入
      • 2.6.3 XSS攻击
      • 2.6.4 CSRF攻击
  • 3.问题及解决方案
  • 4.学习感悟、思考等
  • 参考资料

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

2.1.1 正常安装、启停Apache

  1. 开启Apache服务systemctl start apache2
    在这里插入图片描述
  • 打开浏览器访问http://127.0.0.1(注意不能是https),若成功应该会显示以下界面
    在这里插入图片描述
  1. 关闭Apache服务systemctl stop apache2
    在这里插入图片描述

2.1.2 编写一个含有表单的HTML

2.1.2.1 基础知识
  1. HTML
  • HTML是一种用于创建网页和网页应用的标记语言。它由一系列的标签组成,这些标签定义了网页的结构和内容,例如标题、段落、列表、链接等。
  1. 表单
  • 表单是HTML的一部分,它允许用户输入数据,如文本、数字、选择等,然后将这些数据发送到服务器。 表单通常包含输入字段、复选框、单选按钮、提交按钮等元素。
  1. GET与POST方法
  • GET是一种HTTP方法,用于从服务器请求数据。GET请求的数据以URL的形式附加在Query String(查询字符串)中,这意味着数据对用户可见且可以被缓存。
  • POST也是一种HTTP方法,通常用于向服务器发送数据进行处理,例如用户注册、文件上传等。与GET不同,POST请求的数据不会显示在URL中,而是在HTTP请求主体中。
2.1.2.2 实践
  1. 创建一个含表单的HTMLvi /var/www/html/20212416.html,编写一个简单的HTML界面代码:
    在这里插入图片描述
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Login</title>
</head>
<body><div id="div1" style="text-align: center"><h1>系统登录</h1><form name="form1" method="post" action="LoginServlet">用户名:<input type="text" name="usrname" /><br><br>密码:<input type="password" name="pwd" /><br><br><input type="submit" name="sub1" value="确定"/><input type="reset" name="ret1" value="重置"/></form></div>
</body>
</html>
  1. 打开编写好的HTML文件
    在这里插入图片描述

2.2 Web前端javascipt

2.2.1 基础知识

  1. JavaScript
  • JavaScript是一种高级、解释性、就地紧凑的编程语言。常用于网页开发,也可被用于其他类型的应用。JSON(JavaScript对象表示法)也是一种基于JavaScript的语法,用于数据交换格式。
  1. JavaScript基本功能
  • 变量和数据类型:在JavaScript中,你可以使用不同的关键字(如var, let, const)声明变量,并可存储各种数据类型,如数字(number)、字符串(string)、布尔值(bool)、对象(object)等。
  • 控制结构:包括条件语句(if, else, switch)和循环语句(for, while, do-while, for-of, for-in)等。
  • 函数:JavaScript支持函数的定义和调用,这使得代码的复用和模块化变得更容易。
  • 对象和原型:JavaScript使用基于原型的对象,这意味着对象是由其他对象派生的,这会带来许多高级功能,如继承。
  • 数组:JavaScript中的数组非常灵活,可以存储不同类型的元素。
    错误处理:可以捕获和处理错误,使用try, catch和finally语句。
  • 事件驱动:JavaScript是异步和事件驱动的语言,这意味着它特别适用于处理用户交互。
  • 异步编程:ES6引入了Promises和async/await模式来处理异步操作,这使得编写异步代码变得更加简单。
    Web APIs:JavaScript可以通过Web APIs与网页的其它部分交互,比如Fetch API用于调用Web服务,Canvas API用于渲染图形。
  1. DOM
  • DOM(Document Object Model,文档对象模型是一个Web标准,它将Web文档(尤其是HTML和XML文档)表示为树形结构,每个节点都是对象(节点对象)。DOM允许JavaScript通过编程方式动态地访问和修改文档的内容、结构和样式。

2.2.2 实践

  1. 编写JavaScript验证用户名、密码的规则:若输入的用户名或密码为空则不可提交表单
    在这里插入图片描述
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Login</title><script>// JavaScript函数,用于在表单提交前检查用户名和密码function validateForm() {var username = document.forms["form1"]["usrname"].value;var password = document.forms["form1"]["pwd"].value;if (username == "" || password == "") {alert("用户名和密码不能为空!");return false; // 阻止表单提交}return true; // 允许表单提交}</script>
</head>
<body><div id="div1" style="text-align: center"><h1>系统登录</h1><form name="form1" method="post" action="" onsubmit="return validateForm()">用户名:<input type="text" name="usrname" /><br><br>密码:<input type="password" name="password" /><br><br><input type="submit" name="sub1" value="确定"/><input type="reset" name="ret1" value="重置"/></form></div>
</body>
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 编写success.php用于用户点击登录后,回显“欢迎+输入的用户名”
<!DOCTYPE html><head><meta charset="UTF-8"><title>Welcome!</title>
</head>
<body>
<h1 align="center">欢迎!<?php echo $_POST['username'];?></h1>
</body>
</html>

修改表单

<form name="form1" action="loginsuccess.php" method="POST" onsubmit="return checked()">

测试
在这里插入图片描述

  1. 尝试注入攻击:利用回显用户名注入HTML及JavaScript。

<script type="text/javascript"> alert("JavaScript注入攻击20212416") </script>
在这里插入图片描述

2.3 Web后端:MySQL基础

2.3.1 正常安装、启动MySQL

service mysql start  #开启MySQL服务
mysql -u root -p  #使用root权限进入,默认的密码是password
show databases;  #查看数据库基本信息
use mysql;  #选择使用mysql数据库

在这里插入图片描述

2.3.2 创建用户、修改密码

  1. 创建新用户xxn20212416
    grant select,insert,update,delete on mysql.* to xxn20212416@localhost identified by "123456";
  • SELECT, INSERT, UPDATE, DELETE:这些关键字指定要授予的权限类型。在这个例子中,被授予 SELECT(查询数据)、INSERT(插入数据)、UPDATE(更新数据)和 DELETE(删除数据)权限。
  • on mysql.*:指定这些权限应用于 mysql 数据库中的所有表(用 * 表示)。
  • to ‘xxn20212416@localhost’:指定要授予权限给的用户账号,格式为 用户名@主机名。在这个例子中,用户名为 xxn20212416 而主机名为 localhost 意味着该用户仅能够从当前主机登录。
  • identified by ‘123456’:指定用户账号的密码。这部分是可选的,但如果你包含它,则该用户需要使用这个密码来登录。
  1. exit退出后使用新的用户名和密码进行登录mysql -u xxn20212416 -p
    在这里插入图片描述

  2. 修改密码
    SET PASSWORD FOR 'xxn20212416'@'localhost' = PASSWORD('20212416');
    在这里插入图片描述

  3. 查看当前用户信息select user, password, host from user;
    在这里插入图片描述
    在这里插入图片描述
    可以看到密码序列发生变化,密码修改成功

  4. 更新权限flush privileges;
    退出数据库,使用新的密码登录quit
    在这里插入图片描述

2.3.3 建库、建表

create database xxndb;  #建立数据库
use xxndb;  #使用新建的xxn数据库
create table login (username VARCHAR(20),password VARCHAR(20));  #建立数据库表login,设置字段基本信息(username和password)
insert into login values('xioooning','2416');  #插入数据
insert into login values('xxn','20212416');  #插入数据

在这里插入图片描述

2.4 Web后端:编写PHP网页,连接数据库,进行用户认证

  1. 编写login.php
<?php
$uname=$_POST["username"];
$pwd=$_POST["password"];
echo $uname;
$query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "root", "123456", "xxndb");
$query_str1="use xxndb;";/* check connection */
if ($mysqli->connect_errno) {echo "failed connection";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();
?>
  1. 修改前端表单
<form name="form1" action="login.php" method="POST" onsubmit="return checked()">

在这里插入图片描述

  1. 测试
  • 登录成功
    在这里插入图片描述
  • 登录失败
    在这里插入图片描述

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

  1. SQL注入' or 1=1#
  • 我在login.php中使用的查询语句为SELECT * FROM login where username='$uname' and password='$pwd';,与SQL注入的语句连接起来就是SELECT * FROM login WHERE username='' or 1=1# AND password='$pwd';这是一个永真式,不管输入的用户名和密码正确与否,都能登录成功
    在这里插入图片描述
  1. XSS攻击
  • 在用户名框中输入<script> alert("来自20212416的XSS攻击") </script> 在这里插入图片描述

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

2.6.1 下载安装Webgoat

  1. 下载链接
    可以直接搜索“webgoat-8.1.0.jar”
    在这里插入图片描述
  2. 下载后放到kali解压java -jar webgoat-server-8.1.0.jar
    在这里插入图片描述
  3. 登录
  • 在浏览器中输入http://localhost:8080/WebGoat/login
    在这里插入图片描述
  • 输入用户名和密码注册并登录,登录成功界面如下
    在这里插入图片描述

2.6.2 SQL注入

  • SQL注入的目的就是构造SQL语句使得条件判断永远为真,操作如图:
  1. String SQL injection
    在这里插入图片描述
    在这里插入图片描述
    注入后的SQL语句为SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or '1' = '1'图中绿色部分是获得的数据。

  2. Numeric SQL injection
    在这里插入图片描述
    注入后的SQL语句为SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or 1=1其实Login_Count 无所谓填什么数字,因为后面会或上一个1,此式为永真式。

2.6.3 XSS攻击

  1. Reflected XSS
    在这里插入图片描述
  • 输入<script> alert("20212416_Reflected XSS") </script>
    在这里插入图片描述
  1. DOM-Based XSS
  • 在空栏处输入start.mvc#test/,其实是构造一个输入(带着你想触发程序的路径),而提示中给出了这个路径
    在这里插入图片描述

2.6.4 CSRF攻击

  • CSRF(跨站请求伪造),是一种常见的网络攻击方式,它利用了用户已认证的会话信息(如Cookie)来强制用户在不知情的情况下对网站进行未授权的操作。
  1. 选择一个基础题来尝试,提示我们答案和flag有关
    在这里插入图片描述

  2. 尝试先点击“提交查询”,这时会跳转另一个界面,可以看到这里flag的值为null
    在这里插入图片描述

  3. 右键点击“查看选中部分源代码”,看一下提交查询按钮的源代码,发现其type为hidden,表明该字段在页面上并不可见,我们无法直接看到或修改它。然而,该字段仍然会在表单提交时发送到服务器。并且其value=“false”,设置了这个隐藏输入的初始值为字符串"false",其action指向了一个网页(也就是我们刚刚点击提交查询时跳转的网页)。可以推测,csrf可能是一个CSRF令牌(服务器在用户开始与表单交互时生成的一个随机值,以此来确保提交表单的是原始用户而不是攻击者)。
    在这里插入图片描述
    所以我们如果找到了正确的csrf的值(也就是flag),可能就能实现攻击。

  4. 新建一个html文件,将提交查询按钮部分的html代码复制进去,修改action部分为"http://localhost:8080/WebGoat/csrf/basic-get-flag"
    在这里插入图片描述

  5. 打开这个页面
    在这里插入图片描述

  • 点击提交查询,可以得到有效的flag值为59399
    在这里插入图片描述
  1. 回到WebGoat,输入59399,成功
    在这里插入图片描述

3.问题及解决方案

  • 问题1:使用默认密码也无法登录数据库

  • 问题1解决方案:在root权限下使用mysql -u root不带密码进入数据库,再用set password for 'root'@'localhost' = PASSWORD('yournewpassword');修改密码,别忘了分号
    在这里插入图片描述

  • 问题2:使用新建的用户不能建表

  • 问题2解决方案:因为我在创建新用户xxn20212416的时候没有赋予它建表的权限,可以在root下使用GRANT CREATE ON xxn.* TO 'xxn20212416'@'localhost'; 赋建表权,但我在完成的时候就直接是用root身份连接的数据库

4.学习感悟、思考等

  • 这次实验我是有苦说不出,之前的课程搭建好的网站文件都找不到了,所有都得从头再来。最考验耐心的应该是数据库那部分,我没有完全按照学长学姐的步骤来做,走了一些弯路,但是也在这个过程中更深刻地理解了其中的逻辑关系,解决问题的过程也就是理清思路的过程。
  • 在最后一个实践(我愿称之为刷题部分)中,同种类型不同方式的题目加深了我对这三种攻击原理以及实现方式的理解,特别是探究为什么要把“提交查询”的html代码复制到另一个文件并访问,为什么要找有效的flag值,它的意义是什么……这些过程令我受益匪浅。

参考资料

一个好用的GPT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

torch.cat 与 torch.concat函数

文章目录 区别torch.cat介绍作用参数使用实例关于参数dim为None的使用 区别 先说结论&#xff1a;没有区别在功能、用法以及作用上&#xff0c;concat函数就是cat函数的别名&#xff08;官方就是这样说的&#xff09;。下面截图为证&#xff1a;   因此接下来就主要是介绍 to…

[NOVATEK] NT96580行车记录仪功能学习笔记

一、u-Boot升级灯 运行u-Boot程序时LED灯闪烁,找到运行过程中一直在运行的函数在里面进行LED引脚电平的翻转 宏定义 Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\include\configs\nvt-na51055-evb.h Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\drivers\mtd\nvt_flash_…

MATLAB format

在MATLAB中&#xff0c;format 是一个函数&#xff0c;用于控制命令窗口中数值的显示格式。这个函数可以设置数值的精度、显示的位数等。以下是一些常用的 format 命令&#xff1a; format long&#xff1a;以默认的长格式显示数值&#xff0c;通常显示15位有效数字。format s…

【Linux】深入解析动静态库:原理、制作、使用与动态链接机制

文章目录 前言&#xff1a;1. 什么是动静态库2. 动静态库的制作和使用3. 动态库的查找问题4. 理解动态库的加载4.1. 站在系统的角度理解4.2. 编址、可执行程序4.3. 动态库动态链接和加载问题 总结&#xff1a; 前言&#xff1a; 在软件开发中&#xff0c;动静态库是两种重要的…

11.盛水最多的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例 1&a…

编写程序提示用户输入一个数目(例如:100)、年利率(例如:5)以及月份数(例如:6),然后显示给定月份后账户上的钱数。

(财务应用程序:复利值)假设你每月向银行账户存 100美元&#xff0c;年利率为5%&#xff0c;那么每 月利率是 0.05/12-0.00417。 第一个月之后&#xff0c;账户上的值就变成:100*(10.00417)100.417 第二个月之后&#xff0c;账户上的值就变成(100100.417)*(10.00417)-201.252 第…

算法金 | 不愧是腾讯,问基础巨细节 。。。

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 最近&#xff0c;有读者参加了腾讯算法岗位的面试&#xff0c;面试着重考察了基础知识&#xff0c;并且提问非常详细。 特别是关于Ada…

[UE 虚幻引擎] DTLoadFbx 运行时加载FBX本地模型插件说明

本插件可以在打包后运行时动态加载FBX模型。 新建一个Actor 并添加一个 DT Runtime Fbx Component。 然后直接调用组件的函数 LoadFile 加载显示模型&#xff08;注&#xff1a;不支持模型动画&#xff09; FilePath : 加载模型的绝对路径。 Create Collision : 是否创建碰撞…

使用python绘制桑基图

使用python绘制桑基图 桑基图效果代码 桑基图 桑基图&#xff08;Sankey Diagram&#xff09;是一种用来表示流动&#xff08;如能源、资金、材料等&#xff09;在不同实体之间转移的图表。 每个流的宽度与流量成正比&#xff0c;通常用于显示能量或成本流动的分布情况。 桑基…

C++的重载

重载关系 同一作用域中&#xff0c;函数名相同&#xff0c;参数表不同的函数只有同一作用域中的同名函数才涉及重载问题&#xff0c;不 同作用域中同名函数遵循标识符隐藏原则 #include <QtCore/QCoreApplication> #include <QList> #include <QDebug> #in…

Cloudpods 强大的多云管理平台部署

简介 Cloudpods 是一款简单、可靠的企业IaaS资源管理软件。帮助未云化企业全面云化IDC物理资源&#xff0c;提升企业IT管理效率。 Cloudpods 帮助客户在一个地方管理所有云计算资源。统一管理异构IT基础设施资源&#xff0c;极大简化多云架构复杂度和难度&#xff0c;帮助企业…

AI绘画教程分享:Stable Diffusion使用指南,12000+AI关键词大合集

01 首先下载好SD的安装包&#xff08;百度、B站、小红书等都可以找到资源&#xff09;&#xff0c;用启动器开始运行 02 从这里下载别人的模型套用&#xff0c;可以多多探索一下&#xff01;以下是各个模型的具体介绍&#xff1a; 03 这就是我们打开的初始界面&#xff0c;常…

CondaSSLError: OpenSSL appears to be unavailable on this machine.

conda create -n x1 python3.7报错 PS C:\Users\Richardo.M.Song\Desktop\lele_seg\x1> conda create -n x1 python3.7 Collecting package metadata (current_repodata.json): failed CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is requ…

Allure在jenkins中无法显示的问题

jenkins中使用allure生成报告需要注意工作环境和路径的配置 前提条件&#xff1a; jenkins容器中已安装jdk和allure jenkins中配置全局工具环境&#xff1a; 项目中配置allure路径&#xff1a; 路径来源&#xff1a; Path需要选择相对路径的allure-report、allure-results

第八篇——矢量化:象形文字和拼音文字是如何演化的?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 通过这篇看似在讲文字的演化过程&#xff0c;实际是在说人生应该如何走&a…

天才简史——Tamim Asfour与他的H²T实验室

一、Tamim Asfour介绍 Tamim Asfour为KIT人类学和机器人学研究所&#xff08;Institute for Anthropomatics and Robotics&#xff09;的全职教授&#xff0c;并担任高性能人形技术实验室 (High Performance Humanoid Technologies Lab&#xff0c;HT) 负责人。他目前的研究兴…

使用LabVIEW进行大数据数组操作的优化方法

针对大数据量数组操作&#xff0c;传统的内存处理方法可能导致内存不足。通过LabVIEW的图像批处理技术&#xff0c;可以有效地进行大数据数组操作&#xff0c;包括分块处理、并行处理和内存优化等。这种方法能显著提高处理效率和系统稳定性。 图像批处理的优势 内存优化&#…

vs2017中C2440错误:“初始化”:无法从const char[6]转换为char*问题解决

本文摘要&#xff1a;本文已解决 Python FileNotFoundError 的相关报错问题&#xff0c;并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领…

Mamba v2诞生:2 那些烧脑的矩阵们

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

【Unity Shader入门精要 第13章】使用深度和法线纹理(二)

1. 再谈运动模糊 之前的文章中曾经通过保存渲染结果进行叠加的方式实现过运动模糊效果&#xff0c;下面的例子我们通过深度纹理重建世界坐标的方式来实现运动模糊&#xff1a; 首先&#xff0c;基于深度纹理重建像素的世界坐标&#xff0c;原理在【Unity Shader入门精要 第13…