20222301 2021-2022-2 《网络与系统攻防技术》实验八实验报告

1.实验内容

1.1 Web前端HTML
能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
1.2 Web前端javascipt
理解JavaScript的基本功能,理解DOM。
在1的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
尝试注入攻击:利用回显用户名注入HTML及JavaScript。
1.3 Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
1.4 Web后端:编写PHP网页,连接数据库,进行用户认证
1.5 最简单的SQL注入,XSS攻击测试
1.6 选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例

2.实验过程

2.1 Web前端HTML
2.1.1 正常安装、启停Apache
使用service apache2 start命令打开Apache服务。此时在浏览器输入 127.0.0.1,如果可以打开Apache的默认网页,则表示开启成功!
image
查看Apache状态,显示开启状态
sudo systemctl status apache2
image
关闭apache,并查看状态,显示关闭
sudo systemctl stop apache2 //关闭
image
2.1.2 理解HTML,理解表单,理解GET与POST方法
HTML(超文本标记语言,HyperText Markup Language)是构建网页和网络应用的核心标准语言。它通过一系列标签(tags)定义了网页中的各种内容类型,如文本、图像、链接等。这些标签不仅用于结构化网页内容,还指导浏览器如何解析和渲染页面。HTML的语法规则简洁明了,标签通常以成对的形式出现,分别表示内容的开始和结束。例如,<p> 标签用于定义段落,而 <img> 标签则用于嵌入图像。
表单(Form)是网页中用于收集用户输入信息的重要组件。它通常包含多种输入字段,如文本框、密码框、单选按钮、复选框、下拉列表等,以及一个提交按钮。用户在填写表单后,点击提交按钮,表单数据将被发送到服务器进行处理。表单的设计不仅影响用户体验,还决定了数据传输的方式和安全性。常见的数据提交方式包括 GET 和 POST 方法。
GET 方法是 HTML 表单的默认提交方式,主要用于从服务器获取数据。当使用 GET 方法时,表单数据会被编码为键值对(variable=value),并附加在 URL 的查询字符串部分,各参数之间用“&”分隔,URL 与参数之间用“?”连接。例如,访问 https://example.com/search?q=keyword&page=2 时,q=keywordpage=2 即为通过 GET 方法传递的参数。由于数据直接显示在 URL 中,GET 请求适合用于检索数据,但不适合传输敏感信息或大量数据。
POST 方法则主要用于向服务器提交数据。与 GET 方法不同,POST 请求的数据不附加在 URL 后面,而是放置在 HTTP 请求的主体(body)中。这种方式允许客户端发送更多的数据,甚至包括二进制文件,且数据不会暴露在 URL 中,因此相对更安全。POST 请求的格式通常是将表单中的数据按照键值对的形式编码,并通过 HTTP 请求体发送至服务器。例如,当提交一个包含用户名和密码的登录表单时,POST 方法可以确保这些敏感信息不会出现在浏览器的历史记录或书签中。
综上所述,GET 和 POST 方法各有优劣,开发者应根据具体需求选择合适的数据提交方式。GET 适用于简单的数据检索,而 POST 更适合处理复杂或敏感的数据提交。下图为POST请求示例:
image
2.1.3 编写一个含表单的HTML
先在记事本写好含表单的登陆页面html代码,我的如下:
image
cd /var/www/html 进入html的文件夹
touch 20222301login.html 创建html文件
vi 20222301login.html 进入编辑页面,将html代码粘贴进去
image
service apache2 start 打开Apache服务
使用浏览器打开制作的网页,在浏览器输入localhost/20222301login.html
可跳转到自己的登陆界面。
image
可提交表单,实现跳转
image
image
2.2 Web前端javascipt
2.2.1 理解JavaScript的基本功能,理解DOM
JavaScript 是一种基于对象和事件驱动的脚本语言,广泛应用于客户端网页开发。它具备相对较高的安全性,并通过其核心组件实现了动态内容展示与交互功能。JavaScript 由以下三个主要部分构成:

  1. ECMAScript:作为 JavaScript 的语法和语义规范,ECMAScript 定义了语言的基本结构、数据类型、操作符、语句以及内置对象。它为 JavaScript 提供了统一的标准,确保了跨浏览器和平台的一致性。ECMAScript 不仅涵盖了基础的语言特性,还引入了诸如箭头函数、解构赋值、模块化等现代编程特性,增强了代码的可读性和维护性。

  2. 文档对象模型(Document Object Model, DOM):DOM 是一种用于处理 HTML 和 XML 文档的标准编程接口。它将文档表示为一个树形结构,其中每个节点代表一个元素、属性或文本内容。通过 DOM,开发者可以动态地访问、修改、添加或删除文档中的任何部分。DOM 树的构建过程称为解析(parse),即将 HTML 或 XML 文档转换为内存中的对象模型。这种模型不仅描述了文档的结构,还定义了节点的行为,允许开发者通过调用节点的方法和属性来实现对页面内容的实时操作。DOM 的灵活性使得 JavaScript 能够高效地响应用户交互,动态更新页面内容,从而提升用户体验。

  3. 浏览器对象模型(Browser Object Model, BOM):BOM 是一组用于与浏览器环境进行交互的对象和方法。它提供了对浏览器窗口、历史记录、位置信息、定时器等功能的访问。通过 BOM,JavaScript 可以控制浏览器的行为,例如打开新窗口、导航到不同的 URL、管理会话状态等。BOM 还支持异步网络请求,允许开发者通过 XMLHttpRequest 或 Fetch API 与服务器进行数据交换,实现 AJAX 操作和 RESTful API 调用,从而实现无刷新的数据加载和动态内容更新。

JavaScript 的强大之处在于它能够通过修改 HTML 元素和 CSS 样式,实现动态的内容展示和交互效果。它可以通过监听用户的操作(如点击、滚动、提交表单等)触发事件处理程序,执行复杂的业务逻辑和算法。JavaScript 内置了丰富的函数库和对象,支持数据处理、计算、逻辑判断等功能,能够满足各种复杂的前端开发需求。此外,JavaScript 还可以通过网络请求与服务器进行通信,实现实时数据交互,进一步增强了网页的功能性和互动性。
总之,JavaScript 通过 ECMAScript、DOM 和 BOM 的协同作用,赋予了开发者强大的工具来操作网页内容、响应用户交互并实现复杂的业务逻辑。DOM 的树形结构和节点操作机制为 JavaScript 提供了灵活的文档 manipulation 能力,使其成为现代 Web 开发中不可或缺的核心技术。
image
2.2.2 编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
在login.html加上一段JavaScript正则表达式,来判断用户是否填写了用户名和密码。我设定的规则为:用户名须为6-12位字母/数字/中文,密码为1-20位纯数字。代码如下:
image
使用浏览器打开制作的网页,在浏览器输入localhost/20222301login.html
什么都不填
image
只填用户名,且不符合要求
image
用户名符合要求,密码不符合要求
image
编写一个在用户点击登陆按钮后回显“欢迎+输入的用户名”的PHP页面
PHP是一种流行的服务器端编程语言,常用于Web开发。它被设计用于快速开发动态网站,并能够与HTML紧密集成。PHP可以生成动态页面内容、连接数据库、处理表单数据等。它还可以在命令行下运行脚本。PHP代码通常嵌入在HTML中,在服务器端执行,然后将渲染后的页面发送给客户端。
cd /var/www/html 进入html的文件夹
touch index.php 创一个用于接收用户登陆数据的文件
vi index.php 进入编辑页面,将代码粘贴进去
image
在浏览器输入localhost/20222301login.html,输入正确格式的用户名和密码后点击登录,成功跳转到欢迎界面
image
2.2.3 尝试注入攻击:利用回显用户名注入HTML及JavaScript
进入20222301login.html编辑页面,先把最大字数限制改成99
image
尝试XSS攻击(跨站脚本攻击):
XSS即跨站脚本攻击,原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。这些恶意网页程序通常是JavaScript。
准备一段脚本,注入在输入框中,随着登录信息一起提交表单

直接以该脚本作为用户名
image
点击提交,回显恶意脚本内容,攻击成功!这段脚本已经成功嵌入到页面当中。当受害浏览器访问这个页面的时候,这段脚本也将被认为是页面的一部分,从而得到执行,即弹出对话框显示受害浏览器的Cookie信息。
image
2.3 Web后端:MySQL基础,正常安装、启动MySQL,修改密码、创建用户
kali虚拟机自带mysql,输入systemctl start mysql开启MySQL服务
输入mysql -u root -p使用root权限进入,需要输入密码(就是你登录的密码)
image
建立数据库:CREATE DATABASE 20222301DB;
创建用户,设定密码:
CREATE USER 'cc'@'localhost' IDENTIFIED BY '20222301';
‘cc’(user):用户名
‘localhost’(host):指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost;如果想让该用户可以从任意远程主机登陆,可以使用通配符%
‘20222301’(password):登陆密码。密码可以为空,如果为空则该用户登陆无需输入密码。
将数据库20222301DB的所有权限授予当前用户:grant all privileges on 20222301DB.user_info to hyx@localhost identified by "20222301";
image
进入20222301DB数据库:use 20222301DB;
image
在数据库中创建表user_info:create table user_info (username VARCHAR(50),password VARCHAR(50));
插入数据:insert into user_info values('cc','20222301');
查看数据:select * from user_info;
image
2.4 Web后端:编写PHP网页,连接数据库,进行用户认证
cd /var/www/html
touch 2301login.html
vi 2301login.html
image
touch login.php
vi login.php
image
保持数据库和apache开启状态,在火狐浏览器输入html本地网址:http://localhost/2301login.html
输入正确的账号密码:
image
点击登录,显示欢迎cc
image
输入错误账户密码,点击登录,显示登录失败
image
2.5 最简单的SQL注入,XSS攻击测试
2.5.1 SQL注入
SQL注入是一种常见的网络黑客技术,SQL注入攻击通过从客户端到应用程序的SQL查询语句中注入查询或插入的恶意代码。如果处理不当,让恶意代码注入应用程序可能会对数据完整性和安全性等产生严重影响。
在用户名输入框输入' or 1=1#,密码随意输入,点击登录
image
可以看到,虽然输入的账号密码明显错误,登录却成功了
当我们输入账号为' or 1=1#时,筛选条件就变为
$query = "SELECT * FROM user_info WHERE username='' or 1=1#' AND password='$pwd'";
$result = $mysqli->query($query);
会将后面部分注释掉,而前面的'' or 1=1是永真式,用这个条件进行筛选,肯定能筛选出结果,也就会被判定为登录成功了
2.5.2 XSS攻击
在用户名输入,密码随便输,攻击成功
image
image
2.6 Webgoat平台的SQL注入、XSS、CSRF攻击
2.6.1 下载webgoat
Webgoat是用于进行WEB漏洞实验的应用平台,需要自行下载
参考下载教程:手把手教你在kali-Linux 2020.3安装webgoat_kali安装webgoat-CSDN博客
下载链接:https://github.com/WebGoat/WebGoat/releases
下载得到jar文件
image
将文件复制到虚拟机上
启动webgoat:java -jar webgoat-2023.8.jar
image
复制链接到火狐打开
进入login页面,需要我们注册账号
image
2.6.2 SQL注入攻击
点开左边列表A3中的SQL injection
第9题:
image
题目要求我们通过下面的下拉框选择相关的数据,检索出users表中的所有用户信息,我们无需知道任何特定的用户名就可以得到完整的列表。
首先,我们查看原代码是让我们输入lastName
其次,我们查看该字段的格式为’“+ lastName +”’
image
在SQL注入攻击中,攻击者通过操纵输入字段,改变查询条件的逻辑结构,从而绕过系统的安全验证。本文将探讨如何通过SQL注入技术,使查询条件始终为真,进而获取数据库中的所有用户信息。为了确保讨论的严谨性,我们将从以下几个方面展开分析:输入替换、查询条件的构造、注入方式的选择以及最终的注入内容与格式。
首先,输入替换是指攻击者通过修改输入字段的内容,影响SQL语句的执行逻辑。假设我们有一个查询语句 SELECT * FROM users WHERE first_name = 'John' AND last_name = '+ lastName +',其中 + lastName + 是用户输入的部分。如果我们输入 Smith,则 last_name 的值将被替换为 'Smith'。此时,SQL语句变为 SELECT * FROM users WHERE first_name = 'John' AND last_name = 'Smith',查询结果仅限于满足这两个条件的记录。
为了使查询条件始终为真,攻击者需要构造一个永真的逻辑表达式。最常用的技巧是利用布尔表达式 1 = 1,因为该表达式在任何情况下都为真。因此,攻击者的目标是将 1 = 1 注入到查询条件中,从而使整个查询条件始终成立,返回所有符合条件的记录。
接下来,我们需要选择合适的注入方式。直接在输入字段中插入单引号(')会导致SQL语法错误。例如,如果我们在 last_name 字段中输入 1' = '1,则SQL语句会变成 SELECT * FROM users WHERE first_name = 'John' AND last_name = '1' = '1',这显然会导致语法错误,因为 = '1' 无法作为合法的比较操作。
为了避免语法错误,攻击者可以使用逻辑运算符 OR 来分隔条件。通过在输入字段中插入 OR '1' = '1',可以将 1 = 1 作为一个独立的条件注入到查询中。此时,SQL语句变为 SELECT * FROM users WHERE first_name = 'John' AND last_name = '' OR '1' = '1'。由于 OR 运算符的存在,即使 last_name 的条件不成立,'1' = '1' 仍然为真,因此整个查询条件始终为真,返回所有用户的记录。
最后,攻击者需要确保注入的内容不会破坏SQL语句的完整性。为了实现这一点,可以在注入的字符串中保留一个有效的 last_name 值。例如,假设我们输入 Smith' OR '1' = '1,则SQL语句变为 SELECT * FROM users WHERE first_name = 'John' AND last_name = 'Smith' OR '1' = '1'。这样,不仅避免了语法错误,还成功地将 OR '1' = '1' 注入到了查询条件中,达到了预期的效果。
image
结果:
image
2.6.2 XSS攻击
A3的Cross Site Scripting部分就是XSS的内容
第7题:
这一页要求用alert()或者console.log()来试哪里有XSS。由于XSS最终是要浏览器渲染的,因此,可以先按下Purchase,看看哪个输入是会回显的
image
可以看到card number输入框输入参数会回显,在这个输入框中输入:
告警弹出,顺利过关
image
2.6.3 CSRF攻击
CSRF即Cross Site Request Forgery跨站请求伪造,即通过伪造用户身份来向网站发出请求的一种攻击方式。主要原理为:
用户访问了正常的网站A,生成Cookie,攻击者引诱用户访问恶意网站B,网站B携带用户的cookie向A网站发出请求,A将B当作是用户执行请求,攻击者在用户不知情的情况下冒充用户在A网站执行了操作。
CSRF训练在A10处,第8题:
image
在这一题中,查看 WebGoat 是否也容易受到登录 CSRF 攻击。保持此选项卡打开,然后在另一个选项卡中根据自己的用户名(前缀为 )创建一个用户csrf-。我的用户名是20222301cc,所以注册新用户csrf-20222301cc。
image
以新用户身份登录。这就是攻击者使用 CSRF 所做的事情。然后单击原始选项卡中的按钮。由于我以其他用户身份登录,攻击者会得知我单击了该按钮。
image

3.问题及解决方案

  • 问题1:手动安装的MariaDB缺少mysqli扩展,导致无法支持PHP中的数据库连接功能。
  • 问题1解决方案:下载一台自带mysql的kali虚拟机,开机直接使用

4.学习感悟、思考等

本次实验操作相对简便,但涉及的知识面较为广泛。通过此次实验,我不仅巩固了上学期所学的Web与数据库知识,还深入学习了Web攻击技术。
在实验中,我使用HTML语言构建了一个登录页面,通过简单的标签结构化网页内容,并利用表单与GET、POST方法实现用户数据的接收与提交。为了确保登录逻辑的正确性,我编写了JavaScript代码来验证用户名和密码的格式,进一步实现了登录条件的判断。此外,我还学习了PHP网页开发,并通过连接MySQL数据库生成了用户认证的功能。
SQL注入和跨站脚本攻击(XSS)是常见的Web攻击手段。在实验过程中,我模拟了这些攻击,攻击自己编写的网页,并深入了解了相应的防御措施。SQL注入攻击通过在输入字段中插入恶意SQL语句,试图破坏或篡改数据库;而XSS攻击则是通过在网页中注入恶意脚本,窃取用户的敏感信息。通过实际操作,我认识到,在编写Web应用程序时,必须对用户输入进行严格的验证和过滤,并采用参数化查询或预编译语句来防止SQL注入攻击。此外,我还学会了如何通过输出编码和内容安全策略(CSP)来防范XSS攻击。
为了进一步提升对Web攻击的理解,我在WebGoat平台上进行了SQL注入、XSS和跨站请求伪造(CSRF)攻击的实验。这些实验不仅让我掌握了各类攻击的原理,还使我熟悉了相应的防御机制。通过模拟攻击场景,我学会了如何识别和防范潜在的安全漏洞,从而为未来的开发工作提供了宝贵的经验。
在实验过程中,我遇到了一些技术难题,尤其是在Kali Linux环境中安装MySQL时遇到了问题,且MariaDB缺乏必要的扩展,导致无法与PHP连接数据库。经过两天的努力尝试仍未解决,最终在同学的帮助下得知可以使用Kali成品机进行实验。这一经历让我深刻体会到,及时与他人交流并借鉴经验对于实验的成功至关重要。
通过本次网络攻防实验,我不仅掌握了Web前端和后端的基本技术,还熟悉了多种Web攻击手段及其防御措施。这为我未来的学习和工作奠定了坚实的基础。未来,我将继续提升自己的技术水平,以更好地应对日益复杂的网络安全挑战。

posted @ 2024-11-30 11:25  20222301陈灿  阅读(141)  评论(0编辑  收藏  举报