20222409 2024-2025-1 《网络与系统攻防技术》实验八实验报告
1.实验内容
1.1 本周学习内容
- 复习前后端区别:了解了前端主要负责页面展示和交互,使用技术如HTML、CSS、JS;后端则负责数据处理和业务逻辑,使用Java、Python等语言。
- 掌握SQL注入原理:学习了如何通过SQL注入绕过登录验证,例如利用
' OR 1=1 --
注入绕过登录。了解了普通注入与盲注入的区别。 - 了解XSS攻击原理:学习了如何通过注入恶意脚本获取用户信息,例:通过输入框注入
<script>alert(1)</script>
执行脚本。掌握了用输出编码和输入过滤防止XSS攻击。 - 学习前后端编程语言特点:理解了Java适合大型企业应用后端,JavaScript主要用于前端开发,二者在语法、运行环境和应用场景上有显著差异。
- 掌握数据库基本操作:学习了MySQL的基本操作,如创建数据库、管理用户和表的操作。掌握了使用预处理语句(如
PreparedStatement
)防止SQL注入攻击。
1.2 实践内容
(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.1 Apache Web服务器的安装与HTML表单功能实现
本次实验的第一部分涉及Apache Web服务器的安装与配置。Apache是一个开源的Web服务器软件,广泛应用于Linux、Windows等平台中。通过Apache的安装,实验为后续的前端和后端开发提供了稳定的Web服务环境。
在本实验中,首先通过安装Apache服务器来搭建Web环境。然后,创建一个包含表单的HTML页面,熟悉HTML的基础知识,包括表单元素的使用与GET、POST方法的运作。
2.1.1 Apache Web服务器的安装与配置
Apache HTTP Server(简称Apache)是一个功能强大的开源Web服务器,广泛用于托管Web网站。在本实验中,首先通过安装Apache Web服务器来搭建基本的Web服务环境。
1. 安装Apache
通过以下命令安装Apache Web服务器及其相关组件,确保服务器能正常运行:
apt install apache2
2. 启动Apache服务
通过以下命令启动Apache服务,允许通过浏览器访问本地服务器:
systemctl start apache2
想要停止apache,则输入以下命令
systemctl stop apache2
3. 配置防火墙
为了确保外部访问,需要通过以下命令调整防火墙规则,允许HTTP流量通过防火墙
ufw allow 'Apache'
4. 验证安装
完成上述步骤后,打开浏览器,输入http://localhost
,应该能看到Apache的默认欢迎页面(Apache2 Debian Default Page),表示Web服务器安装成功。
图1:验证安装成功的Apache默认页面
2.1.2 HTML表单功能实现
在搭建了Apache Web服务器的基础上,我们编写了一个简单的HTML表单页面,并通过表单与服务器进行数据交互。HTML表单是Web开发中最基础的功能之一,它通过表单元素收集用户输入的数据,并将这些数据提交给服务器进行处理。在本实验中,我们利用HTML表单理解了表单元素、表单的提交方式(GET与POST)以及它们的实际应用。
2.1.2.1. 理解HTML、表单、GET与POST
1. 理解HTML
HTML(HyperText Markup Language,超文本标记语言)是Web页面的基础,定义了页面的结构和内容。表单是HTML中的一个重要组成部分,主要用于收集用户输入的数据。通过表单,用户可以与Web应用进行交互,提交数据。
2. 理解表单
表1:HTML表单元素及其功能
HTML元素 | 功能 | 示例代码 |
---|---|---|
<form> |
定义一个表单,用于收集用户的输入。表单包含多个表单控件(如文本框、按钮等),并通过action 和method 属性控制表单的提交行为。 |
<form action="login.php" method="POST">...</form> |
<input> |
用于创建输入控件,允许用户输入文本、密码等数据。根据type 属性的不同,<input> 可以创建不同类型的输入框。 |
<input type="text" name="username"> |
<label> |
为表单控件定义标签,帮助用户理解各输入框的含义。可以通过for 属性将标签与表单控件关联。 |
<label for="username">用户名:</label> |
<button> |
定义一个按钮,用户点击后触发表单提交或其他操作。 | <button type="submit">提交</button> |
<textarea> |
用于创建多行文本输入框,适用于输入较长的文本内容。 | <textarea name="comments"></textarea> |
<select> |
创建一个下拉菜单,用户可以选择一个选项。 | <select name="gender"><option value="male">男</option></select> |
3. 理解GET与POST
表单数据提交方式主要有两种:GET
和POST
。
GET
方法通过URL提交数据。数据被附加在URL后面,在浏览器的地址栏中可以看到。例如,提交一个包含用户名和密码的表单时,使用GET方法会在地址栏中看到username=abc&password=123
。这种方法适合提交不涉及敏感数据的请求,例如查询或搜索。POST
方法通过HTTP请求体提交数据,数据不会显示在URL中,因此比GET方法更安全。POST方法适合提交需要保密的数据,如用户名、密码、支付信息等。POST方法没有数据大小的限制,能够处理更大的数据。
以下是GET
和POST
方法的比较表格:
表2:GET与POST方法比较
方法 | 特点 | 优缺点 | 适用场景 |
---|---|---|---|
GET | 数据通过URL传输,参数显示在浏览器地址栏。 | 优点:适合查询请求、数据量小、简单; 缺点:不适合传输敏感数据,数据暴露在URL中、数据长度受限。 |
适合查询操作、搜索功能(如搜索框),不适合用于登录、支付等涉及敏感数据的场景。 |
POST | 数据通过HTTP请求体传输,参数不显示在URL中。 | 优点:适合提交敏感数据、数据量大、传输更安全; 缺点:相对GET更复杂、数据较大时会占用更多的带宽。 |
适合提交敏感信息(如用户名、密码),常用于用户登录、注册、评论等操作。 |
2.1.2.2 编写一个含有表单的HTML
为了实现一个基本的用户登录功能,我们创建了一个包含用户名和密码输入框的表单。在HTML中,<input>
元素用于创建输入框,用户可以通过这些输入框填写相应的数据。表单的提交方式我们选择了 POST,因为用户的密码属于敏感信息,应该通过HTTP请求体传输,而不是显示在URL中。
首先,进入/var/www/html/
路径
cd /var/www/html/
接着,创建并编辑HTML文件(文件名为form20222409wqb.html
)
vim form20222409wqb.html
最后,在文件中添加 HTML 代码
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面</title>
</head>
<body>
<h2>登录</h2>
<form action="login.php" method="POST">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required><br><br>
<input type="submit" value="登录">
</form>
</body>
</html>
在这个表单中,<input>
标签用于创建用户名和密码的输入框,<form>
标签定义了表单的结构。表单的action
属性指定了提交目标页面login.php
,method="POST"
表示数据将通过POST方式提交。
我们输入网址http://localhost/form20222409wqb.html
,界面如图2。
图2:HTML登录表单页面
输入账号密码,可见用post方式提交的确实没有在网址里显示用户名及密码。
图3:POST提交后的浏览器地址栏
2.2 基于JavaScript的前端交互设计与安全性测试
在这一部分,我们将重点学习如何通过JavaScript实现前端交互,并在表单提交之前验证用户输入的用户名和密码。通过使用JavaScript,我们可以在客户端执行一些基本的验证规则,从而增强表单的安全性和用户体验。除了基本的输入验证,还将探讨如何利用JavaScript进行注入攻击,以测试系统的防护能力。
2.2.1 理解JavaScript、DOM
1. 理解JavaScript的基本功能
JavaScript 是一种用于增强网页交互性和动态效果的脚本语言,它可以在用户的浏览器上运行,操作页面内容并响应用户的操作。JavaScript 不仅可以处理页面中的数据,还能够与用户交互、修改网页结构等。以下是一些 JavaScript 的基本功能与概念。
表3:JavaScript的基本功能
功能 | 描述 | 示例或用途 |
---|---|---|
动态修改网页内容 | JavaScript 可以改变网页上的文本、图像或其他元素的内容。 | 修改页面中的标题、文字、按钮等内容。 |
事件处理 | JavaScript 可以响应用户的操作,如点击按钮、提交表单等。 | 表单提交验证、按钮点击事件等。 |
验证用户输入 | 在表单提交前,使用 JavaScript 对用户输入进行验证。 | 验证用户名、密码格式等。 |
操作DOM元素 | JavaScript 可以访问和修改网页中的DOM元素。 | 通过 DOM 修改表单输入框的内容或值。 |
与服务器交互 | JavaScript 可以通过 AJAX 向服务器发送请求,并接收响应。 | 动态加载内容、提交数据。 |
2. 理解DOM
DOM(Document Object Model)是一个与平台和语言无关的接口,JavaScript 可以通过 DOM 操控网页的结构、样式和内容。DOM 将网页内容表示为一个树状结构,每个节点表示文档中的一个部分,如元素、属性、文本等。理解 DOM 是使用 JavaScript 动态操作网页的基础。
表4:DOM(文档对象模型)的基本概念
概念 | 描述 | 示例或用途 |
---|---|---|
文档节点 | 在 DOM 中,HTML 文档的每个部分都是一个节点。 | <html> 、<body> 、<div> 等元素是节点。 |
元素节点 | 表示文档中的 HTML 元素,如 <div> 、<p> 等。 |
通过 DOM 可以修改元素的内容或属性。 |
属性节点 | HTML 元素的属性,如 class 、id 、style 等。 |
修改元素的 class 或 id 属性。 |
文本节点 | 表示节点内的文本内容。 | 获取或修改节点内部的文本内容。 |
DOM方法与属性 | JavaScript 可以使用 DOM 方法来操作网页中的节点和元素。 | getElementById() 、innerHTML 等方法。 |
2.2.2 JavaScript验证用户名、密码的规则
在前端,我们可以通过JavaScript来实现基本的验证逻辑,确保用户输入的用户名和密码符合要求。在用户点击“登录”按钮后,系统将通过JavaScript脚本检查输入的内容。如果格式不符合预定规则,JavaScript将阻止表单提交,并提示用户进行修改。如果登录成功,则会回显“欢迎 + 用户名”
验证规则如下:
- 用户名不能为空;
- 密码不能为空;
- 密码至少6位;
我们将form20222409wqb.html改为如下demo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面</title>
<script>
// 验证表单
function validateForm() {
var username = document.getElementById("username").value;
var password = document.getElementById("password").value;
// 验证用户名不能为空
if (username == "") {
alert("用户名不能为空!");
return false;
}
// 验证密码不能为空,且密码至少为6位
if (password == "") {
alert("密码不能为空!");
return false;
} else if (password.length < 6) {
alert("密码至少为6位!");
return false;
}
// 成功验证后回显用户名
document.getElementById("welcomeMessage").innerHTML = "欢迎 " + username;
return false; // 防止页面刷新
}
</script>
</head>
<body>
<h2>登录</h2>
<form action="login.php" method="POST" onsubmit="return validateForm()">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required><br><br>
<input type="submit" value="登录">
</form>
<!-- 用户名回显区域 -->
<div id="welcomeMessage"></div>
</body>
</html>
用符合条件的用户名密码测试
图4:成功验证截图
用不符合长度的密码进行测试
图5:验证失败截图
2.2.3 尝试注入攻击:利用回显用户名注入HTML及JavaScript
在之前的代码中,我们没有对用户输入进行任何过滤,因此,攻击者可以在用户名框中输入包含HTML标签或JavaScript代码的内容。这样,当页面回显用户名时,这些代码也会被执行。
1. 利用回显用户名注入HTML
例如,如果用户在用户名输入框中输入以下内容:
<b>恶意用户名</b>
当表单提交并验证通过后,用户名会被回显到页面上,并且浏览器会解释<b>
标签,使得“恶意用户名”文字以加粗显示。
图6:恶意用户名注入HTML效果
2. 利用回显用户名注入JavaScript
在用户名输入框中,用户输入如下内容:
<img src='x' onerror='document.body.innerHTML = "恶意脚本注入成功!"'>
这里,我们使用的是一个 onerror 事件,它会在加载图片时触发。如果 src 是无效的(比如 x 这样的文件不存在),就会触发 onerror 事件并执行注入的 JavaScript 代码,将页面的内容修改为 "恶意脚本注入成功!"。
图7:恶意脚本注入JavaScript后页面的效果截图
现在,无论怎么前进、后退页面都回不去了(哦悲悲),最后刷新复原。
2.3 MySQL数据库的部署与基础操作实践
在本部分,我们将在Kali Linux系统中部署MySQL数据库,并通过一系列基础操作来掌握数据库的使用。具体操作包括安装MySQL服务器、启动MySQL服务、创建数据库和用户、修改密码、创建表格等。
2.3.1 安装与启动MySQL
1.启动mysql
Kali Linux自带MySQL,不需要安装
可以使用以下命令检查MySQL服务是否正在运行:
systemctl status mysql
如果MySQL服务未启动,可以使用以下命令启动:
systemctl start mysql
2. 登录MySQL
在Kali中,可以通过以下命令直接进入MySQL命令行:
mysql
成功登录后,将看到MySQL命令提示符
MariaDB [(none)]>
图8:MySQL成功启动
2.3.2 创建数据库与用户
1. 创建数据库
在MySQL命令行界面下,首先创建一个新的数据库。使用以下命令创建一个名为 20222409WQB 的数据库。:
CREATE DATABASE 20222409WQB;
可以通过以下命令查看当前数据库:
SHOW DATABASES;
2. 创建用户
接下来,我们将创建一个新的用户并为其设置密码。使用以下命令创建用户:
CREATE USER '20222409wqb'@'localhost' IDENTIFIED BY 'password123';
这个命令会在MySQL中创建一个名为 20222409wqb的用户,并为其设置密码为 password123。
创建成功后,你可以通过以下命令检查用户是否创建成功:
SELECT User FROM mysql.user;
3. 授权用户访问数据库
为使新创建的用户能访问并操作 20222409WQB 数据库,我们需要授予该用户权限:
GRANT ALL PRIVILEGES ON 20222409WQB.* TO '20222409wqb'@'localhost';
这将授权 20222409wqb 用户对 20222409WQB 数据库拥有所有权限。
4. 刷新权限
权限更改完成后,我们需要刷新权限使其生效:
FLUSH PRIVILEGES;
图9:创建数据库及用户,并授权用户
2.3.3 修改用户密码
如果需要修改某个用户的密码,可以使用如下命令:
ALTER USER '20222409wqb'@'localhost' IDENTIFIED BY 'new_password123';
此命令将 20222409wqb 用户的密码更改为 new_password123。同样,需要执行以下命令刷新权限:
FLUSH PRIVILEGES;
图10:修改用户密码
2.3.4 创建表
在数据库和用户设置完成后,我们可以在 20222409WQB 数据库中创建表。假设我们要创建一个存储用户信息的表格,表名为 wqb。
选择要操作的数据库:
USE 20222409WQB;
创建一个用户表(表名为 wqb):
CREATE TABLE wqb (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL
);
此命令会在 20222409WQB 中创建一个名为 wqb 的表,包含 id(自动增长)、username(用户名)和 password(密码)三个字段。
使用以下命令查看当前数据库中所有的表:
SHOW TABLES;
使用以下命令查看 wqb 表的结构:
DESCRIBE wqb;
图11:创建表
2.4 基于PHP的动态网页构建与数据库交互
在本部分,我们将通过编写一个简单的PHP网页,连接到MySQL数据库并实现基本的用户认证功能。我们将构建一个动态网页,用户可以通过输入用户名和密码进行登录。虽然认证过程简单,但可以通过表单和数据库的交互完成。
2.4.1 创建PHP文件
kali中已经自带了php。如果需要确认,可以执行以下命令检查安装状态:
apache2 -v
php -v
1. 创建PHP(20222409login.php)
我们首先创建一个名为 20222409login.php 的文件,用于接收用户的登录信息,并与数据库进行交互,验证用户名和密码是否匹配。
<?php
// 数据库连接信息
$servername = "localhost";
$username = "20222409wqb";
$password = "new_password123";
$dbname = "20222409WQB";
// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 检查是否通过 POST 提交
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$user = $_POST['username'];
$pass = $_POST['password'];
// 查询数据库验证用户
$sql = "SELECT * FROM wqb WHERE username='$user' AND password='$pass'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 登录成功,显示欢迎页面
echo "<h2>登录成功</h2>";
echo "<p>欢迎用户:<strong>" . htmlspecialchars($user) . "</strong></p>";
echo "<a href='form20222409wqb.html'>返回登录页</a>";
} else {
// 登录失败,提示错误信息
echo "<h2>登录失败</h2>";
echo "<p>用户名或密码错误!</p>";
echo "<a href='form20222409wqb.html'>返回重新登录</a>";
}
}
// 关闭数据库连接
$conn->close();
?>
2.4.2 测试PHP页面
1. 将PHP文件上传到Web服务器:
将上面的 20222409login.php 文件放置在Web服务器的根目录(var/www/html)下
2. 创建用户数据
在先前的数据库中,执行插入命令
MariaDB [20222409WQB]> INSERT INTO wqb (username, password) VALUES ('20222409test', 'wqbtest');
图12:创建用户数据结果
2.4.3 验证结果
- 确保form20222409wqb.html 和 20222409login.php 文件放置在 /var/www/html/ 目录下。
- 将form20222409wqb.html文件中,①action处的login.php改为20222409login.php;②将validateForm 函数的最后一行改成
return true;
,以允许表单提交,否则无法跳转到php界面 - 确保Apache服务已经启动
systemctl start apache2
打开浏览器,访问 http://localhost/form20222409wqb.html
,输入正确用户名和密码后点击登录按钮。
图13:登陆成功
输入错误的用户名密码则失败
图14:登陆失败
可见php的基本功能已经实现了。
2.5 SQL注入跨站脚与本攻击的基础测试与分析
2.5.1 SQL注入攻击测试
SQL注入是通过向应用程序的输入字段注入恶意SQL代码,绕过身份验证或操纵数据库的攻击方式。SQL注入的核心问题在于应用程序没有对用户输入进行严格的验证和过滤。
在前面编写的 20222409login.php 文件中,查询部分代码如下:
$sql = "SELECT * FROM wqb WHERE username='$user' AND password='$pass'";
$result = $conn->query($sql);
由于这里直接将用户输入拼接到SQL语句中,没有使用预处理语句,因此存在SQL注入漏洞。
在http://localhost/form20222409wqb.html的用户名和密码输入框中输入以下内容:
用户名: ' OR '1'='1' --
密码: anypassword
注入的SQL语句将构造如下逻辑:
SELECT * FROM wqb WHERE username='' OR '1'='1' -- ' AND password='anypassword';
由于 '1'='1' 始终为真,数据库将返回表中所有用户的数据,导致登录成功。
图15:SQL注入成功登录页面。
2.5.2 跨站脚本(XSS)攻击测试
跨站脚本(XSS)是一种通过注入恶意JavaScript代码,攻击用户浏览器的安全漏洞。攻击者可以通过XSS窃取用户的敏感信息(如Cookie)或劫持用户会话。
在用户名输入框中输入以下内容:
<script>alert('XSS攻击成功!');</script>
在密码框中输入任意值。
提交表单。由于系统未对输入进行过滤和编码处理,恶意代码会被回显到页面中并执行,弹出一个警告框
图16:XSS攻击成功,弹出JavaScript警告框。
2.6 DVWA与WebGoat平台的配置与漏洞攻击实战
2.6.1 环境准备与配置
1. 下载并安装phpstudy
官方链接:https://www.xp.cn/
进入链接,傻瓜式下载安装
2. 下载并安装DVWA
官方链接(https://www.dvwa.co.uk/)
进不去,我们换github:https://github.com/digininja/DVWA
将下载的DVWA文件夹解压到phpstudy根目录中。
将 config.inc.php.dist 复制一份或重命令为 config.inc.php
修改 config.inc.php 里代码如下
$_DVWA[ 'db_server' ] = '127.0.0.1'; #数据库地址
$_DVWA[ 'db_database' ] = 'dvwa'; #数据库名称
$_DVWA[ 'db_user' ] = 'root'; #数据库用户名
$_DVWA[ 'db_password' ] = 'root'; #数据库密码
3. 初始化DVWA
启动phpstudy,打开浏览器访问 http://localhost/dvwa/setup.php。
拉到下面,点击Setup/Reset DB,点击Create/Reset Database。会看到创建成功提示
4. 登录
浏览器打开 http://127.0.0.1/DVWA-master/login.php 登陆。(虽然我为了与pikachu区分,实际使用的是127.0.0.2)
默认用户名:admin,默认密码:password;
5. 设置安全级别
点击左侧标签DVWA security,将难度从impossible改为low,点击submit确认。
2.6.2 SQL注入实验
打开 DVWA 左侧菜单,选择 SQL Injection。
在用户名输入框中输入以下内容:
' OR '1'='1' --
点击提交按钮。
注入的SQL语句生成如下逻辑:
SELECT * FROM users WHERE username='' OR '1'='1' -- AND password='anypassword';
由于 OR '1'='1' 条件恒为真,攻击者绕过了认证,成功访问用户数据。
结果,页面显示了所有用户信息。
图17:SQL注入成功页面,返回了多个用户的数据。
2.6.3 XSS实验
打开 DVWA 左侧菜单,选择 XSS (Stored)。
在 Name 输入框中填写任意值,例如:
attacker
在 Message 输入框中输入以下恶意 JavaScript 代码
<script>alert('XSS攻击成功!');</script>
点击提交按钮,刷新页面。
注入的脚本未经过过滤直接存储到数据库中。刷新页面时,浏览器会执行注入的JavaScript代码,弹出提示框。
结果,页面显示弹出的JavaScript警告框。
图18:XSS攻击成功的弹窗。
2.6.4 CSRF实验
XSS是通过修改页面Javascript等代码后,发给用户从而实现盗取cookie信息,之后利用cookie进行登陆网站等操作。非法操作是黑客。
CSRF并没有盗取cookie信息,而是通过用户直接利用cookie进行操作。非法操作并不是黑客,而是用户本身。(csrf通常和xss联合利用)
打开 DVWA 左侧菜单,选择 CSRF。
修改密码为20222409
图19:正常修改密码
此时的网址为:(虽然前面写的网址为127.0.0.1,但我为了与pikachu区分,实际使用的是127.0.0.2)
http://127.0.0.2/vulnerabilities/csrf/?password_new=20222409&password_conf=20222409&Change=Change#
将password_new和password_conf里的20222409改为20222409wqb,直接跳转到该网址
http://127.0.0.2/vulnerabilities/csrf/?password_new=20222409wqb&password_conf=20222409wqb&Change=Change#
图20:用csfr方式修改密码
可以看到,右上角没有弹出更新密码窗口
进入test credientials
输入密码为20222409,登陆失败
图21:密码为20222409登陆失败
输入密码为20222409wqb,登陆成功
图22:密码为20222409wqb登陆成功
3.问题及解决方案
- 问题1:数据库中创建表失败
图23:数据库中创建表失败 - 问题1解决方案:mysql的表不能以数字开头,名字改为wqb
- 问题2:2.2.3中,输入框注入无反应
- 问题2解决方案:换一种注入方法,例如报告里用的onerror事件。当然,后续发现是因为验证函数最后一行设为了return false,来阻止表单提交。
- 问题3:简单sql注入后,页面既没有显示登陆成功,也没有显示登陆失败,显然不合逻辑
图24:sql注入失败 - 问题3解决方案:打印用户名、密码和生成的sql语句,发现没错误。接着用以下命令禁用sql严格模式,并且把注入语句从
' OR '1'='1'
改成' OR '1'='1' --
(--后有空格)注入就成功了。
SET GLOBAL sql_mode = '';
4.学习感悟、思考等
通过本次实验,我不仅深入理解了Web前后端的协作机制,也全面掌握了SQL注入、XSS攻击和CSRF攻击的实现原理及其防范措施。实验中,通过针对输入验证不足的攻击实践,我认识到未过滤用户输入是系统安全的重大隐患,而预处理、输出编码等措施在防御中不可或缺。同时,在调试和问题解决过程中,如SQL注入初期失败、HTML表单无法提交等问题,使我体会到对细节的关注和逐步排查的重要性。这些问题的解决也增强了我对数据库操作、前端验证与后端逻辑结合的整体理解。此次实验不仅提升了我的漏洞利用与防御技能,也强化了我对安全编码规范的认识,为今后设计更加安全可靠的Web应用奠定了坚实的基础。
参考资料
- PHP 表单与验证|菜鸟教程
- MySQL 教程|菜鸟教程
- HTML 教程
- HTML表单元素详解
- HTML表单提交与处理教程
- JavaScript初学者指南
- DOM简介与操作教程
- JavaScript 表单验证
- JavaScript事件处理教程
- PHP连接MySQL数据库
- SQL注入漏洞详解
- XSS攻击与防御指南
- DVWA安装指南
- DVWA下载、安装、使用(漏洞测试环境搭建)教程
- Linux下启动和停止apache服务
- GET和POST两种基本请求方法的区别
- 跨站脚本攻击XSS(最全最细致的靶场实战)
- 【DVWA靶场】3.1.SQL注入 黑客是如何窃取数据的?无孔不入的SQL注入
- DVWA靶场全关卡代码审计讲解,适合小白