javascript中的XSS跨站攻击
[ 2010-03-03 14:48:15 | 作者: admin ]
随着网络应用的日益广泛,其中的安全问题也越来越不容忽视。作为网络安全中占用重要地位的WEB安全也开始受到人们关注,作为一个好的网络安全维护人员,不仅要有扎实的理论知识,还要有充分的白盒黑盒测试经验,今天我们就从攻击的角度分析下WEB脚本安全中客户端脚本经常出现的攻击方式——跨站攻击(XSS)。
跨站漏洞出现在各个地方,其危害也越来越大,印象中08年在国内就曾掀起了一阵“跨站热”,多家著名网站程序和邮箱都受到了不同程度的攻击。那么跨站漏洞到底是怎么产生的呢?从攻击者的角度看,是攻击者提交的变量没有经过完整过滤Html字符或者根本就没有经过过滤就放到了数据库中,并且在一些地方又直接从数据库中取出来返回给来访问的用户,从而产生了跨站漏洞。而从程序员角度分析,则是由于编写程序时的一些失误,在代码解析成HTML的过程中被人利用,从而被攻击者构造合理的HTML代码闭合后然后就运行攻击代码。这种漏洞多出现于能输入和解析成HTML的地方,比如邮箱和留言板。这两个地方都允许使用html或者是提供了已存在的标签。
那我们怎么才能测试自己的网站到底存不存在跨站漏洞呢?有的书里把XSS分为入库型,非入库型和上传型来进行分析。而在本文中,我根据XSS攻击的特点,把XSS也分为三种,分别是自定义标记XSS,已定义标记XSS,其它类XSS(本人是小菜啊,自己觉得不错就这么分了,大牛们不要笑话我啊``)。下面我分别为大家分析下这三种XSS的攻击和防御方法。这里的代码都只分析弹出窗口,至于挂马代码等都是类似的。
一。自定义标记XSS
自定义标记XSS,顾名思义,就是我们自己构造HTML标记进行攻击,这个也是XSS中最简单的一种。而我们构造的标记就是<script>alert("xiaohun")</script>,这个语句我想大家都已经很熟悉了。这里的程序出现的问题就是直接没有过滤转换任何的html标记,当然这种情况现在很少了。更多的是在程序中我们的语句因为没闭合而没被执行。我们可以通过查看返回的源代码进行分析闭合。一般是在该语句的前后各加><这两个标记。类似的测试语句大家可以自己在网上找,这种我们就不多说了。
当然要防御也是很简单的,只需要在程序中构造正则表达式过滤点<>就可以了。如:replace(str,"<","<"),replace(str,">",">")。
这里还有一条这类的测试语句:%3Cscript%3Ealert(’XSS’)%3C/script%3E。这个是利用字符的转换,把程序过滤的字符都转换成别的进制方式,当然防御就是把这些也过滤了。
二。已定义标记XSS
这种攻击方式其实就是利用程序中已经存在的标记进行攻击,比如留言板中的UBB和邮箱中的插入功能。这里最常用的就是<img src="javascript:alert(’xiaohun’)" >这句代码,熟悉html的朋友知道<img src经常被我们应用来插入图片,在这里我们就是利用程序中各种插入的地方进行攻击。防御的方法也很简单,和上面的顾虑方法一样,把js和;过滤点。可是这样就能阻挡我们测试的脚本么?这种方式的XSS其实是最有意思也是最考研我们耐性的,因为它的转换方式是多种多样的。
我们依次看下面的几个测试语句:
<img src="javascript:alert(/xiaohun/)" > //这里是把关键地方转化为ASCLL进行测试
<img src="javas cript:alert(/xiaohun/)" > //这里是在JS中加入空格进行测试
<img src=” javascri pt:aler& #116;('XSS')& #59;”/> //这里是把关键地方转为&#十进制;形式进行测试
<img src=” javasc& #x0072;ipt:al ert('X& #x0053;S');”/> //这里是&#x十六进制;形式
<IFRAME SRC="<IMG src=1.jpg/**/STYLE=’xss:expre\ssion(alert("XSS"))’> //这里是利用到了CSS的注释符,在脚本中注释符中的内容可以忽略
以上的测试语句虽然不是很全,但是把能过滤的形式基本都考虑到了,对于不同的过滤程序我们可以采取不同的方法,这也就是这种XSS攻击方式的精髓所在。
在这里要特别提到一种方法就是拆分法,因为有的程序输入的内容有字符限制,我们的测试代码可能不能全部输入,在这里我们就可以应用eval()函数。例如javascript:alert(’xiaohun’)我们可以写为:a="javascript:"; ,b=""alert";,c="(’xiaohun’)";,eval(a+b+c);。在《精通脚本黑客》黑客中有关跨站的章节中有一篇类似方法的文章,大家可以自己看下。
三。其他类XSS
最后一类XSS其实就是除去以上两种的其它XSS攻击。这里我主要给大家讲两种,一个是js可以调用的一类,一个是事件机制响应的一类。
第一类的测试语句如下:
STYLE=’xss:expre\ssion(alert("XSS"))’
DYNSRC="javascript:alert(’XSS’)"
LOWSRC="javascript:alert(’XSS’)"
这三个代码懂JS的一看就明白,其实就是直接调用javascript:函数()的方式,大家可以看下JS的语法,我们自主调用的这些语句就能显示出我们的弹窗。
第二类的测试语句是:
<img src=# onerror=alert("xiaohun")></img>
<a href=# onmouseover=alert("xiaohun")></a>
我们分析下这两句,就可以发现攻击者用空格分离了前面的src属性之后利用标记的事件机制启动他们的代码了,其实就是响应了发生的事件机制,上面一个例子利用的是错误机制,后面的一个当鼠标从上面滑过的时候触发。知道了原理就可以防御了,最简单的就是转换掉字符,也可以对提交的内容限制个字符串。
三种攻击形式的XSS就分析到这了,文章虽然借鉴了一些XSS方面的材料,但还是写的比较乱,因为思路还不是很清晰,有的别的内容的XSS也没提到,比如js方面的和URL方面的,毕竟才刚接触客户端脚本没多久,不可能写的那么全面。在这里要感谢頹廢の傻魚和雕牌两位大牛在XSS问题上对我的指导,使我在写这篇文章时能尽少的出现错误,大家对于文章有什么问题也可以在我博客中提出来,虽然都是小菜,但我们可以一起讨论解决,毕竟多一个人就是多一个思路。
跨站漏洞出现在各个地方,其危害也越来越大,印象中08年在国内就曾掀起了一阵“跨站热”,多家著名网站程序和邮箱都受到了不同程度的攻击。那么跨站漏洞到底是怎么产生的呢?从攻击者的角度看,是攻击者提交的变量没有经过完整过滤Html字符或者根本就没有经过过滤就放到了数据库中,并且在一些地方又直接从数据库中取出来返回给来访问的用户,从而产生了跨站漏洞。而从程序员角度分析,则是由于编写程序时的一些失误,在代码解析成HTML的过程中被人利用,从而被攻击者构造合理的HTML代码闭合后然后就运行攻击代码。这种漏洞多出现于能输入和解析成HTML的地方,比如邮箱和留言板。这两个地方都允许使用html或者是提供了已存在的标签。
那我们怎么才能测试自己的网站到底存不存在跨站漏洞呢?有的书里把XSS分为入库型,非入库型和上传型来进行分析。而在本文中,我根据XSS攻击的特点,把XSS也分为三种,分别是自定义标记XSS,已定义标记XSS,其它类XSS(本人是小菜啊,自己觉得不错就这么分了,大牛们不要笑话我啊``)。下面我分别为大家分析下这三种XSS的攻击和防御方法。这里的代码都只分析弹出窗口,至于挂马代码等都是类似的。
一。自定义标记XSS
自定义标记XSS,顾名思义,就是我们自己构造HTML标记进行攻击,这个也是XSS中最简单的一种。而我们构造的标记就是<script>alert("xiaohun")</script>,这个语句我想大家都已经很熟悉了。这里的程序出现的问题就是直接没有过滤转换任何的html标记,当然这种情况现在很少了。更多的是在程序中我们的语句因为没闭合而没被执行。我们可以通过查看返回的源代码进行分析闭合。一般是在该语句的前后各加><这两个标记。类似的测试语句大家可以自己在网上找,这种我们就不多说了。
当然要防御也是很简单的,只需要在程序中构造正则表达式过滤点<>就可以了。如:replace(str,"<","<"),replace(str,">",">")。
这里还有一条这类的测试语句:%3Cscript%3Ealert(’XSS’)%3C/script%3E。这个是利用字符的转换,把程序过滤的字符都转换成别的进制方式,当然防御就是把这些也过滤了。
二。已定义标记XSS
这种攻击方式其实就是利用程序中已经存在的标记进行攻击,比如留言板中的UBB和邮箱中的插入功能。这里最常用的就是<img src="javascript:alert(’xiaohun’)" >这句代码,熟悉html的朋友知道<img src经常被我们应用来插入图片,在这里我们就是利用程序中各种插入的地方进行攻击。防御的方法也很简单,和上面的顾虑方法一样,把js和;过滤点。可是这样就能阻挡我们测试的脚本么?这种方式的XSS其实是最有意思也是最考研我们耐性的,因为它的转换方式是多种多样的。
我们依次看下面的几个测试语句:
<img src="javascript:alert(/xiaohun/)" > //这里是把关键地方转化为ASCLL进行测试
<img src="javas cript:alert(/xiaohun/)" > //这里是在JS中加入空格进行测试
<img src=” javascri pt:aler& #116;('XSS')& #59;”/> //这里是把关键地方转为&#十进制;形式进行测试
<img src=” javasc& #x0072;ipt:al ert('X& #x0053;S');”/> //这里是&#x十六进制;形式
<IFRAME SRC="<IMG src=1.jpg/**/STYLE=’xss:expre\ssion(alert("XSS"))’> //这里是利用到了CSS的注释符,在脚本中注释符中的内容可以忽略
以上的测试语句虽然不是很全,但是把能过滤的形式基本都考虑到了,对于不同的过滤程序我们可以采取不同的方法,这也就是这种XSS攻击方式的精髓所在。
在这里要特别提到一种方法就是拆分法,因为有的程序输入的内容有字符限制,我们的测试代码可能不能全部输入,在这里我们就可以应用eval()函数。例如javascript:alert(’xiaohun’)我们可以写为:a="javascript:"; ,b=""alert";,c="(’xiaohun’)";,eval(a+b+c);。在《精通脚本黑客》黑客中有关跨站的章节中有一篇类似方法的文章,大家可以自己看下。
三。其他类XSS
最后一类XSS其实就是除去以上两种的其它XSS攻击。这里我主要给大家讲两种,一个是js可以调用的一类,一个是事件机制响应的一类。
第一类的测试语句如下:
STYLE=’xss:expre\ssion(alert("XSS"))’
DYNSRC="javascript:alert(’XSS’)"
LOWSRC="javascript:alert(’XSS’)"
这三个代码懂JS的一看就明白,其实就是直接调用javascript:函数()的方式,大家可以看下JS的语法,我们自主调用的这些语句就能显示出我们的弹窗。
第二类的测试语句是:
<img src=# onerror=alert("xiaohun")></img>
<a href=# onmouseover=alert("xiaohun")></a>
我们分析下这两句,就可以发现攻击者用空格分离了前面的src属性之后利用标记的事件机制启动他们的代码了,其实就是响应了发生的事件机制,上面一个例子利用的是错误机制,后面的一个当鼠标从上面滑过的时候触发。知道了原理就可以防御了,最简单的就是转换掉字符,也可以对提交的内容限制个字符串。
三种攻击形式的XSS就分析到这了,文章虽然借鉴了一些XSS方面的材料,但还是写的比较乱,因为思路还不是很清晰,有的别的内容的XSS也没提到,比如js方面的和URL方面的,毕竟才刚接触客户端脚本没多久,不可能写的那么全面。在这里要感谢頹廢の傻魚和雕牌两位大牛在XSS问题上对我的指导,使我在写这篇文章时能尽少的出现错误,大家对于文章有什么问题也可以在我博客中提出来,虽然都是小菜,但我们可以一起讨论解决,毕竟多一个人就是多一个思路。
[最后修改由 admin, 于 2010-03-03 14:49:47]
评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=1352
这篇日志没有评论。
此日志不可发表评论。