深入浅出之跨站攻击(XSS)


随着网络应用的日益广泛,其中的安全问题也越来越不容忽视。在网络安全中占用重要地位的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,"<","&#x3C;"),replace(str,">","&#x3E;")。

         这里还有一条这类的测试语句:%3Cscript%3Ealert('XSS')%3C/script%3E。这个是利用字符的转换,把程序过滤的字符都转换成别的进制方式,当然防御就是把这些也过滤了。

二。已定义标记XSS

         这种攻击方式其实就是利用程序中已经存在的标记进行攻击,比如留言板中的UBB和邮箱中的插入功能。这里最常用的就是<img src="javascript:alert('xiaohun')" >这句代码,熟悉html的朋友知道<img src经常被我们应用来插入图片,在这里我们就是利用程序中各种插入的地方进行攻击。防御的方法也很简单,和上面的顾虑方法一样,把js和;过滤点。可是这样就能阻挡我们测试的脚本么?这种方式的XSS其实是最有意思也是最考研我们耐性的,因为它的转换方式是多种多样的。

我们依次看下面的几个测试语句:

<img src="javascrip&#116&#58alert(/xiaohun/)" > //这里是把关键地方转化为ASCLL进行测试

<img src="javas cript:alert(/xiaohun/)" >    //这里是在JS中加入空格进行测试

<img src=” &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105; &#112;&#116;&#58;&#97;&#108;&#101;&#114;& #116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;& #59;”/>       //这里是把关键地方转为&#十进制;形式进行测试

<img src=” &#x006A;&#x0061;&#x0076;&#x0061;&#x0073;&#x0063;& #x0072;&#x0069;&#x0070;&#x0074;&#x003A;&#x0061;&#x006C; &#x0065;&#x0072;&#x0074;&#x0028;&#x0027;&#x0058;& #x0053;&#x0053;&#x0027;&#x0029;&#x003B;”/>           //这里是&#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=# οnerrοr=alert("xiaohun")></img>

<a href=# οnmοuseοver=alert("xiaohun")></a>

        我们分析下这两句,就可以发现攻击者用空格分离了前面的src属性之后利用标记的事件机制启动他们的代码了,其实就是响应了发生的事件机制,上面一个例子利用的是错误机制,后面的一个当鼠标从上面滑过的时候触发。知道了原理就可以防御了,最简单的就是转换掉字符,也可以对提交的内容限制个字符串。

        三种攻击形式的XSS就分析到这了,文章虽然借鉴了一些XSS方面的材料,但还是写的比较乱,因为思路还不是很清晰,有的别的内容的XSS也没提到,比如 js方面的和URL方面的,毕竟才刚接触客户端脚本没多久,不可能写的那么全面。在这里要感谢颓废の傻鱼和雕牌两位大牛在XSS问题上对我的指导,使我在写这篇文章时能尽量少的出现错误,大家对于文章有什么问题也可以在我博客中提出来,虽然都是小菜,但我们可以一起讨论解决,毕竟多一个人就是多一个思路。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值