XSS绕过<>进行测试

你们都知道,广泛的防护XSS攻击的方法是在后台对如下字符进行转义:<、>、’、”,可是通过本人的研究发现,在一些特殊场景下,即便对以上字符进行了转义,仍是能够执行XSS攻击的。html

首先看一个JS的例子:git

运行这段代码,结果显示以下:
程序员

看到这么熟悉的尖括号,你们会不会有一些兴奋的感受呢?JS代码中并无出现尖括号,但是运行时却输出了尖括号!!!这意味着:能够经过u003c和u003e来代替<和>。但是该如何利用这个特性来构造XSS攻击呢?继续看一个例子:github

运行上面代码,结果显示以下:json

在没有尖括号的状况下,成功实现了一个弹框的案例。安全

如今来设想一个更贴近实际开发状况的例子:
(1)这里咱们用网络安全攻防研究室网站首页进行演示:http://www.91ri.org/ main.html,其代码为:网络

(2)http://www.victim.com/getcontent返回的内容格式以下:异步

其中name的值是用户的昵称。xss

这个例子简单模拟了异步拉取信息并进行显示的状况。函数

如今假设用户的昵称为:

那么会是什么状况呢?
首先getcontent返回的昵称应该是这样的:

由于后台输出JSON格式数据时,通常都会在前面添加转义符进行转义。
接着main.html的callback函数应该是等价于执行下面的语句:

显示的结果以下:

很遗憾,没有弹出框。缘由是原来的转义序列u003c并无生效,被添加的转义符转义掉了。

不过这里假设返回昵称时对进行了转义,但实际状况下,有时输出json格式数据时是没有对进行转义的,那样就会触发漏洞。

对于有对进行转义的,这时就轮到咱们强大的半字符出场了。对于半字符的问题,这里并不打算详细讲,说下结论:
对于gb2312编码,” [0xc0] “是一个合法的编码,显示为:”繺”。
对于UTF-8编码,在IE6下,上述组合也是一个合法的编码。
其中[0xc0]表示一个十六进制的值。

如今修改昵称为:

getcontent输出:

因为半字符[0xc0]的存在,在解释上述JS代码时,等价于:

可见,转义序列u003c终于又回来了,显示结果以下:

上述昵称中并无出现单双引号,尖括号,因此若是后台只是对单双引号和尖括号进行转义,那么是能够被绕过防护的。
总结:

(1)  利用场景:输出内容在JS代码里,而且被动态显示出来(如使用innerHTML)。
(2)  测试方法:截获请求包,修改参数为:

(3)  防护方法:后台对半字符,反斜杠,单双引号,尖括号进行处理。

编辑点评:关于xss绕过的方式有不少,很多程序员以及小黑都认为过滤了<、>、’、”,就真的安全的,实际来讲,只要针对这些字符进行必定的转义,就能成功绕过!

相关文章
相关标签/搜索