标签:xss
什么是xss
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。
XSS有哪些类型?
反射型:简单的描述就是把用户输入的数据反射给浏览器,这个数据可能是Html代码或者js代码,反射后让浏览器去执行。
存储型:把用户输入的数据(比如恶意的js代码)存储在服务器端,具有很强的稳定性,危害时间长。
DOM Based XSS:这种不是按照存储在哪里来划分的,可以说是反射型,由于历史原因,归为一类,通过改变DOM结构形成的XSS称之为DOM Based。
实际上,我认为xss主要可以分为:持久型xss和非持久型xss。
持久型xss就是将对客户端攻击的脚本植入到服务器上,从而导致每个正常访问页面的用户都会遭到这段xss脚本的攻击。
非持久型xss是对一个页面的url中的某个参数做文章,把精心构造的恶意脚本包装到url参数中,再将这个url散布到网上, 骗取用户访问这个url,从而对其进行攻击。
XSS的危害
1、劫持Cookie
2、构建Get和Post请求操作用户的浏览器,使用JavaScript模拟浏览器发包
3、XSS钓鱼
4、获取用户系统,浏览器信息
5、识别用户安装的软件
6、劫持浏览器回话,从而执行任意操作。
7、强制弹出广告页面,刷流量
8、获取用户真实ip
等等。。。。。。。。。。。。
XSS的触发条件
了解XSS的触发条件就先得从HTML(超文本标记语言)开始,我们浏览的网页全部都是基于超文本标记语言创建的。
而XSS的原理也就是往HTML中注入脚本,HTML指定了脚本标记<script>....</script>.在没有过滤字符的情况下,只需要保持完整无错的脚本标记即可触发XSS,假如我们在某个资料表单提交内容,表单提交内容就是某个标记属性所赋的值,我们可以构造如下值来闭和标记来构造完整无错的脚本标记,
"><script>alert(‘XSS‘);</script><"
"><script> onclick="alert(‘XSS‘)</script><"
结果形成了<A HREF=""><script>alert(‘XSS‘);</script> <"">Hahaha</A>
(假如做了一些过滤,还可以这样)
测试闭和表单赋值所在的标记,形成完整无错的脚本标记可触发XSS,但是没有脚本标记怎么触发XSS呢?呵呵,我们只好利用其他标记了,假如要在网页里显示一张图片,那么就要使用一个<img>标记,示例如下:
<img src=\‘#\‘" //safe.it168.com /x ss.gif">
img标记并不是真正地把图片给加入到Html文档把两者合二为一,而是通过src属性赋值。那么浏览器的任务就是解释这个img标记,访问src属性所赋的值中的URL地址并输出图片。问题来了!浏览器会不会检测src属性所赋的值呢?答案是否!那么我们就可以在这里大做文章了,接触过javascript的同志应该知道,javascript有一个URL伪协议,可以使用“javascript:”这种协议说明符加上任意的javascript代码,当浏览器装载这样的URL时,便会执行其中的代码.于是我们就得出了一个经典的XSS示例:
<img src="javascript:alert(‘XSS‘);">
当然并不是所有标记的属性都能用,细心的你应该发现标记的属性在访问文件才触发的XSS,这里我就不再深入,因为离开标记的属性还有事件能帮助我们触发XSS.那什么是事件呢?只有达到某个条件才会引发事件,正巧img标记有一个可以利用的onerror()事件,当img标记内含有一个onerror()事件而正好图片没有正常输出便会触发这个事件,而事件中可以加入任意的脚本代码,其中的代码也会执行.现在我们又得到了另外一个经典的XSS示例:
<img src=\‘#\‘" //x ss.jpg" onerror=alert(‘XSS‘)>
<img src=\‘#\‘" //x ss.jpg" onerror=alert("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")> 过滤了alert来执行弹窗
综合这一部分,我们知道XSS的触发条件包括:完整无错的脚本标记,访问文件的标记属性和触发事件。
预防措施
1、输入检测
对用户的所有输入数据进行检测,比如过滤其中的“<”、“>”、“/”等可能导致脚本注入的特殊字符,或者过滤 "script"、"javascript" 等脚本关键字,或者对输入数据的长度进行限制等等。同时,我们也要考虑用户可能绕开ASCII码,使用十六进行编码如“<</span>”(“<”)、“>”(“>”)等来输入脚本。因此,对用户输入的十六进制编码,我们也要进行相 应的过滤。只要开发人员能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就能够有效地阻止XSS攻击。
2. 输出编码
通过前面对XSS攻击的分析,我们可以看到,之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的HTML代 码的一部分。因此,当Web应用程序将用户的输入数据输出到目标页面中时,只要用HtmlEncoder等工具先对这些数据进行编码,然后再输出到目标页面中。这样,如果用户输入一些HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行。
3. Cookie防盗
利用XSS攻击,攻击者可以很方便地窃取到合法用户的Cookie信息。因此,对于网站来说,不能在Cookie信息中存放太多敏感信息,也不能将 Cookie作为身份认证的唯一标识,等等。因此,对于Cookie,我们可以采取以下的措施。首先,我们要尽可能地避免在Cookie中泄露隐私,如用 户名、密码等;其次,我们可以将Cookie信息用MD5等Hash算法进行多次散列后存放;再次,为了防止重放攻击,我们也可以将Cookie和IP进行绑定,这样也可以阻止攻击者冒充正常用户的身份。
4. 严格限制URL访问
攻 击者使用XSS攻击,通常都要借助于自己指定的网站页面,比如用它来记录敏感信息等等。因此,在页面的脚本代码执行过程中,只要我们 严格限制其访问的URL,比如只允许脚本代码访问本网站的URL等方式,就可以避免脚本的执行链接到其它可能是攻击者指定的页面上。
5 网站程序端
防范XSS攻击的一种方法是在服务器端采取防范措施。在大部分的跨站漏洞里,就是因为程序的过滤不严格,导致了攻击者可以在网站中加入“<”、“>”等字符,从而导致XSS攻击的产生.所以我们在程序的编写中就要强制过滤关键字,过滤“<”、“>”,把用户的输入放入引号内,以达到数据与代码隔离、过滤双引号,防止用户跨越许可的标记,添加自定义标记、过滤TAB和空格,防止关键字被拆分、过滤script关键字、过滤&#,防止HTML属性绕过检查.下面是一些实例
5.1 过滤“<”、“>”实例
攻击语句:<script>alert(/XSS/)</script>
防范方法:replace(str,“<”,“&#x3C;”)&#ascii
replace(str,“>”,“&#x3E;”)
注:script为服务器端语句,不进行ascii解释,用户输入的语句中含有“<”,“>”,都用&#x代替.所以过滤“<”、“>”基本可以防范跨站.&#(unicode编码的十进制数)是unicode的HTML表示方式
5.2 HTML属性过滤
上面的代码可以过滤掉“<”和“>”标记,让攻击者无法构造HTML标记.但是,有经验的攻击者就有可能会利用已存在的脚本属性来进行针对性攻击,假如攻击者利用插入图片功能,把图片的路径属性修改为一段script代码,也是可以达到跨站的目的的.
下面我们来用实例来演示如何防范运用插图片方式进行攻击的手法:
攻击语句:<imgsrc=“javascript:alert(/XSS/)”width=100>
很多的HTML标记里属性都支持“javascript:跨站代码”的形式,因此就需要对攻击者输入的数据进行如下转换
防范方法:replace(str,“javascript:”,“”)
replace(str,“jscript:”,“”)
replace(str,“vbscript:”,“”)
从而达到的效果是:用户输入的语句中含有“javascript”,“jscript”,“vbscript”,都用空白代替.从而让攻击者利用插入图片功能修改路径属性进行跨站攻击的企图失败
5.3 过滤特殊字符
因为HTML属性的值,是用可支持“&#ASCii”的形式进行表示的,所以攻击语句代码可变型为:
攻击语句:<imgsrc=“javascript:alert(/XSS/)”width=100> 这样就可以突破过滤程序进行跨站攻击.
其防范代码为: replace(str,“&”,“&”) 这个代码中把“&”替换为了“&”,后面的语句就变得没有意义了.
5.4 其他的方式绕过
过滤例如下面这段代码:
攻击语句:<imgsrc=“javascript:alert(/XSS/)”width=100>
注意中间的空格,此空格分隔了关键字,也就是说,对Tab键进行了拆分.这样就需要考虑把Tab空格过滤.
5.5 HTML属性跨站的彻底防范
就算是程序员考虑到了大多数的攻击方法,并做出了相应的过滤.攻击者也是有可能利用程序的缺陷进行攻击的.例如下面这两条语句实例:
<imgsrc=“#”style=“XSS:expression(alert(/XSS/));”>
<imgsrc=“#”/**/onerror=alert(/XSS/)width=100>
攻击者仍然可以绕过过滤进行XSS攻击,所以也要考虑到这种情况的防范.
XSS为什么真正的渗透过程中个很少用呢?
1、耗时间
2、有一定几率不成功
3、没有相应的软件来完成自动化攻击
4、前期需要基本的html、js功底,后期需要扎实的html、js、actionscript2/3.0等语言的功底
5、是一种被动的攻击手法
6、对website有http-only、crossdomian.xml没有用
这一篇文章很不错适合新手看 https://zhuanlan.zhihu.com/p/26177815
标签:xss
原文地址:http://dongxiaoyang.blog.51cto.com/12624314/1973270