上一次是反斜杠发挥的妙用,它默默地转义了一个双引号,还有一些其他有意思的符号,比如换行符也能发挥妙用,这次是来自换行符的一发偷袭。
看这样一个地址:
http://datalib.games.qq.com/cgi-bin/search?libid=178&FilterAttrAND=3602&FilterValueAND=aaaaaaaaaa
逐个测试注入点,我们发现最后的FilterValueAND 的输入点在源码中找到了输出点:
它出现在JS 语句里,一上来就感觉有戏。接下来尝试写入特殊字符,测试过滤情况。正常的情况下,尖括号,双引号:
但是令人奇怪的是,最后一个输出点竟然是在一大段注释里,这应该是开发的一个失误:
看到注释想到了什么呢?如果这里插进来一个换行符,那么应该被注释的部分就不是注释了。那后边再跟注入语句,就能够执行了。然后我们在用一个双斜杠来注释后边的无用部分。利用代码如下:
http://datalib.games.qq.com/cgi-bin/search?libid=178&FilterAttrAND=3602&FilterValueAND=%0aalert(/xss/);//
直接就弹窗了。
这一次利用的太过简单,看起来应该是开发的一时疏忽,将一大段内容注释了,而注释里原本好包含了输出,那就有可能出问题了。
看一下源码,先测试双引号,妥妥的被过滤,HTML标签里的东西没希望了。往后边看,第二个又出现在了注释里,看来开发还是很希望遗留这些漏洞的,我们直接用一个换行符。
但问题是注释那里被注释掉了,但是接下来的var searchOrder=”….”;这一句就麻烦了。
|
|
第一个是OK 了,第二个语法错误了。那么又想到什么了呢,在JavaScript 语法里,一个反斜杠可以让语法让换行的内容接起来,形成多行写法。
|
|
于是,语法上又恢复了正常,而这一部分内容我们不用管它,只要上一个有效就可以了。但问题是,反斜杠被过滤了,过滤的方法是被转义了。
两个反斜杠就没法让JavaScript成立了,怎么办呢?记得之前采用的宽字符的战术,看一眼网页的编码格式,gb2312,说明宽字节是有效的。那我们就用128以上的字符,去吃掉一个反斜杠:
从结果上看,%c0吃掉了一个%5c,留下了一个反斜杠。
语法完全ok, 于是弹窗。
至此,这种反射型的XSS 基本上就这么些内容了。想要挖XSS 的洞,非常的耗费功夫,因为即使是没有安全编码尝试的开发者,也基本知道一些必须过滤的字符一定要过滤,另外在PHP 这些语言中,也有专门的函数诸如魔术引号来过滤处理。
不过学习这种XSS 类型,将扩宽思路,不仅是从注入的角度来看,能想到各种有意思的注入和XSS 利用,更重要的是从安全编码的角度看待开发,如何保证代码的安全实际上是比效率更加重要的点。